メソッド名の三単現の s ちゃんと付けてる?

メソッド名をつける時に三単現の s をちゃんと付けることができているでしょうか? 今回は三単現の s をつけるかどうかの判断をクイズ形式で解説してみたいと思います。

次のオブジェクトのメソッド名で三単現の s をつける必要があるのものをあげて下さい。
  1. obja.equal(objb)
  2. file.write(data)
  3. flist.contain("bar.txt")
  4. flist.add("baz.txt")
  5. thread.start()



5 問目が少し難しかったかもしれません。 先に答えをいうと 1, 3 です。
それではこれから何故そうなるのか解説していきます。

三単現の s とは 「三人称単数の主語で現在形の場合には動詞の最後に s をつける」ことを意味します。
プログラミングにおいて 一人称(I)や二人称(You)はまず無いので三人称です。 また過去や未来も無いため現在です。
さらにメソッドを呼び出すオブジェクトは常に単数です。 ファイルリストのファイルのように複数の場合もあると思われるかもしれませんが、 呼び出しているのは入れ物であるコンテナークラスのオブジェクトなので、やはり単数です。
そのため、オブジェクトが主語となる場合は必ず三単現の s が付きます。


結局のところ、三単現の s をつけるかどうかの判断のポイントになるのは オブジェクトが主語かどうかです。

1 問目は三単現の s がつく代表的なものです。
"obja.equal(objb)" → 「 obja objb と等しい」
ととれるので、呼び出しオブジェクト(obja)が主語であり、 正しくは equals となります。



続いて 2 問目。
"file.write(data)" → 「 file data を書き込む」
という意味になります。こちらはオブジェクト(file)は書き込む対象であって主語ではありません。 そのため、 write には s は付きません。

では、この文の主語は何なのでしょうか?
この式が書かれているクラスやプログラムと捉えることもできますが、 それだと三単現の s が必要になります。 私(I)というのも変です。
実際、ネイティブの人がどう感じているのかは本当のところはわかりませんが、 おそらくこれは命令文です。
命令文は You が省略されている形ですが、犬やロボットにも命令はします。 ここではプログラムが命令される対象でしょう。


オブジェクト指向言語は命令型言語であり、命令を書いていくことによってプログラムを作ります。
そのため、 1 問目のようにオブジェクトが主語となるの方が例外的で、 bool 値の状態を返すメソッドに限られます。 equals はオブジェクトが等しいかどうかを知るためのメソッドで何かを実行したりはしません。
機能としては疑問文の方が適切に感じるかもしれませんが、 これらのメソッドは if 文に書くことが多いので、 疑問形でなくてもわりと自然です。
if (obja.equals(objb))
    doSamething();
ただし、疑問文形式にできる例外的な言語もあります。
それは Ruby で、メソッド名に ? を使うことができます。 equal? , contain? , empty? のようなメソッド名となり、 三単現の s は付けません。これはおそらく does, is などの省略だと思います。



問題に戻って、 3, 4 問目です。
  flist.contain("bar.txt") → 「 flist  "bar.txt" を含む」
  flist.add("baz.txt")     → 「 flist  "bar.txt" を加える」
同じクラスのメソッドなので、より違いが分かりやすいかと思います。 contain の方のみオブジェクトが主語になっていて、状態を返すメソッドです。 add はそのままなのに対し、 constains となります。



最後の 5 問目は、 start が他動詞、自動詞のどちらにもなれるので、次の 2 つとも文章として成り立ちます。
  thread.start() → (a)「 thread  始まる」
                 → (b)「 thread  始める」
しかし、ここまで読まれた人にはどちらなのかは、すぐわかると思います。
プログラムに何かさせたい場合は命令文です。よって (b) となり、三単現の s は付きません。

thread が始まっているかどうかの状態を知りたい場合には isStarted() となります。
ただ、 スレッドには、始まったけど終わっていたり、中断していたりと多くの状態があるので、 getState() のようなメソッドで状態をとって、 isStarted() のメソッドは無いのが普通です。

問題では三単現の s のメソッドに限ってますが、 isEmpty, isOpened のようなものも状態を返すメソッドの仲間であり、 be 動詞の三人称単数現在の形になっています。
これらはいわゆる Getter の一種です。 ただ、 getState() のように getXxx() そのものは「XXX をオブジェクトから取得する」となるので、 三単現の s は付きません。


関連記事
スポンサーサイト
Prev.    Category    Next 

Facebook コメント


コメント

コメントの投稿

Font & Icon
非公開コメント

このページをシェア
アクセスカウンター
アクセスランキング
[ジャンルランキング]
コンピュータ
35位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
6位
アクセスランキングを見る>>
カレンダー(アーカイブ)
プルダウン 降順 昇順 年別

05月 | 2017年06月 | 07月
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -


はてな新着記事
はてな人気記事
ブロとも申請フォーム
プロフィール

yohshiy

Author:yohshiy
職業プログラマー。
仕事は主に C++ ですが、軽い言語マニアなので、色々使っています。

はてブ:yohshiy のブックマーク
Twitter:@yohshiy

サイト紹介
プログラミング好きのブログです。プログラミング関連の話題や公開ソフトの開発記などを雑多に書いてます。ただ、たまに英語やネット系の話になることも。