コーディングをしていて、こういうケースって非常によくありますよね。
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でない。
人間の脳は論理演算を自動的に行えませんから、普通は「最後に否定パターン」は結局「その都度否定パターン」へと変換する必要があるのです。
これは明らかにコードの可読性を下げる要因となりますので、僕は「その都度否定パターン」を常に使うべきだと考えています。
もちろん世の中には「最後に否定パターン」を変換なしで解釈できる方もいますが、
仕事ではそういう方を基準にコーディングすべきではないです。