shiodaifuku.io

isHogeはbooleanのgetterにつける名前であって、オブジェクトの属性につける名前ではない

この記事はしおだいふく Advent Calendar 2020 15日目の記事です。

プログラミングをしている人であれば、どこかで一度くらい isHoge という名前のなにかを見たことがあると思います。 これを呼ぶと概ねboolean値が取得できると思います。(その言語における真偽値に相当する何かを返さないisHogeはただちに爆破してください)

ところで、このisHogeですが、booleanを返すところならどこでも使って良いと思われているフシがあります。 isHoge(Hogeの部分には状態を表すなにかが入る) はbooleanのgetter用の名前であって、オブジェクトの属性につける名前ではありませんし、 ましてや独立した関数につける名前でもありません。

この記事の内容は僕のお気持ち表明であり、これを守っていないからどうだということはありませんが、 普通にコードを読んでいて気持ち悪くなるのでやめてほしいです。

isHogeのあるべき姿

isHogeはbooleanのgetterです。 次のようなコードは(英語の文法として)正しくisHogeが使われている例です。

 if (user.isActive()) {
  // ......
 }

isHogeはbooleanのgetterなので、以下の要請をすべて満たしてほしいです。

  • booleanを返す
  • (booleanを返すために複雑な計算をするかもしれないが)副作用がない
  • 関数呼び出し時に引数を取らない

オブジェクトのフィールドに直接アクセスするタイプの言語では、そのフィールド名をisHogeとするのは許容できます。 しかし、後述するようにDBにそのままの名前で入れるのはやめてほしいです。

僕がやめてほしいのはこういうやつです。

 // どこからともなく現れるisActive(user: User)関数
 if (isActive(user)) {
  // ......
 }

もう語順がめちゃくちゃで見るに堪えないです。

データベースに保存するなら尚更気をつけろ

データベースに保存する値のboolean値フィールドにisHogeを使うのはやめてほしいです。 あくまで状態はhogeであって、そのgetterに付ける名前がisHogeです。

これを守らない場合、主な害としてはクエリが気持ち悪くなります。

// キモい
SELECT * FROM USER WHERE is_active = true

// 明らかにクソ
SELECT * FROM USER WHERE is_active IS true

そんなに変わらないけど、以下のほうがちょっとマシにみえませんか?

SELECT * FROM USER WHERE active = true
SELECT * FROM USER WHERE active IS true

命名は難しい

ここに書いた話は絶対に守らないとダメというわけではない1ですが、 このへんに気を遣えない人が書くコードはだいたいクソなので、そういう人はお願いですから僕の前に現れないでください。

boolean値を返す関数になんて名前をつけるかは本当に難しいのですが、その悩みを理解してくれる人が好きです。

余談

当たり前かもしれませんが、英語がネイティブなエンジニアが書くコードはこの辺の扱いが非常に上手ですね。 僕が見たクソみたいなタイプのisHogeを書いたエンジニアはだいたい変な教育を受けたか、教育を受けずに現場に出て見様見真似でそれっぽいことをやってるおっs(以下略)


  1. もちろん細心の注意を払った上で、どうしてもやんごとなき事情により渋々使うこともあるという意味。無節操にisHogeを使うやつは許せん。

最新記事

  1. Cloud RunでgRPC streamingができるようになったので動かしてみたりした
  2. 2020年の執筆業まとめ
  3. アーキテクチャを設計する仕事とは
  4. 決済システムを設計するときに忘れてはならないたった1つの大切なこと
  5. third-party cookieと2020年