̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ IT ニュース&コラム 2015/11/ 2 通巻699号 技術版 ソフトウェアデザイン館 Sage Plaisir 21  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄      ヨーダ記法で書くな (3) - リーダブル・コード(41) 前回に引き続き、読みやすさを取るか、安全性を取るか、という論点で議論に 「なりがち」なヨーダ記法ですが、今回はヨーダ記法よりも良い対策について 考察していくことにします。 企業・団体が事故などの不祥事を起こしたときは、社長が辞任したり、原因を 究明して対策を発表したりします。 このようにして、失墜した信頼を回復しよう とするわけですが、続けて不祥事を起こしてしまうと、更に回復は難しくなります。 なので、最もよく行われるのは、原因を究明して対策を発表することです。 その発表によって、同じ不祥事が発生する可能性が低くなることを示すことと、 真摯な態度を示すことができます。 実際に可能性が低くなるかどうかは、後述 するように別の話です。 では、ヨーダ記法に関して考えてみましょう。 そもそも、ヨーダ記法が考案 されたのは、なぜでしょうか。 それは、等号の演算子 == を、代入演算子 = と間違えて記述してしまうことがないようにするためです。 このような、ルールが生まれた背景についてさえ明文化されていないことが よくあります。 というか、ISO などのルールはそんなものばかりで、検証 不可能であり、立案者の役職による威厳ばかりです。 そんなものに疑いもなく 従っていては、非効率になる(価格が高くなる)ばかりですし、立案者を 超えられるわけがありません。 では、問題が発生する原因を考えてみましょう。 それは、単なるミスであると 思われますが、本当にそうでしょうか。 最近では JavaScript がよく使われ、== と = を間違える可能性が残って いますが、多くの人は、プログラミングの経験が1年もなれば、== と = を間違えることがほとんどなくなることを実感しているようです。 その要因はいろいろあると思いますが、その要因をはっきり言える人は ほとんどいません。 なんとなくです。 それで十分です。 私の場合、等号と代入を間違えないようにするために、等号と代入の違い を常に気を付けているわけではありません。 ほぼ無意識なのですが、変数 から書き始めたときは = を書くように、if や while から書き始めたときや、 ( を書いた後は、== を書くように指が動きます。 また、== を「が」、 = を「は」と呼んでいます。 たとえば、if ( a == 1 ) を「イフ、a が 1なら」、 a = 1 を「a は 1」 と呼んでいます。 人間の言語能力には驚かされるもので、 「が」と「は」をほぼ無意識に使い分けています。 これができるから、 指が勝手に使い分けて動くのでしょう。 もちろん、「が」と「は」と発音 している人ばかりではないと思います。 しかし、文脈を無意識のうちに 識別しているから、多くの人が間違える確率が低くなるのでしょう。 ヨーダ記法は、この能力を台無しにしてしまいます。 分かりますよね。 倒置法によって「が」と「は」の違いを変数や比較する値の文脈や位置関係 で識別できなくなるからです。 だから、(数字の定数や大文字のマクロ定数 といったハッキリと識別できない限り、)ヨーダ記法になっていない ミスを見つけるのは難しいのです。 また、「が」と「は」の違いは、意識してできるものではないので、 文章化した対策を意識の下で行うことが難しいです。 分かりやすい文章の 書き方はいろいろ本が出ていますが、プロの小説家レベルの高度な書き方 までなると、明文化された対策では不十分であり、総合的な経験によって 状況を暗黙的に判断してできることなのです。 もちろん、このような複雑な 暗黙知を形式知にして自動化することができれば、飛躍的に効率アップが 期待できますが、なかなかできるものではありません。 ただ、== と = のミスをなくす方法は、難しい総合的な判断をすること以外 にも対策法があります。 それは、「条件式には = が2つ(==)あること」 をチェックすることです。 うっかり = を1つだけ書いてしまうことの 原因の1つは、= の数(== かどうか)に注意しないで、コードの意味に 注意が向いていることです。 そこで、= の数に注意するチェックを行う 作業を追加すれば、そのことに集中することができ、ミスに気付く可能性は 高まります。 = を検索すれば、さらに見まちがうことは減ります。 不祥事が発生したら、何らかの発表をしなければなりません。 その場面では、「条件式の = が常に 2つであることをチェックすること」 では、単にチェックするだけという当たり前のことで、対策を考えたこと になっていない、原因と対策を混在している、と指摘されるかもしれません。 確かにその通りですが、それは問題ではありません。 実際に問題の発生 確率は、前者の方が低いのですから。 その誤った指摘を踏まえてしまうと、 ヨーダ記法のほうが、より良いと判断してしまうでしょう。 ヨーダ記法を対策にすれば、ヨーダ記法になっていなかったことが原因で したと発表するカードが増えます。 そのルールを徹底すると発表することも できます。 しかし、本当に徹底すると非効率になります。 すぐに調べられるような直接的な原因はすぐに発表しなければならない でしょう。 しかし、ルールになるようなレベルの対策に関しては、 今後も継続して改善するようにせざるを得ないことが多いでしょう。 あたりまえです。 問題が発生してから発表するまでの時間より、普段の システムを考案する時間のほうが長いからです。 根本的な解決をする 対策ができていないと文句を言う人には、そこを分かってもらう必要があります。 なぜなぜ分析をきちんとすれば明確な原因が見つかるという幻想を抱いて いる人がいます。 しかし、現実は、因果関係の段数は少ないが、なかなか解決 しずらい既存の問題が原因であることがほとんどです。 それは原因不明であり、 挙げた原因は仮説の因果関係であり、真の原因までたとりつくことはできません。 論理的思考が問題の解決ではなく人間の説得のためにあることを踏まえていない ですし、風が吹けば桶屋が儲かるといった因果関係の連鎖がそんなに続くわけが ありません。 因果関係の証明をなめています。 世の中はカオスなことだらけです。 ようやく、5回のなぜを繰り返す必要がないことまでは気づいていただけたよう ですが、1〜2段で対策不能になる(なぜなぜ分析の否定)までは口が裂け ても言えないようです。 幸い、== と = のミスをなくす方法は、他にあります。 それは、C言語の場合、 ( ) の中に = (==ではない)があったら警告するツールを作って使う ことです。 一度通すだけですべてのチェックが完了するので、 ヨーダ記法になっているかどうかを手動でチェックするよりかは、問題が 発生する可能性は低くなります。 それに変数と変数の比較の場合でも チェックできます。 このツールを使い忘れるリスクがありますが、 総合的な自動テストに組み込むことが可能なので、限りなく可能性をゼロ にすることが可能です。 自動テストを組むスキルは必要になりますが、 品質向上に大きく貢献します。 人間が行うテストなんでザルです。 場合によっては、ルールの改正なしや、ルールの廃止といった、 一見すると状況を悪くするように見えることを検討すべきです。 いわゆる「スルースキル」(和製英語)です。 次回は、== と = のミス が発生するという問題に対して、ヨーダ記法のような対策をする必要が ない理由の1つを説明します。 参考 リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック オライリージャパン ISBN-13: 978-4873115658 7.1章 条件式の引数の並び順 https://ja.wikipedia.org/wiki/不祥事 https://ja.wikipedia.org/wiki/なぜなぜ分析 注目ニュース 一覧 ◇ 民放5社による無料見逃し配信 TVer が26日スタート。 http://av.watch.impress.co.jp/docs/news/20151026_727414.html http://av.watch.impress.co.jp/docs/review/review/20151027_727533.html … バラエティが中心で、YouTube と競合していない。 ◇ 任天堂、スマホアプリ第1弾 Miitomo を3月に配信。 http://japan.cnet.com/entertainment/35072691/ … ついに、ゲーム専用機以外にもソフトを供給。 ◇ Twitterに 投票 機能追加、2択の選択肢付きツイートを投稿可能。 http://internet.watch.impress.co.jp/docs/news/20151022_726878.html … リツイート or ファボの公式版。 ◇ 新Apple TV発売開始。32GBで18,400円。 http://av.watch.impress.co.jp/docs/news/20151027_727543.html … 不格好になってしまった。 ◇ Web広告を非表示にできるiOS 9のコンテンツブロッカー。Appleの狙いはなにか? http://www.itmedia.co.jp/mobile/articles/1510/23/news044.html … アップルが直接広告を非表示するわけではないのがうまい。 ◇ 指定したドライブやフォルダーを監視するシンプルなツール FolderChangesView。 http://www.forest.impress.co.jp/docs/review/20151027_727519.html … 何か役に立ちそうな気がするけど。 ソフトウェアデザイン館 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