̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ IT ニュース&コラム 2015/ 9/ 7 通巻695号 技術版 ソフトウェアデザイン館 Sage Plaisir 21  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄      ヨーダ記法で書くな (1) - リーダブル・コード(39) 読みやすさを取るか、安全性を取るか、という論点で議論に「なりがち」な ヨーダ記法について詳しく見ていくことにします。 ヨーダ記法とは、if 文の条件式を書くときに、「変数 = 値」ではなく、「値 = 変数」の順に書くことです。 これによって、(= が常に代入であるプログラ ミング言語で)、等号(==)で書くべきところを代入(=)で書いてしまったら、 コンパイル エラーで自動的にミスが見つかるというメリットがあります。 if ( wallet == 10 ) {...} // wallet の値が 10 であるかどうかの比較 if ( wallet = 10 ) {...} // wallet に 10 を代入して、条件は常に真(0以外) if ( 10 = wallet ) {...} // コンパイル エラー:値に代入できない(ヨーダ記法) if ( 10 == wallet ) {...} // wallet の値が 10 であるかどうかの比較(ヨーダ記法) パッと見て読みにくいと感じる人が多いと思いますが、ヨーダ記法の議論をして いると、なぜ読みにくいのか分からなくなってくることがあります。 なぜなら、 等号の左と右は数学的に入れ替えが可能だから、というのが理由です。(交換法則 ではありません) 数学的に正しいのだから、交換して書いても何の問題もないというのは、乱暴な 法則の適用です。 まず、読みにくいかどうかは、数学的な話ではありません。 数学的な話であれば、wallet 変数に格納されている値と、プログラムに記述 された値 10 だけに限っています。 if ( wallet == 10 ) と書かれたコードも if ( 10 == wallet ) と書かれたコードも、プログラムが動作する上で全く 変わらない、ということが数学的に証明されている、ということだけです。 値の比較に関してのみ常に成立する法則であって、読みやすさに関して成立する 法則ではないのです。 入れ替えると読みにくいと感じるのは、= の左と右で同じではないからです。 もし、左と右で同じことが書いてあれば、入れ替えても読みにくくなることは ありません。 if ( wallet == 10 ) // (A) 財布に入っている金額と10円という金額が等しいなら if ( 10 == wallet ) // (B) 10円という金額と財布に入っている金額が等しいなら if ( wallet == 10 ) // (C) 財布に10円入っているなら if ( 10 == wallet ) // (D) 10円が財布に入っているなら コメント (A), (B) は、左も右も金額について書いているので、(A) のヨーダ記法 である (B) でも読みにくいことはありません。 しかし、(A) は、金額である ことをいちいち細かく言及されているために難しい感じがします。 一般的には (C) の読み方や話し方をします。 所有関係の状態について書くだけで、金額が 等しいことまで伝わるからです。 (C) のヨーダ記法である コメント (D) は、 うまく表現できません。 あえて書いておきましたが、いくつも小銭があるうちの、 10 円玉があるかどうか、100円玉が入っていても真、という意味に変わって 読めてしまいます。 「A は B である。」という文において、A と B は等しくありません。 「吾輩は猫である」と言ったとき、「猫は吾輩である」とは言えませんし、 「吾輩と猫は等しい」とも言えません。 if 文を読むときは、ほとんどのケースで、 「A が B であるなら」と読みます。 仕様書に書いてある条件も、「A が B で なければならない」のような、関係の状態について述べた書き方をしています。 なぜなら、関係の状態について書くだけで、関係だけでなく、等しいことまで 伝わって効率がいいからです。 仕様書は、等しいことについて書いていない ことが圧倒的に多いです。 「吾輩(の生物の種類)は猫である」なら、 「猫は吾輩(の生物の種類)である」、「吾輩(の生物の種類)と猫は等しい」と 言えますが、書かれていない()の部分まで読み取る習慣があるでしょうか。 リーダブルコードの本では、左に調査対象、変化するもの、右に比較対象、 あまり変化しないもの、という指針を挙げています。 この指針は英語の用法と 合っていると書いています。 この指針が適さないケースもあります。 if ( 2 <= x && x <= 5 ) のような範囲を 表すときです。 && の前だけに注目していると読みにくいですが、x && x に気づく と、その後は理解しやすい書き方です。 if ( x >= 2 && x <= 5 ) では不等号の 向きを混乱しやすいです。 ただ、指針はルールではありません。 複数の分岐を表にするとき、条件の列のタイトル行に調査対象、それ以外の行に 比較対象を書きます。 タイトル行が下にある表が読みやすいでしょうか。 ヨーダ記法、という名前は、スターウォーズのヨーダが倒置法でしゃべっている ことから来ています。 でも、倒置法であることが認識できるから理解できるのです。 日本語でいえば、「は」「を」といった助詞で明示されているから理解できるのです。 プログラム コードにおけるヨーダ記法には、それがないから読みにくいのです。 次回は、ヨーダ記法が、そもそも安全性に役に立っているかどうかを検証して みたいと思います。 参考 リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック オライリージャパン ISBN-13: 978-4873115658 7.1章 条件式の引数の並び順 注目ニュース 一覧 ◇ ソニー、4Kディスプレイ搭載スマホ Xperia Z5 Premium などを発表。 http://japan.cnet.com/news/service/35069859/ … 806ppi は、紙よりはるかに細かい。 ◇ 紙に書いたメモを電子化する新カテゴリの製品、ワコム Bamboo Spark を発表。 http://www.itmedia.co.jp/pcuser/articles/1509/04/news057.html … リアルタイムで書いた内容を共有できればいいのだが。 ◇ MSの Office 365、Google Appsを上回る。クラウドベース生産性アプリ導入率。 http://japan.zdnet.com/article/35069648/ … 文句はあってもマイクロソフトの安心感は健在。 ◇ PCはこの5年間でどれだけ進化した?Intel、IFA会場で Skylake 正式発表。 http://www.itmedia.co.jp/pcuser/articles/1509/03/news057.html … 数年前のチップの型番を入力するとどれだけ性能が上がるかが知りたい。 ◇ Linuxに移行したミュンヘン市、議員が Windows への回帰を提言。 http://japan.zdnet.com/article/35069312/ … 提言が的を得ていなくて、受け入れられていない。 ソフトウェアデザイン館 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