Oct 08, 2008

メソッド名は三人称単数形にするべきかどうか

例えばW3C DOMでは、子ノードがあるかどうかを調べるメソッドの名前はhasChildNodes()(三人称単数形)だけど、子ノードを追加するメソッドはappendChild()(不定形、原形)となっている。どうしてこのようにバラバラなのか? どっちかに統一しないのか? という話。

Matz氏はRubyのメソッド名から三人称単数形を廃して原形に統一したいらしい。上に挙げたような例なら、hasChildNodesではなくhaveChildNodesという感じ。

日本語で書かれた命名規則の文書としては、ググってみたらOkapi Projectの命名規約というのが引っかかった。ここではブール値を返すメソッドは三人称単数形で始めるようにとされている。でも、「何故そう決めたのか」は書かれていない。

そもそも英語圏の人はどう考えてるんだ? と思って「naming convention verb method」とかでググってみたところ出てきたセントラルワシントン大学のドメインで公開されているJavaの命名規則のページには、こう書かれてた。

Begin method names with a strong action verb (for example, deposit).

(snip)

If the method returns a boolean value, use is or has as the prefix for the method name.

何の説明もなく、ブール値を返す物は三人称単数形で、そうでない一般的なメソッドは原形で例が挙げられている。何故そうなのか、ということが全く述べられていない。ネイティブスピーカーの人にとってこれらの使い分けはあまりに自明すぎて、敢えて説明する必要が感じられないということなのだろうか。

僕の場合は、自分でメソッド名を考える時も、Okapi Projectの規約とだいたい同じようなルールで考えてる。そしてこのルールは上記のセントラルワシントン大学のルールとも同じだ。深く理由を考えたことはなかったけど、どうしてこれで違和感が無かったのか、改めて考えてみた。

なんとなくだけど、何かをする系のメソッドを使った文、例えばparentNode.appendChild(newChild)だったら、これに対応する英文というのは Hey, you "parentNode"! Append "newChild" to yourself as a child! みたいな「命令文」で、状態を尋ねる系のメソッドを使った文、例えばsomeNode.hasChildNodes()だったら、対応する英文は He "someNode" has some child nodes. みたいな「普通の文」なんじゃないのかなー、と思ってる。逆に言うと、これらの英文を思い浮かべてコードを書くと、自然に、普通のメソッドは原形で状態を尋ねる系のメソッドは三人称単数形になるんじゃないのか、と。He "someNode" have some child nodes. とは書かないし。

そう考えると、Matz氏は「対応する英文」をイメージしないで単純に単語レベルでメソッド名を認識していて「原形と三人称単数形が混在してるのは統一感がない。メソッド名から三人称単数形を廃して原形に統一したい。」という風に考えてるんじゃないかなー、と、僕には思える。その発想が、ネイティブスピーカー的ではないんじゃないかなー、と。

僕は、メソッド名とかで英語を使うんだったらそれを母語としている人達の発想に一番しっくりくる命名規則を使うのが筋なんじゃないかと思う。ネイティブスピーカーがこれでイイって言ってんのに母語にもしてない日本人が「こうあるべきだ」と言っても説得力がない、と思ってる。日本人的・日本語的発想にこだわるんであればそれこそなでしこみたいに日本語ベースの言語にするのが筋なんじゃないの、と。

まあ、ここで参照した命名規則はJavaのものだから、上記の発想はあくまで「Java使いの英語ネイティブスピーカーの発想」とまでしか言えなくて、「大多数の英語ネイティブスピーカーの発想」がそうであるかどうかってのは分からないんだけども。

エントリを編集します。

wikieditish message: Ready to edit this entry.











拡張機能