ド・モルガンの法則とは?条件分岐をシンプルにする考え方【実務で使える】

スポンサーリンク

はじめに

条件分岐が複雑になって、「自分でも読みにくいな…」と感じたことはありませんか?

特に、否定(!)が絡んだ条件は一気に分かりづらくなりがちです。

「基本情報の勉強でも出てきてなんとなく知っているけど、実務でどう使うのかイメージしづらい」——そんな方に向けて解説します。

この記事では、ド・モルガンの法則の基本と、実務での使いどころを分かりやすく解説します。


ド・モルガンの法則とは

ド・モルガンの法則は、19世紀のイギリスの数学者オーガスタス・ド・モルガンが提唱した、論理式の形を別の形に書き換えるルールです。

基本情報技術者試験でも登場する内容ですが、ポイントはシンプルです。

  • AND(かつ)OR(または) に変える
  • OR(または)AND(かつ) に変える
  • 全体の否定(!)を、それぞれの条件の否定(!)に分ける

式で書くと次のようになります。

!(A && B)  →  !A || !B
!(A || B)  →  !A && !B

AB は「何らかの条件」だと思ってください
(例:システムでいうと「ログイン済みである」「管理者である」など)


ベン図でイメージする

ベン図を使うと、直感的に理解しやすくなります。

この図は、「AかつB(重なっている部分)」以外を表しています。

つまり、次の3つの領域が含まれます。

  • Aだけに当てはまる
  • Bだけに当てはまる
  • AかつBに当てはまらない

別の角度から見ると、!A(Aではない領域すべて)と !B(Bではない領域すべて)を「または(||)」で合わせた範囲、と考えることもできます。この2つの見方が同じ形になることが、ド・モルガンの法則の核心です。

つまりこの図は「!A || !B」と全く同じ意味になります。

式の見た目は違いますが、ベン図で表すと同じ形になります。「書き換えている」というよりも、「同じ意味を別の読みやすい形で言い換えている」イメージです。

なぜ条件分岐は分かりにくくなるのか

条件分岐が分かりにくくなる原因のひとつは、「外側についた否定(!)」です。

例えば、次のようなコードを見てください。

if (!(A && B)) {
    // 処理
}

このように外側に ! がついていると、

  • 「AかつBでない、ってどういう意味だっけ?」と頭の中で反転させる必要がある
  • 条件の意図が直感的に読み取りにくい

という状態になります。初心者はもちろん、慣れたエンジニアでも一瞬止まる書き方です。


ド・モルガンの法則で書き換えてみる

この条件は、ド・モルガンの法則を使うと次のように書き換えられます。

変換のイメージ(疑似コード):

!(A && B)
→ !A || !B

Javaで書くと:

if (!A || !B) {
    // 処理
}

外側にあった ! が、それぞれの条件に分かれることで、

  • 条件が分解され、一つひとつの意味が読み取りやすくなる
  • 「Aが成立しない場合」「Bが成立しない場合」をそれぞれ独立して読み取れる

この「分解」が、コードの可読性(読みやすさ)の向上につながります。


実務でよくあるパターン

実務では、条件が増えるにつれてコードが急激に読みにくくなることがあります。

例えば、次のようなケースです。

if (!(user.isSales() && user.isActive() && !user.isDeleted())) {
    // 処理
}

これをド・モルガンの法則で書き換えると、次のようになります。

if (!user.isSales() || !user.isActive() || user.isDeleted()) {
    // 営業担当でない、またはアクティブでない、または削除済みの場合
}

書き換え後は、「営業担当でない」「アクティブでない」「削除済みである」という3つの条件が個別に読み取れるようになります。

なお、!user.isDeleted() の否定は user.isDeleted()! が消える)になる点に注意してください。二重否定(!!)にならないよう気をつけましょう。


なぜ実務では条件が複雑になるのか

そもそも、なぜこのように条件が複雑になるのでしょうか。よくある原因としては次のようなものがあります。

  • 手動登録によるデータミスや表記揺れ
  • 修正できない過去データへの対応
  • 仕様変更や例外ケースの積み重なり

本来はシンプルに書けるはずの処理でも、こうした要因によって例外が少しずつ増えていきます。その結果、条件が増え、ネストが深くなり、意図が分からなくなる——という状態になりがちです。


【重要】よくある間違い

ここで、よく混同されやすい書き方を確認しておきましょう。

次のコードを見てください。

if (!A && !B) {
    // 処理
}

一見似ていますが、これは !(A && B) とは全く別の意味になります。

意味
!(A && B)!A || !BAとBが同時に成立しない(どちらか一方がダメならOK)
!A && !BAもBもどちらも成立しない(両方ダメな場合のみ)

具体的な例で確認してみましょう。

例)A=true(ログイン済み)、B=false(管理者ではない)のときなどで置き換えてください

!(A && B)
→ !(true && false)
→ !(false)
→ true(条件成立)

!A && !B
→ (not true) && (not false)
→ false && true
→ false(条件不成立)

同じ状況でも結果が逆になります。条件の厳しさが全く違うので、混同しないよう注意しましょう。


まとめ

ド・モルガンの法則は、「コードを分かりやすくするための道具」としても活用できます。

  • 外側の ! は読みにくい → 分解して内側に移す
  • 条件を分解すると、一つひとつの意味が読み取りやすくなる
  • 似ている式でも、意味が全く違うことがある(!(A&&B)!A&&!B は別物)

なお、ド・モルガンの法則で条件を分解した後、エラーケースを先にreturnする「ガード節」と組み合わせると、さらに読みやすいコードに整理できます。これは別の記事で改めて解説予定です。

このあたりを意識するだけでも、コードの可読性は大きく変わります。


おわりに

実際に自分も、コードレビューでこの考え方を指摘されて初めて「ここで使うのか」と気づきました。

基本情報で学んだ内容が、実務で思いがけず役立つこともあります。そのときの体験は、別の記事でまとめています。

基本情報で覚えたド・モルガン、実務で出てきて震えた話

コメント

タイトルとURLをコピーしました