̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ IT ニュース&コラム 2013/12/23 通巻651号 技術版 ソフトウェアデザイン館 Sage Plaisir 21  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ breakを1つに制限するな - リーダブル・コード(17) ループを抜けるときのbreak文を1つだけに制限するコーディング・ルールがあります。 それに関してネットで下記のページを見つけました。 MISRA-Cにはループから抜けるbreak文を一つにする規約があります。 break文を探せば どういう場合に抜けるかがすぐわかる。 これはMISRA-Cの中でも効果が解りやすい ルールだと思います。 http://swest.toppers.jp/SWEST10/minutes/S4-d.txt MISRA-C の中でも有名な効果のように書かれていますが、ネットで調べてもその効果を 解説するとページは見つかりません。 break文の近くのコードを見れば、抜ける条件が わかるというのはあたりまえですが、1つに制限することでどのような効果があるかは、 わかりません。 break文が複数あるループが、たとえば、次のようになっていたとします。   for (;;) {     if ( mode == 1 ) {       ret = Judge();       if ( ret != 0 )         { break; }     } else {       if ( key == 2 )         { break; }     }     if ( key == 0 )       { break; }     DoSomething();   } break文を1つにするには、次のように制御フロー変数(下記 is_loop)を追加するしか 方法はありません。 元々、複雑なループ終了条件なので、工夫のしようがありません。 なお、制御フロー変数は、「リーダブル・コード」の本では使わないことが推奨されています。   for (;;) {     bool is_loop;     if ( mode == 1 ) {       ret = Judge();       is_loop = ( ret == 0 );     } else {       is_loop = ( key != 2 );     }     if ( is_loop ) { // 終了条件の OR 条件 = 継続条件の AND 条件       is_loop = ( key != 0 );     }     if ( ! is_loop )       { break; } /* MISRA 14.6 */     DoSomething();   } break文を1つにしたことで、わかりやすくなったとは思えません。 ループ終了条件の複雑さが、break文のコードから制御フロー変数を使ったコードに 変化した、つまり、break 文を探すことが、制御フロー変数への代入を探すことに 変わっただけだからです。 しかも、制御フロー変数の名前が適切でなくなるきっかけを 与えてしまい、break 文のコードと変数宣言のコードが増えてしまっています。 MISRA-C の効果がわかりやすいとは一体何のことだったのでしょう。 break文を1つに制限することの他の効果を探してみることにしました。 そして 気づいたのは、ループを抜ける制御フローが1つになったことで、ループの終了条件に 関わる状態を増やしにくくなる効果があったことです。 たとえば、   for (;;) {     if ( g == 1 )       { break; }     if ( g == 2 )       { break; }     FuncA();   } のような複数の break は、OR 条件に相当するので、break を1つにした   for (;;) {     if ( g == 1 || g == 2 )       { break; }     FuncA();   } の制御フローと同じになるのですが、このコードは、   for (;;) {     if ( g == 1 )       { break; }     FuncB( &g ); // g は変わる可能性があるが、変わらないかもしれない     if ( g == 2 )       { break; }     FuncA();   } の FuncB のような任意の処理を追加しにくくなります。 制御フロー変数を追加すれば、 任意の処理を追加することは可能ですが、新たな制御フロー変数を追加する手間が あるために追加しにくくなっています(変数宣言が必要な言語では)。 もし、FuncB を追加した場合、g == 1 の判定から g == 2 の判定の間に、 状態 g が変化する可能性を考慮しなければならなくなり、 ( g == 1 || g == 2 ) のような g に同じ値を期待する条件式ではなく、 ( g == 1 || g’ == 2 ) のように新たな変数 g’ を追加した条件式の方が、 実際の条件式になるのです。 その結果、コードに書かれた条件式と異なるため、 読みにくいコードになるのです。 break文を使用する場合、for文やwhile文は、無限ループにしなければ、同様に 状態が増えて、読みにくいコードになります。 たとえば、下記のコードは、 上記の FuncB を追加した読みにくいコードと同じ制御フローになります。   while ( g != 1 ) {     FuncB( &g );     if ( g == 2 )       { break; }     FuncA();   } 逆にbreak文を1つに制限すると、短絡評価(本記事のリーダブル・コード(11) を参照)による処理効率の向上ができなくなります。 たとえば、1番目の サンプル・コードでは、すぐにループを抜けられるのに、2番目のサンプル・ コードでは、いくつかの条件式を評価する処理が実行されます。 また、 2番目のサンプル・コードに示した、下記のコードを追加せざるを得なります。 if ( is_loop ) { // 終了条件の OR 条件 = 継続条件の AND 条件 性能を重視するか、読みやすさを重視するかは、ケースバイケースですが、 breakを1つに制限しなくても、状態が増えないことさえ気を付ければ、 読みにくくならないので、性能が有利な方を選ぶべきでしょう。 参考: リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック オライリージャパン ISBN-13: 978-4873115658 7.5章 関数から早く返す 9.1章 変数を削除する - 制御フロー変数を削除する 注目ニュース 一覧 ◇ iOS 7.1 第2ベータ版が開発者に公開。iOS in the Car 機能を示唆する設定も。 http://japan.cnet.com/news/service/35041435/ … カーナビの画面に iOS デバイスの画面。 ◇ DeNAが教育市場に参入、小学1年生の学習をスマホで習慣化する、アプリゼミ。 http://internet.watch.impress.co.jp/docs/news/20131216_627917.html … 売れなければすぐに撤退するイメージを払しょくできるか。 ◇ 見られてるかも。PCのウェブカメラをシールでふさぐのは被害妄想ではない。 http://internet.watch.impress.co.jp/docs/news/20131216_627885.html … スマホのカメラでいつのまにか撮られている。浴室に導く手口も。 ◇ サムスン GALAXY ROUND の第一印象。曲面ディスプレイの利点や使用感など。 http://japan.cnet.com/news/commentary/35041470/ … 足にフィットする。 ◇ 2014年にはメジャーになるARMの省電力技術 big.LITTLE。 http://pc.watch.impress.co.jp/docs/column/kaigai/20131218_628049.html … インテルに対抗できる手段。 ◇ 真の爆速は速すぎて見えない。ヤフーにおけるリーンスタートアップの実践。 http://www.publickey1.jp/blog/13/_ibm_innovate_2013.html … 発売直後だけ売れる状況を変える。 ◇ 大阪人は「オレオレ」には強いのに、お金返します、に弱い? http://bizmakoto.jp/makoto/articles/1312/16/news037.html … オレってだれやねん、とツっこめるのに対し、儲かることに乗ってしまう。 ◇ MS、Bing Maps 開発主要エンジニア、グーグルに転職へ。 http://japan.cnet.com/news/business/35041491/ … MSが突きつける、1年間の非競争契約をも逆提訴するたくましさ。 ◇ 国内ソフトウェア市場が過去最高に。 http://japan.zdnet.com/cio/analysis/35041501/ … プライベートクラウドが普及し始めた。 ソフトウェアデザイン館 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