Bool値を返すメソッドは
なぜ3人称単数なのか
Bool値を返すメソッドが、isEmpty や exists のように動詞の3人称単数(-s)なのかについての考察です。こういう主題の記事は、あちこちで見るのですが、もっとうまく説明できないものか、自分でも書いてみたくなったので記事にしてみました。
最初に断っておきますが、この記事では「なぜそういう慣習ができたのか」ということをほぼ僕の想像で書いています。なので1つの考え方だと思って読んで頂けたらと思います。
isXXX
まずbe動詞のisXXX の形がBool値を返す理由から説明します。中学校で習った誰もが知っているであろう文章「This is pen」でメソッドを作ってみます。
this.isPen();
「This is pen / これはペンです」 と説明しているだけで、全くBool値を返す気配がありませんね。疑問形(Is this pen?)であれば、まだわかりますけどね…。
そこで、このメソッドを if 文の条件として使うことを考えてみると、わかり易くなります。
if (this.isPen()) { // Do anything. }
「if this is pen. / もしもこれがペンならば」ときれいな文章になります。条件と分岐の関係が自然に表現されていて、とても読みやすいプログラムです。じゃぁBool値を返さない場合どうなるのか、ちょっと試してみます。
if (this.isPen().equals("OK"))) { // Do anything. }
「if this is pen equals “OK”」となって、変な文章になります。
きれいな英文にするには、Bool値(if で評価できるもの)を返すしかなさそうです。
そもそもBool値を返すメソッドが、何に使われるかを考えてみると、こんな感じで、if などの条件として使われることが多いんじゃないかと思います。なので、Bool 値を返すメソッドは、外部から使われることを想定していて、外から使われた時に、プログラムがきれいな英文になるようにネーミングする慣習が生まれたんじゃないのかな?というのが私の考えです。
ここまで if で説明してきましたが、if だけではありません。whileでも同じです。
while (this.isPen()) { // Do anything. }
「while this is pen / これがペンである間」となり、無限ループしそうですが、きれいな文章になります。if や while, until, unless などが接続詞というのがミソですね。プログラム言語ってよく設計されているなぁーと今更思ってしまいます。
一般動詞の3人称
次は、equalsのような一般動詞の3人称のケースです。先ほどの is の場合は、そもそも原型の am を使う慣習がないので、簡単に説明できたのですが、一般動詞の場合は原型も普通に使うので、どうして3人称単数は Bool値を返し、1人称はそうではないのかという疑問が生まれます。
とりあえず、こやつも if 文で使うことを考えてみます。
if (this.equals("A")) { // Do anything. }
「if this equals “A” / もしもこれが”A”ならば」ときれいな文章になります。それでは、なぜ equal ではなく3人称の equals なのでしょうか。私はこういう風に考えるようにしています。
– 自己完結するケース
下記のような自己完結するメソッドの場合、load を動かしているのは、this と考えます。あなたから見たら this は第三者ですが、ここでは自己完結していて、第三者的な視点は不要なので、1人称となります。
this.load();
– 自己完結しないケース
次に、下記のプログラムのように自己完結しない、 if などに組み込まれるケースを考えてみます。自己完結していないということは、この if 文を動かす第三者的な視点が必要になります。if 文に使われているイメージですね。なので3人称になります。
if (this.equals("A")) { }
まぁ、どうにでも解釈できますね…。
だから混乱を防ぐために、「誰かが、3人称は Bool値を返す目印とすることにした」というところが実際のところじゃないかなと思います。同じメソッド名で、内部的な状態をBool値で返すメソッドと、そうではないものが混在していると、ソースが読みにくいですからね。3人称になっていれば、「あぁ Bool値を返すんだな」とすぐに分かる訳です。