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(以下略)
- もちろん細心の注意を払った上で、どうしてもやんごとなき事情により渋々使うこともあるという意味。無節操にisHogeを使うやつは許せん。↩