宣伝。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。
以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能!
例えば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使いの英語ネイティブスピーカーの発想」とまでしか言えなくて、「大多数の英語ネイティブスピーカーの発想」がそうであるかどうかってのは分からないんだけども。
こんにちは。
メンバ関数の命名規則については、関数を説明する英文から以下のような解釈ができるそうですよ。
http://www.aerith.net/design/bool-j.html
ほほう。
This method is to be called to *append* a child. / This method is used to *append* a child.
This method returns true if it *has* child nodes.
確かにこの説明だとスッキリしますね。
自分がよく見てるドキュメントだと、
getData: Retrieves the data for a given type, or an empty string if data for that type does not exist or the data transfer contains no data.
( http://developer.mozilla.org/En/DragDrop/DataTransfer )
という書き方(セクションのタイトルが主語で、続きの文章がそのまま来る)がよくあるため、紹介していただいたページに書かれているような発想が無かったです。
自分は、そのメソッドが使用されるコンテキストの違いだと思うんですよね。
真偽値型のメソッドっていうのは、往々にして if 文や while 文のカッコ内で使われることが多いと思うんですよ。
if (parent.hasChildNodes()) { print(parent.childNodes.count(); } みたいに。
その場合って、英文にすると
if parent has some child nodes, print (his) child nodes' count.
みたいな感じで、最終的に長い命令文の文章で完結すると思うんです。
日本語で例えるならば「【同情する】(平叙文) なら【金をくれ】(命令文)」みたいなパターン。
だから、普通のメソッドが命令文で、真偽値を返したり状態をあらわしたりするメソッドが平叙文なのには意味があると思ってます。
>>
状態を尋ねる系のメソッドを使った文、例えばsomeNode.hasChildNodes()だったら、対応する英文は He "someNode" has some child nodes. みたいな「普通の文」なんじゃないのかなー
<<
Ruby はそういうメソッドには '?' を付けるので、
He has some child nodes.
(普通文)ではなくて、
Does he have some child nodes?
(疑問文)ではないでしょうか。
なんとなくだけど、何かをする系のメソッドを使った文、例えばparentNode.appendChild(newChild)だったら、これに対応する英文というのは Hey, you ”parentNode”! Append ”newChild” to yourself as a child! みたいな「命令文」で、状態を尋ねる系のメソッドを使った文、例
is~ は be~ になるんでしょうかと一瞬思ったのですがRubyだと ~? だから問題ないのですね。
素人考えだけれど。何の説明もなく、ブール値を返す物は三人称単数形で、そうでない一般的なメソッドは原形で例が挙げられている。何故そうなのか、ということが全く述べられていない。ネイティブスピーカーの人にとってこれらの使い分けはあまりに自明すぎて、敢えて説明する必要が感じられないということなのだろうか。
- outsider reflexオブジェクト指向においては,メソッドはレシーバに対する「指令」と考えられる(だよね?)。命令法をとるのはとても自然な発想だろう。現代英語において命令法は直説法現在不定形と同じ形に収斂してしまっているので判別しづらいが,例示されているものは不定形ではなく命令法だと思われる。たとえば,仮にラテン語をベースに言語設計していたら,appendē になっていたんじゃないかな(現在不定形 appendēre)。
じゃあブール値はどうなのか。思想の一貫性を重視すれば tellWhetherItselfIsX という命令法を取るはずだが,前半が欠落してしまっている。……まあ,A.tellWhetherItselfIsX より A.isX の方が見た目にわかりやすいしタイプ量も少ないし。
集合名詞が主語の場合
それを、ひとかたまりのものと見なす時は単数形
構成する個々の人、物を意識する時は複数形
として扱います。
メソッド名が3人称単数形になっている場合は
そのレシーバを、ひとかたまりのものとして
捉えているんじゃないかと思います。
の末尾に2020年11月30日時点の日本の首相のファミリーネーム(ローマ字で回答)を繋げて下さい。例えば「noda」なら、「2008-10-08_naming.trackbacknoda」です。これは機械的なトラックバックスパムを防止するための措置です。
writeback message: Ready to post a comment.