̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ IT ニュース&コラム 2015/11/30 通巻701号 技術版 ソフトウェアデザイン館 Sage Plaisir 21  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄      ヨーダ記法で書くな (4) - リーダブル・コード(42) 前回は、対策をすることが結果的に非効率になるにもかかわらず対策をしたことを 主張できるようにするためにできたルールの1つとしてヨーダ記法があることを 説明しました。 今回は、== と = のミスが発生するというヨーダ記法が対象と する問題に対して、対策をする必要がない理由を説明します。 安全性を重視して、フェイルセーフを持ったシステムやフォールトトレラントを 持ったシステムを設計することがあります。 フェイルセーフは、問題があったら 安全な状況に自動的になるような仕組みです。 たとえば、オーバーヒートしたら 燃料の供給を止めるようなシステムや、ウィルスが侵入する手口の1つである スタック オーバーフローを検出したらプロセスを即時終了させる OS などです。 フォールトトレラントは、問題が発生しても、システムを一部でも正常に動かし 続けることで、つまりは多重化されたシステムや冗長性を持ったシステムのこと です。 たとえば、内容が同じ物理的なサーバーが2台で構成されるシステムや、 入出力データ・中間データをバックアップするシステムのことです。 列車や飛行機は、事故を起こすと人命にかかわるので、フェイルセーフや フォールトトレラントのシステムを必ず持っています。 しかし、ラジコンの ヘリコプターなど、安全性にかかわる機能を持っていない高度なシステム もあります。 開発方針を決める際に(テーラリングするときに)安全性に かかわる機能(の一部)は必要ないために外されるからです。 もしくは コストに合わないため用途や場所を限定したシステムにします。 たとえば、 医療用には使わないでくださいと注意書きをすることです。 では、ヨーダ記法が対象とする問題について考えてみましょう。 等号の 演算子 == を、代入演算子 = と間違えて記述してしまったことは、問題 ではありません。 なぜなら、記述ミスによる直接的な実害はないからです。 しかし、記述ミスにより発生する間接的な実害はあるわけで、それは 問題です。 演算子 == を、代入演算子 = と間違えて記述してしまったことによって 発生する問題は無限に考えられます。 たとえば、在庫がないのにあると 表示して顧客に迷惑をかけてしまったり、すべてのデータを削除してよいか 質問されてキャンセルを押してもすべてのデータを削除してしまったり、 (謎のエラーによって)アプリが突然終了してしまったりと、重大な問題 も考えられ、キリがありません。 すべて挙げることは不可能です。 この 予測不能なところがまた対策ができないという不安をあおることになり、 少しでも対策の必要性があるように思えます。 だから、コストがかかっても、ヨーダ記法を採用すべきだ、と判断する 人がいると思いますが、これは誤った判断です。 可能性は無限に考えられ ますが、ほとんどの問題は、エラーが発生してしまって処理が中断される ことなので、実害は大きくありません。 もし実害がある問題が発生しても、フェイルセーフやフォールトトレラント があれば、もし一見正しそうな問題が発生しても、もしエラーが発生して 処理が中断しても、実害をなくすか実害を小さくすることができるでしょう。 いや、そうできることをテストしているはずです。 それに、よく分からない コーディング ルールを説明するより、フェイルセーフやフォールトトレラント の説明をしたほうが安全性が高いことを説得する力がありますし。 フェイルセーフやフォールトトレラントといった大げさなシステムが なくても、ほとんどの問題は、エラーが発生して処理が中断してしまう、 もしくは、明らかに間違った結果が得られてしまうことになるので、 テストに引っかかります。 期待した結果と比較するという単純なテスト でも引っかかります。 その単純なテストをするだけで、フォールト トレラントと同様の多重化による品質の確保ができるのです。 なぜなら、システムは少し結果が違っただけで期待した動作をしない センシティブなものだからです。 ドミノ倒しのようなものです。 最後の牌が倒れていないといった明らかな失敗を確認する(正しい 出力と比較する)テストをするだけでよいのです。 以下にサンプルを 示しますが、テストをすり抜けることがいかに難しいか分かるでしょう。 よって、ヨーダ記法が対象とする問題に対処する必要はないのです。 typedef int errnum_t; errnum_t FunctionA( int in_A, int in_Operation, int in_B, int* out ) { errnum_t e = 0; if ( in_Operation = '+' ) /* == ではないので、常に真(バグ) */ { *out = in_A + in_B; } else if ( in_Operation = '-' ) { *out = in_A - in_B; } else { e = E_BAD_OPERATION; } return e; } errnum_t Test_of_FunctionA() { errnum_t e; int out; e= FunctionA( 2, '+', 3, &out ); IF(e){goto fin;} ASSERT_R( out == 5, e=E_OTHERS; goto fin ); e= FunctionA( 3, '-', 2, &out ); IF(e){goto fin;} ASSERT_R( out == 1, e=E_OTHERS; goto fin ); /* 失敗 */ e= FunctionA( 3, '?', 2, &out ); if ( e == E_BAD_OPERATION ) { ClearError(); e=0; } else { e = E_OTHERS; } IF(e){goto fin;} e=0; fin: return e; } 中断されるかテストに引っかかる確率が高いことは、経験(事実) から来るものです。 論理的に考えて得られるものではありません。 頭で考えるだけになってしまうと、シャド・ヘルムステッターの言う、 潜在意識によって自己否定ばかりするよう状態になってしまい、 無限の悪い可能性やありえない問題を消せなくなるのです。 テストを したのにバグがあったという経験はあると思いますが、その段階で 判明したバグは、ヨーダ記法をしていれば防げるものではありません。 単純なテストに比べると、ヨーダ記法は、実践も難しいし正しいことのテストも 難しいので、費用対効果が低いのですが、それ以前に冗長なのです。 (補足) テスト プログラム自体に関しては、ヨーダ記法が対象とする問題に対して、 対策をする必要があります。 ただし、前回で説明したように、ヨーダ記法 以外の対策のほうが効率的です。 e= FunctionA( 3, '-', 2, &out ); IF(e){goto fin;} ASSERT_R( out = 1, e=E_OTHERS; goto fin ); /* 常に Pass(バグ)*/ 参考 リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック オライリージャパン ISBN-13: 978-4873115658 7.1章 条件式の引数の並び順 テーラリングガイド作成の手法の提案 http://www.juse.jp/sqip/library/shousai/?id=50 アファーメーションで心のプログラミングを書き換える http://ogawakenji.com/blog/affirmation/ VBScript の Option Explicit 変数宣言不要論 - livedoor Blog(ブログ) http://blog.livedoor.jp/sage_p/archives/51829980.html 注目ニュース 一覧 ◇ 最適なAPIをワトソンの技術で教えてくれる、米IBMが API Harmony。 http://www.publickey1.jp/blog/15/ibm_api_harmony.html http://www.publickey1.jp/blog/15/open_api_initiative.html … 人工知能で医師をサポートしてきたが、プログラマーも人工知能でサポートへ。 ◇ レイアウトやアニメーションを自動作成する新機能 PowerPoint Designer と Morph を発表。 http://www.publickey1.jp/blog/15/powerpoint_designer_morph.html … 自動化できてもかっこよくなければ。 ◇ 10分後に自動削除されるファイル共有サービス、10minutestorage。 http://japan.cnet.com/news/society/35073773/ … パスワードなしでも、ワンタイム パスワードのようなセキュリティ強度。 ◇ 見えているのにコピーできないテキストをコピーできるようにする PointClip。 http://www.forest.impress.co.jp/docs/review/20151124_731532.html … といっても Windows の標準的なテキストのみ。 ◇ UX解析ツール USERDIVE for Apps、Unityプラグインに対応。 http://news.mynavi.jp/news/2015/10/22/314/ … 個人情報は切り離されているが、ユーザーの操作はこうして解析されている。 ◇ 秋葉原駅で無料の駅ナカゲームセンター。電子マネーの利便性をアピール。 http://japan.cnet.com/entertainment/35073835/ … ちょっとの待ち時間に、スマホの画面の外へ。 ◇ デル、別のルート証明書 DSDTestProvider についても問題を認める。 http://japan.cnet.com/news/service/35074024/ … ルート証明書に問題がある PC が広まると、TLS(SSL)が骨抜きに。 ◇ グーグル、TripAdvisorやYelpの検索結果が下位なのはバグと釈明。 http://japan.cnet.com/news/service/35074037/ … バグだから許してね、じゃねぇ。 ◇ 価格わずか5ドルの Raspberry Pi Zero 発表。 http://japan.cnet.com/news/service/35074091/ … ソフトウェアを学習するなら Linux より PC のほうがいいのでは。 ◇ ファミコンの新作カセットが21年ぶりに登場、8BIT MUSIC POWER が予約開始。 http://akiba-pc.watch.impress.co.jp/docs/news/news/20151127_732470.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