boolean literalとの比較 (== false
)、私は通常NGとします(jsみたいな特殊な言語を除く)。
C言語時代はバグの温床、昨今の言語でも冗長表記として忌避されます(lint設定として用意されているのを目にします)。
冗長であることの問題は、結局のところひとつ余分な思考ステップが追加されるのでコードリーディングを少し遅くさせること、1ステップ分が不具合を生みやすくすること、と考えます。
余分な思考ステップ
言語を読み慣れてコードを英語的に読めるようになってくると、という前提付きですが、
boolean literalを使わない場合、「(比較の)対象が真の状態か、偽の状態か(または是か非か)」を直接思い浮かべるようになってきます。
一方boolean literalを使うと、1) 「比較の結果がtrue/falseであり」2)「なので対象はこの状態」という思考ステップをいつまでも強いるように感じます。
下記で私はそれを体感するのですが、いかがでしょうか。
assert(
alice.has(hat) &&
!alice.has(sunGlasses) &&
alice.has(dresses) &&
!alice.has(rings) &&
alice.has(shoes)
)
assert(
alice.has(hat) == true &&
alice.has(sunGlasses) == false &&
alice.has(dresses) == true &&
alice.has(rings) == false &&
alice.has(shoes) == true
)
余談的考察と感想
if sum(a, b) == c
のような比較、これは「処理結果」を何かと比較するつもり、で書きます。
boolean literal を使って比較文を書くのは(== true
)、同じ感覚で書いているのかな、と想像します。
「それとは別の感覚でも読み書きできるんですよ」、というのが伝わればいいな、というのが今回の記事に込めた希望です。