はじめに
プログラムを書く上で可読性は非常に重要です。
「リーダブルコード」が多くのエンジニアに支持されているように、他者と開発する上では「いかに理解しやすいコードを書くか」が求められています。
そこで、プログラミングの基本である条件分岐について高校数学で学習する「ド・モルガンの法則」を使った可読性を向上させるテクニックを紹介します。
可読性の高いプログラムを書きたい方はもちろん、「大人になってから数学なんて役に立たない」と思っている方にもぜひ一読いただけたら幸いです。
ド・モルガンの法則とは
本題に入る前にド・モルガンの法則を初めて聞く人や忘れてしまった人のために簡単におさらいします。
ド・モルガンの法則とは、2つの集合A,Bに対して以下が成り立つことを言います。イギリスの数学者オーガスタス・ド・モルガンさんが発案したことからその名が付けられています。
\overline{A \cup B} = \overline{A} \cap \overline{B}
\overline{A \cap B} = \overline{A} \cup \overline{B}
この式を日本語にするとそれぞれ次のような意味になります。
- 『「A または B」でない』 は 『「A」でない かつ 「B」でない』に等しい
- 『「A かつ B」でない』 は 『「A」でない または 「B」でない』に等しい
どうでしょう、ここまでの説明で理解いただけましたでしょうか?
おそらく初めて聞く人にはまだ理解することは難しいと思うので、ぜひ次のようなベン図を書いてご自身で一度考えてみてください。
いかがでしょうか?
初見の方は理解ができなかったかもしれませんが、聞き覚えのある方はベン図を見ればすぐに思い出したかもしれませんね。
ド・モルガンの法則についてのこれ以上細かい説明はこの記事では省略するので、これでもまだわからない方は検索して調べてみてください。
ド・モルガンの法則をプログラムに応用する
それでは実際にド・モルガンの法則を使って条件分岐の書き換えを行ってみましょう!
例えば以下のようにaとbの値によって処理を変える条件分岐について考えてみます。
※説明のため極端にわかりづらい例を挙げていますのでご容赦ください
if !(a != 10 && b != 20)
上記の条件分岐を日本語にすると以下のような意味になります。
もし「aが10でない かつ bが20でない」でない場合
まるで「もう恋なんてしないなんて言わない」のように、読み手からしたら「結局どっちなの!?」と戸惑ってしまいます。
こんな分岐を見たら思わずPCを投げ出したくなる方もいるかもしれません。
「でない」という否定が多重になっていることが読み手を混乱させてしまう大きなポイントです。
それではこの式をド・モルガンの法則を使って書き換えてみましょう。
今回は先ほど紹介したド・モルガンの法則の2つの式のうち以下の式を適用します。
\overline{A \cap B} = \overline{A} \cup \overline{B}
ぜひご自身でも先ほどの条件分岐をどのように書き換えることができるか考えてみてください。
↓書き換え後の結果はこちらです
じゃん!
if (a == 10 || b == 20)
どうでしょう!先ほどよりも随分すっきりした感じはありませんか??
先ほどとは全く同じ条件分岐の結果となりますが可読性に雲泥の差があることは一目瞭然です。
このように実際にド・モルガンの法則を使うことで条件を変えることなく読み手にとって理解しやすい分岐に書き換えることができました!
今回は解説のため極端な例を紹介しましたが、実務でも意外と同様のパターンは散見されるため実装時やコードチェック時は意識していただくと良いと思います!
余談
※ここからはほとんどrubyの話になります。
多くの言語では条件式をif
とelse
で記載しますが、rubyの場合はif
とtrue/falseが反対となるunless
という修飾子が存在します。
例えば以下の式はaが10でない場合にtrueとなります。
unless a == 10
上の例だと伝わりづらいですがif
よりもunless
を使った方が可読性が高くなる場面は多いです。
しかし、unless
で複数の条件式をANDやORで繋げてしまうとさきほどの例のように可読性が低くなってしまう傾向があるので、条件式が複数になる時は素直にif
を使う方がおすすめです。
unless
からif
への書き換えは本記事で紹介したド・モルガンの法則を使って考えると導きやすくなるので、特にRubyを使う方はこれらの知識を身につけておくと役に立つと思います!
unlessからifへの読み替えについてより詳しく知りたい方は以下の記事が参考になります。
また、Ruby以外の言語でも条件分岐はつきものなので、ド・モルガンの法則やベン図を活用することでより可読性の高いコードを書く意識を持っていただくと良いと思いました。