Java
プログラミング
英語
English
命名規則

Boolean型の変数名・メソッド名に主語を含めたい時はどうしたらいいか

More than 1 year has passed since last update.


前提

Javaを中心に考えています。

他の言語でも大体成り立つ話になるとは思いますが、Rubyとかは怪しいです。


基本のおさらい

Boolean型の変数名・メソッド名には、以下のような名前がいいと一般的に言われています。

・isEmpty

・canRead

・hasChanged

・exists

これらの名前はif文の中で特に効果を発揮します。

例えば、

if (list.isEmpty()) {

doSomething();
}

と書けば、以下のような英文に非常に近く、とても読みやすいわけです。

"If the list is empty, do something."

変数名の場合でも同様です。

if (isEmpty) {

doSomething();
}

この場合、主語が略されていると考えれば自然に読めます。

"If (it) is empty, do something."


問題定義

では、この主語を略したくない場合はどう命名したら良いでしょうか。

今回は例として、「ユーザーが存在するかどうか」を表すローカル変数について考えます。

先程と同じ理屈で言えば、

"If the user exists, do something."

if (userExists) {

doSomething();
}

となりそうですが、実際のところどうなのかを調べていきます。

また、あるオブジェクトに関するメソッドについても、主語が別に必要な場合があります。

例えば、「JTableオブジェクトについて、セルが選択されているか。」「行が選択されているか。」「列が選択されているか。」を表すメソッド名はそれぞれどうあるべきでしょうか。

これらの主語はJTableオブジェクトではなく、セル/行/列です。

"If a cell is selected (at the table), do something."

if (table.cellIsSelected()) {

doSomething();
}

となりそうですが、これも実際どうなのかを調べていきます。


調べた結果

「ユーザーが存在するかどうか」については、以下の2通りの命名が見つかりました。

・existsUser

・userExists

前者は予想していたのと語順が逆になっています。

これは例えばcodicで採用されている方式でした。

「ユーザーは存在するか」と打ち込むと、「exists_user」と出てきます。

後者は予想通りですね。

例としては、Stack OverflowのBoolean method naming readabilityというトピックで最も推されていました。

ちなみにGitHubのコード検索では「existsUser」より「userExists」の方が圧倒的に多くヒットします。

他にも色々見た結果、なんとなくですが主流は「userExists」の方と言えそうです。

それと「セル/行/列が選択されているか。」については、実際にJava(Swing)のJTableに存在するメソッドなのでそちらを確認しました。

それぞれ以下のように命名されています。

・isCellSelected(), isRowSelected(), isColumnSelected()

これも予想と語順が逆ですね。


existsUser派についての解釈

おそらく「Boolean型の変数名・メソッド名は動詞(or 助動詞)で始める」というルールを重要視しています。

このルールを守るために、英文っぽく読むことは諦めて語順をひっくり返す必要があったのでしょう。

その結果が「existsUser」であり、「isCellSelected()」というわけです。

ルールを統一することによる可読性の向上か、英文らしく読めることによる可読性の向上か、どちらを取るかの問題と言えるのではないでしょうか。


userExists派についての解釈

上で挙げたStack Overflowのトピックでは、やはり「英文として自然に読める」ことが命名の理由になっていました。

英語ネイティブの人たちはそっちの方を重要視している印象です。

ここで疑問なのは、同じくネイティブの人たちが作ったであろうJavaのAPIにおいて、なぜ「cellIsSelected()」ではなく「isCellSelected()」が採用されているのかです。

これは仮説ですが、cellは主語ではなく複合動詞の一部として認識されているのかもしれません。

if (table.isCellSelected()) {

doSomething();
}

"If the table is cell-selected, do something."

という感覚です。

他にも以下の場合なら

if (imageReader.isRandomAccessEasy()) {

doSomething();
}

"If the image reader is random-access-easy, do something."

となります。

日本語で言えば、「もしもイメージリーダーが"ランダムアクセス容易"であるなら、…」と言ったところでしょうか。

不自然なのは重々承知ですが、あくまでプログラミング言語を英語"風"に綴りながら、オブジェクトを主語とする形は崩したくない、という感覚でこういう命名をしているのではないかと私は考えました。


まとめ

どう解釈するかはともかく、

・userExists

・isCellSelected()

の方式がそれぞれよく使われているようなので、そのような命名がオススメです。