̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ IT ニュース&コラム 2014/ 1/20 通巻653号 技術版 ソフトウェアデザイン館 Sage Plaisir 21  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 複雑な条件式は AND と OR だけにするな - リーダブル・コード(18) a == 0 && b == 0 のような AND 条件の論理演算子や、a == 0 || b == 0 のような OR 条件の論理演算子を組み合わせていけば、どんな複雑な条件も表現できると 思われているかもしれませんが、そうではありません。 確かに、Wikipedia の「論理演算」には、「二つの入力の論理演算の全ては否定(NOT)・ 論理和(OR)・論理積(AND)の演算を組み合わせて演算できる」と書かれていますが、 それは最低限必要な論理演算であるだけで、それらに対応する C 言語の演算子 !, &&, || をどのように組み合わせればよいかについては言及されていません。 読みやすいコードにするには、組み合わせをどのように表現すればよいのでしょうか。 (ここでは、&& や || の論理演算子のオペランドである「a == 0」や「b == 0」 の式のことを、条件式と呼び、「a == 0 && b == 0」などの式のことを複合条件式と 呼ぶことにします。 正式には、どちらも「式」という抽象的な用語しかありませんし、 複合条件式という用語の定義は状況によります。) AND 条件を表で表すと、次のようになります。 +---++---+---+ | || 0 | 1 | +===++===+===+ | 0 || 0 | 0 | +---++---+---+ | 1 || 0 | 1 | +---++---+---+ ここでは、1つ目の条件式が偽であれば 0 の行、真であれば 1 の行、2つ目の 条件式が偽であれば 0 の列、真であれば 1 の列であるとします。 たとえば、 「a = 0, b = 1」のとき、「a == 0 && b == 0」という AND 条件の複合条件式の 結果は、表の左下を見て、0(偽)になります。 1つ目の条件式で行を絞り込んで、 2つ目の条件式で列を絞り込む感じです。 OR 条件を表で表すと、次のようになります。 +---++---+---+ | || 0 | 1 | +===++===+===+ | 0 || 0 | 1 | +---++---+---+ | 1 || 1 | 1 | +---++---+---+ 「a = 0, b = 1」のとき、「a == 0 || b == 0」という OR 条件の複合条件式の 結果は、表の左下を見て、1(真)になります。 これですべでではありません。 NOT 条件を表で表すと、次のようになります。 +---++---+ | || | +===++===+ | 0 || 1 | +---++---+ | 1 || 0 | +---++---+ NOT だけは複合条件式ではありません。 では、どこに NOT を組み合わせればよいのでしょうか。 それは、1種類だけではありません。 条件式に NOT を付けることを、ここでは NOT B (not before) と呼ぶことにします。 たとえば、次のようなコードになります。 result = ! ( a == 0 ); 条件の結果に NOT を付けることを、ここでは NOT A (not after) と呼ぶことにします。 たとえば、次のようなコードになります。 result = ! ( a == 0 ); おっと、2つとも同じ式になってしまいました。 もう少し分解してみることにします。 NOT B(条件式に NOT を付ける)は、次のようになります。 if ( ! ( a == 0 ) ) { result = true; } NOT A(条件の結果に NOT を付ける)は、次のようになります。 if ( a == 0 ) { result = false; } NOT B と NOT A は、別のものです。 たとえば、条件式を含むある処理が「昼間なら窓を開ける」のとき、それに対応する NOT B は、「昼間でないなら窓を開ける」で、 NOT A は、「昼間なら窓を開けない」です。 「開ける」の NOT は、「閉じる」ではありません(これこそ論理的思考の難しいところです)。 この処理を適用する前提条件が、「窓が閉まっている」だったとしたら、 昼間になったどちらも「窓が閉まっている」ままですが、夕方になると、 NOT B では「窓が開いている」状態に変わり、 NOT A では「窓が閉まっている」ままになります。 違いますね。 コードでは、次のようになります。 // NOT B if ( ! ( a == 0 ) ) { OpenWindow(); } // NOT A if ( a == 0 ) { /* OpenWindow(); */ } // 無効なコードですが説明のため 複合条件式になると、それぞれの条件式の優先順位が問題になってきて、 NOT B と NOT A の違いが重要になってきます。 たとえば、「ボタンを押したら窓を開ける」よりも「ロックしていたら窓を開けない」 の方を優先するといったようなシステムを考えてみましょう。 AND と OR だけでコーディングすると、次のようになります。 if ( ! is_locked && is_button_pushed ) { OpenWindow(); } AND と OR だけでは、優先順位をうまく表現できませんし、NOT B しか表現できません。 特に NOT B しか表現できないことが、読みにくさを助長してしまいます。 つまり、NOT A である「ロックしていたら窓を開けない」が、NOT B である 「ロックしていなければ窓を開けられる」と等価であることをコーディングする前に 検証しなければなりません。 しかも、「開けられる」というのは、「開ける」ではないので、扱いが難しくなります。 当然、他の人がコードを読むときには、逆の検証をしなければならなくなります。 2つ程度の条件式なら、AND と OR だけでもコーディングできないことはありません。 しかし、もっと多くの条件式による判断が必要になれば、(NOT A が表現できない) AND と OR だけで表現することは、難しくなります。 コードで優先順位を表現するには、次のようにします。 上の方の if に書かれた条件式ほど、優先順位が高い条件になります。 // If button pushded, open window. if ( is_locked ) { is_open = false; } else if ( is_button_pushed ) { is_open = true; } else { is_open = false; } if ( is_open ) { OpenWindow(); } 参考: Wikipedia - 論理演算 2014年1月から、本メルマガは、隔週配信になります。 ニュース版、技術版のそれぞれが4週間隔になります。 注目ニュース 一覧 ◇ Excelシートが連係する業務をHTML-JavaScriptに変換でExcelいらずに。Excel to HTML。 http://www.publickey1.jp/blog/13/prexceltohtml1.html … Excel から Web システムを作成。 ◇ IntelのSDカード型コンピュータ Edison の詳細が判明。512KBメモリ、2GBストレージ、無線機能など。 http://pc.watch.impress.co.jp/docs/news/event/20140111_630478.html … IoT 市場をねらう Intel。 ◇ 既存Blu-ray もリッピング可能に。規格化が進む4K対応Blu-rayの意外な一面。 http://av.watch.impress.co.jp/docs/series/avt/20140114_630565.html … 違法動画ではできるどこでも再生できることに対抗。 ◇ DevOpsをVisual Studioでサポートしていく方針。マイクロソフト開発ツール製品の責任者に聞いた。 http://www.publickey1.jp/blog/14/devopsvisual_studio.html … 運用(Ops)側にとっては、頻繁にバージョン・アップしてほしくない。 ◇ さよなら 静かな講義室 iPadで実現した、会話が生まれる講義とは。 http://techtarget.itmedia.co.jp/tt/news/1401/14/news02.html … 会話といっても、iPad に向かって発音する。 ◇ 進化を続けるマイクロソフトのクラウド、Windows Azureのいまを知る。 http://www.atmarkit.co.jp/ait/articles/1401/10/news010.html … Windows Server より、Windows Azure の方が先行している。 ◇ ジョン・マカフィー氏、マカフィー ブランド終了を歓迎。「ずっと懇願してきた」。 http://www.itmedia.co.jp/news/articles/1401/08/news058.html … セキュリティ・ソフトへの怒りの矛先がマカフィー氏になっていた。 ◇ パナソニック、次世代スマートテレビ基盤に Firefox OS を採用へ。 http://news.mynavi.jp/news/2014/01/07/263/index.html … Android と互換はないが Android がベース。 Firefox OS の方が安心か。 ◇ ローソンの電子書籍サービス、エルパカBOOKS 終了。購入代金相当のポイント返金。 http://www.itmedia.co.jp/news/articles/1401/06/news054.html … 違法ながらも無料コンテンツに対抗するビジネスは難しい。 ◇ オウム裁判、テレビ番組を証拠採用 NHKが抗議へ。 http://www.asahi.com/articles/ASG1K3C6CG1KUTIL11G.html … 内部関係者からのリーク情報が得られにくくなる。 2014年1月から、本メルマガは、隔週配信になります。 ニュース版、技術版のそれぞれが4週間隔になります。 ソフトウェアデザイン館 Sage Plaisir 21 ホームページ >>> http://www.sage-p.com/ メルマガ >>> http://www.mag2.com/m/0000083983.html ブログ >>> http://blog.livedoor.jp/sage_p/ ツイッター >>> http://twitter.com/Ts_Neko ダウンロード >>> http://www.sage-p.com/freesoft.htm サポート掲示板 >>> http://www.sage-p.com/kg_ban09/z6037C8.cgi 東日本大震災 >>> http://www.sage-p.com/saigai.html メール >>> ts-neko◇sage-p.com ←◇を@に変えてください 緊急メールは件名に「うどんメール」を付けてください。 このメルマガの登録・解除 - http://www.mag2.com/m/0000083983.htm