読者です 読者をやめる 読者になる 読者になる

プログラマー幸福論

プログラム関係の雑記やcodicの開発日誌

なぜ Bool値を返すメソッドが3人称単数なのかを考えてみる

f:id:namba0219:20120530102829j:plain

Photo by TANAKA Juuyoh / 田中十洋

なぜ、Bool値を返すメソッドは、isEmptyexists のように動詞の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 / これがペンである間」となり、無限ループしそうですが、きれいな文章になります w。
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値を返すんだな」とすぐに分かる訳です。