この日記は私的なものであり所属会社の見解とは無関係です。 GitHub: takahashikzn

!(A || B) ではなく (!A && !B) と書くべき

コーディングをしていて、こういうケースって非常によくありますよね。

void method(Object arg0, Object arg1) {

    if (!((arg0 == null) || (arg1 == null))) {
        ...
    }
}

(以下、この書き方を「最後に否定」パターンと呼ぶ)


このコードは、こう書くこともできます。

void method(Object arg0, Object arg1) {

    if ((arg0 != null) && (arg1 != null)) {
        ...
    }
}

(以下、この書き方を「その都度否定」パターンと呼ぶ)


この2つはそれぞれ、脳内で次のように展開されるわけです。

  • 最後に否定パターン:「arg0がnullか、またはarg1がnull」でない…?
    • → えーと、ド・モルガンの法則で変換してと…ああ、要するに「arg0がnullでなく、かつarg1がnullでない」ってことか。
  • その都度否定パターン:arg0がnullでなく、かつarg1がnullでない。


人間の脳は論理演算を自動的に行えませんから、普通は「最後に否定パターン」は結局「その都度否定パターン」へと変換する必要があるのです。
これは明らかにコードの可読性を下げる要因となりますので、僕は「その都度否定パターン」を常に使うべきだと考えています。


もちろん世の中には「最後に否定パターン」を変換なしで解釈できる方もいますが、
仕事ではそういう方を基準にコーディングすべきではないです。