😂

論理否定演算子(!)はつらいよ・・・

2021/12/02に公開

想い

論理否定演算子!は極力使わないで欲しい(コーディングとして書かないで欲しい)
なぁというお話です。

何がつらいの?

// 否定演算子を使った表現パターン
val result_1 = !bool
val result_2 = !(x == 1)
val result_3 = !isOk()
val result_4 = "A" !in collection

こうして並べると特段感じないかもしれませんが、実務で数百、数千のようなソースコードを読んでいる途中にいきなり出てきたときに!をそこにあるものとをして見逃さずに認識するのって割とつらいよなぁ・・・と私は思いました。急いでいたり、集中力が削がれた状況ではなおさらです。
(※実際に私自身は実務で自分以外の人が書いたソースコードの!が認識から外れてバグを作りこんだ経験があります。)

どうしたらいいのだろう?

!という省スペース過ぎて目立たない演算子で表現されていることが問題だと思うので
もう少し目立つ表現を導入してやればよいのだと思います。

fun not(bool: Boolean): Boolean {
	return bool.not()
}

kotlinにはBooleanの組み込み関数としてnot()が用意されているのでそれを使っています。
それをそのまま使えばいいような気もしますが、否定するということを条件のあとに認識する場合、前の条件を再度思い返す必要があり、条件を読む前から否定することを知っている方がコードを読む際の負荷が少ないと私は思います。

上記のnot関数で書き換えてみると

val result_1 = not(bool)
val result_2 = not(x == 1)
val result_3 = not(isOk())
val result_4 = not("A" in collection)

処理としては一見無駄なことを取り入れているように見えますが、コードの可読性を高めるという点で今回のように言葉(単語)として説明的になるような表現を導入することは高い効果を発揮してくれると思います。

まとめ

自身が読むときもそうですが、自分以外の誰かがコードを読むことを常に意識して、少しでも間違わずに把握してもらえるような工夫というのはとても大事だなぁと本件を振り返りながら再認識しました。

※追記
ちょっと調べてみたら同じようなことを思っている方がいらっしゃいました。
https://qiita.com/sdkei/items/ca15188832fb4c002363

※みんさんの素敵なアイデアも是非気軽にコメント等で教えていただけるととても嬉しいです。

Discussion