̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ IT ニュース&コラム 2015/10/ 5 通巻697号 技術版 ソフトウェアデザイン館 Sage Plaisir 21  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄      ヨーダ記法で書くな (2) - リーダブル・コード(40) 前回に引き続き、読みやすさを取るか、安全性を取るか、という論点で議論に 「なりがち」なヨーダ記法ですが、今回は安全性について詳しく見ていくことに します。 ヨーダ記法のメリットは、下記のように、不具合を自動的にコンパイラーが検出 してくれるということでした。   if ( 10 = wallet ) {...} // コンパイル エラー:値に代入できない しかし、これは本当にメリットがあるのか、という話です。 前回、ヨーダ記法が読みにくい、といったことを「吾輩は猫である」で説明 しましたが、書くときも同様に主語を左に書くほうが書きやすいです。 つまり、 何も考えずにコードを書くと、   if ( wallet = 10 ) {...} // == ではない不具合が潜んでいる のように書くことが多くあり、不具合が発生することが多くなります。 だから、 このような不具合が発生しないようにと、ヨーダ記法で書くように気を付ける ルールが考案されました。 ところで、10 という数字を直接書いてしまうと、その数字の意味が分からない ことがあり、変数名やマクロ名で定数の意味を表現することがあります。 また、 定数ではなく変数と比較することもあります。 これらの場合、次のように シンボルとシンボルを比較するコードになるでしょう。   if ( wallet = price ) {...} これは、意味的にヨーダ記法ではないので、もしヨーダ記法を使うルールに 従う必要があるときは、次のように変更する必要があります。   if ( price = wallet ) {...} このように、わざわざ読みにくいヨーダ記法に変更したわけですが、残念ながら このコードは、コンパイラーが自動的に不具合を検出してくれません。 変数 price に、変数 wallet の値が代入できてしまうからです。 つまり、半分くらいの ケースでしか、ヨーダ記法によって安全であることを得られないのです。 効果がない変数と変数の比較はルールから除外し、定数と変数の比較のみに適用 するルールに変更したら、ルールを守る必要があるケースが減ったので良心的だと 思うかもしれません。 しかし、定数であるかどうかを調べることは少々厄介です。 なぜなら、変数を宣言に const がついているかを調べるために、コードを探さ なければならないからです。 最近は補完機能で const などの型がすぐに表示 されますが、それぐらい高度な環境では、if の条件式に代入があるときに、 自動的に警告してくれるものです。 C言語なら #define シンボルを大文字にしなければならないルールがよくあり、 大文字だけなら定数であると判断(推測)しやすいため、ヨーダ記法に従う ことは簡単でしょう。 目視でルールに従っているかチェックするときには、 「数字か大文字だけのシンボルが = の右にないこと」だけを見ていると思います。 本当に定数であるかどうかなんてチェックするのは大変なので、やってられません。 C言語以外では、定数が大文字だけとは限らないので、「数字が = の 右にないこと」しかチェックしないでしょう。 つまり、さらに、半分くらいの ケースでしか、ヨーダ記法によって安全であることを確保できないということ になります。 ちょっと待ってください。 ヨーダ記法のメリットは、不具合を自動的に コンパイラーが検出してくれるということでした。 しかし、ここまでヨーダ 記法に従う作業が発生していて、果たして自動的に不具合を見つけてくれていると 言えるのでしょうか。 私から見ればとても自動的とは言えません。 読みに くくなるデメリットを受けてまでもヨーダ記法にする価値があるのでしょうか。 靴下にモップを付けた偉大な発明品「靴下モップ」があれば、部屋を歩くだけで 勝手に部屋を掃除してくれる!盲点だった!すごい!と期待して買ったけど、 普段は部屋で椅子に座ったまま。 わざわざ歩き回らなければならない。 それに、靴下モップでベッドに乗るのは汚いからできないといったように、 行動範囲が狭くなるデメリットもある。 それでも、あのダサい靴下モップに わざわざ毎日履き替えますかと。 安全性の議論を行うときに、よく本質安全と機能安全を区別することが説明 されます。 本質安全とは事故の原因がそもそも発生しないようにすること、 機能安全は事故の原因が発生したときに対処することです。 この違いを語って いる人は、いかにも安全に関して詳しそうな感じを受けますし、本質安全が とれなくても、機能安全を追及することで少しでも安全なものにすることは よいことです。 しかし、一般に本質安全を実現するのは難しいため、 はなから本質安全の機能を探すことを省略したり、本当に本質安全が とれないのか十分に検証せずに、機能安全を追及する話が専門家ほど多く 見られます。 優先順位を逆転させて、機能安全だけで満足していては いけません。 もちろん、少しでも安全になるのであれば、その方法をとる のはよいことですが、本質安全も考えるべきです。 ヨーダ記法に従うルールを作ることは、機能安全だけの機能を作って満足 していることと同じ印象を受けます。 なぜなら、もっと効率的かつ 広範囲に安全にできる方法があるからです。 本当にそんな方法があるのか。 次回で説明します。 参考 リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック オライリージャパン ISBN-13: 978-4873115658 7.1章 条件式の引数の並び順 Yoda conditions - Criticism - Wikipedia https://en.wikipedia.org/wiki/Yoda_conditions 注目ニュース 一覧 ◇ スマホ向けアプリ Pokemon GO でポケモンが現実世界に近づいてきた。 http://weekly.ascii.jp/elem/000/000/370/370155/ … AR技術で、現実世界にポケモンを。 ◇ 約3万円でハイレゾ&ノイキャン! 新ウォークマンAをしゃぶり尽くす。 http://ascii.jp/elem/000/001/053/1053590/index-2.html … ついにハイレゾでもイコライザーが使えるように。 ◇ カタチは同じでも s シリーズ史上最大の跳躍。iPhone 6s が生み出す新たな潮流。 http://www.itmedia.co.jp/pcuser/articles/1509/22/news036_2.html … 3D Touch の魅力に徐々に気づき始めている。 ◇ niconico のiOS版アプリに脆弱性、アップデートとログインパスワード変更を。 http://internet.watch.impress.co.jp/docs/news/20150929_723191.html … パスワードを変更しないと、アカウントが乗っ取られるかも。 ◇ アマゾン、Apple TV、Google Chromecast を販売禁止に。 http://japan.cnet.com/news/service/35071333/ … 小売店のショップブランドの権利が強すぎないか。 ◇ 東京ゲームショウ2015 で見えてきた国産VRコンテンツの力と課題。 http://game.watch.impress.co.jp/docs/series/vrgaming/20150922_722210.html … PlayStation VR でバーチャル リアリティー。 ◇ 2ちゃんねる、まとめサイトを許諾制に 無許諾サイトには法的対応も。 http://www.itmedia.co.jp/news/articles/1509/25/news065.html … 権利を企業に渡すと、こんなにつけあがる。 ◇ 西村直人の ディーゼルエンジンで今何が起こっているか。 http://car.watch.impress.co.jp/docs/news/20150929_722917.html … NOxとPMに関するトレードオフの対策とも考えられる。 ◇ Windows 10 とプライバシー。マイクロソフトがデータ収集に関する詳細を明示。 http://japan.zdnet.com/article/35071162/ … デフォルトですべてのデータを送っている。 それができるアメリカは強い。 ソフトウェアデザイン館 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