ド・モルガンの法則 をプログラムで使う

ド・モルガンの法則。

情報技術に関わるなら一度は聞いたことのあるド・モルガン先生が考えた法則。
これが、プログラムやデータベース操作では、たまに使える。

まれに、下記のようなことがある。
(*今回、プログラムはJavaScriptの文法で書いています。)

if(word != null && word !="") {
	search()//処理A
}else{
	setDefault()//処理B
	search()//処理A
}

処理Aが検索、処理Bがデフォルト値設定。

・もともと、wordがnullでなく空でもないなら検索する予定だった。
・しかし、nullや空ならデフォルト値を設定して検索することになった。
みたいなパターンでとりあえず対応したりすると上記のようなコードになる。

(今回は、見れば分かるような条件だが、他人が作ったコードで何がどうなってるか分からない複雑な条件分岐で、あまり変更したくない時とか、とりあえずになっちゃう時がある・・・)

しかし、これだとifの条件に関わらずsearch()が実行されるのは分かり切っているので、とりあえず外にだす。

if(word != null && word !="") {
	//何もしない
}else{
	setDefault()//処理B
}
search()//処理A

すると、何もしない条件文になったりする。

しかし、これはifとelseと条件を否定でひっくりかえせばifだけでよくなる。のでとりあえずやってみる。

if (!(word != null && word !="")) {
	setDefault()//処理B
}
search()//処理A

さて、ここまでは問題ない。

しかし、この条件では、「nullでないかつ、空でない場合でない場合に・・・」ってなんじゃこりゃ!!

なんとか、すっきりさせたいけど、条件をしっかり整理しないといけないし、これが複雑な条件だと結局テストする羽目になり、

「めんどくせ。これでいいや。」

となります。

そんな風に、否定の否定の~ってなった時こそ、ドモルガンチャンス!!

ド・モルガンの法則 をJavaScriptで表すと下記のような感じ。

!(P || Q) == !P && !Q
!(P && Q) == !P || !Q

さて、これを使ってさっきのを加工すると。

if (!(word != null && word !="")) { //以下略

否定で括って && を || にする。

if (!( !(word == null || word == "") )) { //以下略

で、否定の否定って肯定だから、! が二つで打ち消しあう。

if (word == null || word == "") { //以下略

すぱらしいシンプル!

今回みたいな簡単なパターンならいいんだけど、色々と仕様が変わって複雑化して、
もう、なにがなんだか分からん状態のときにも、信頼して使える。

ちなみに、3つでも4つでもOK。
さらに、真偽をひっくりかえして論理和と論理積をひっくりかえすだけなので、そもそも否定じゃなくてもOK。

ド・モルガンの法則は偉大なり。

 

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>