イノベーション エンジニアブログ


株式会社イノベーションのエンジニアたちの技術系ブログです。ITトレンド・List Finderの開発をベースに、業務外での技術研究などもブログとして発信していってます!


このエントリーをはてなブックマークに追加

今更あえて真偽値を返す関数の命名について

どうも、bigenです。
語り尽くされた話題だとは思いますが、真偽値を返す関数の命名についてあえて考えてみようかと思います。

2.本編

2.1 2つの原則について

いろいろな話題がありますが、よくよく全体を追ってみると大きく2つの原則に分かれることが分かります。

まずみなさんに質問ですが、「xxxが空かどうか」という関数はどのように命名しますか?
これは(ほぼ)すべての人が isEmpty() と答えると思います。

これを題材に2つの原則について考えます。

2.1.1①仮定文から命名

まずは「命名は英語の仮定文に基づく」派です

例えば、isEmpty() については「もし○○が空ならば」を英訳すると「if xxx is empty, …​」となり、これをもとに命名するという発想です。
これは、例えば

if (file->isEmpty()) {
  doSomething();
}

のように、if文の中でオブジェクトのメソッドとして使われる場合を考えると、疑問文がほぼそのままの形ででてきており直感的に理解しやすいですね。

2.1.2 ②疑問文から命名

次に、「命名は英語の疑問文に基づく」派です

例えば、 isEmpty() については「○○は空か?」を英訳すると「is xxx empty?」となり、これをもとに命名するという発想です。

2.2 使い分け

どちらも発想としては自然ですし、読みやすい命名につながることが多いです。
しかし両方を使い分けないと、どちらかの原則にこだわってしまうと却って可読性を落とす命名となるケースがあります。

2.2.1 xxxが存在するか? (動詞が自動詞のとき)

定番の命名問題ですが、これは①の原則に即して命名するのが一般的です。
①の原則に沿うと、「if xxx exists, …​」となり、exists()と命名します。

これを②の原則に沿うと、「does xxx exist?」となり、 doesExist()と命名することになりますが、あまり見かけませんね
単に長くなっているだけで、 Exists() と比べて特別読みやすいわけでもありません。

2.2.2 yyyが選択されているか?(主語が変わるor明示的でない場合)

例えばSpreadSheetのような表オブジェクトを考えた時、「セルが選択されているかどうか?」を命名するにはどうすればいいでしょうか?

①の原則に沿うと、「if cell is selected, …​」となり、 cellIsSelected() と命名することになります。
これまで主語は省略していましたが、主語が変わる場合は省略できません。
この時、「関数名は動詞から始めたほうが自然である」という別の原則が働き、②の原則が採用されることが多いようです。

②の原則に沿うと、「is cell selected?」 となり、 isCellSelected() と命名することになります。
これなら動詞から始まっていて自然な感じがするでしょうか。

2.2.3 xxxはyyyを持っているか?(have, has系

「hageがhairを持っているかどうか?」という関数を命名するときはどうでしょうか。

①の原則に沿うと、「if hage has hair, …​」となるので、 hasHair()と命名することになります。

一方、②の原則に沿うと「does hage have hair?」となるので、 doesHaveHair()と命名することになります。
これも、2.2.1と同様に長ったらしいだけなので①が使われることがほとんどです。

2.3 どちらの原則にも則さない変なやつ

ここまでを読んでいただけると、この2つの原則は かなりうまく 命名をできるので、ほとんどこれでいけそうな気がします。
しかし、どちらの原則にも当てはまらない(しかし一般的によく使われてる)ものがあります。

有名な命名問題として、「ユーザーが存在するかどうか」という関数の命名があります。

①の原則に沿うと「if user exists, …​」となり、 userExists()と命名することになります。
②の原則に沿うと「if does user exist, …​」となり、 doesUserExist() と命名することになります。

これまでの流れ的に userExists()が自然かと思うのですが、なんと海外では existsUser()派が結構いるそうです。
【参考】 Boolean型の変数名・メソッド名に主語を含めたい時はどうしたらいいか

記事では

おそらく「Boolean型の変数名・メソッド名は動詞(or 助動詞)で始める」というルールを重要視しています。
このルールを守るために、英文っぽく読むことは諦めて語順をひっくり返す必要があったのでしょう。

と考察してますが果たして・・・

3. まとめ

いろいろな記事を読んでいると、
「①が原則で、例外として②みたいなやつがいる〜」派と、
「②が原則で、例外として①みたいなやつがいる〜」派がいましたが、
どちらも英語としては自然で区別する必要はないように見えます。

①または②のうち、短く読みやすいものを場合によって選択する、というのが一番柔軟で実用的だと思いますので、
苦手な方はまずはこのフレームワークをインプットするといいのではないでしょうか!

それでは!