̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ IT ニュース&コラム 2013/ 9/16 通巻637号 技術版 ソフトウェアデザイン館 Sage Plaisir 21  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 制御フロー変数を使うな(1) - リーダブル・コード(10) 制御フロー変数は、いわゆるデータを変数に格納するのではなく、別の位置 にあるコードの動きを間接的に制御するための変数です。 たとえば、下記の is_loop 変数のような、反復し続けるかどうかを値に持つ変数です。 bool is_loop = true; while ( is_loop ) {    :   if ( ... ) {     is_loop = false;   }    : } ちなみに、is_loop と逆の done 変数を使うコードがよく見られますが、 done は反復することの否定(逆)の意味になるため読みにくくなります。 終わった!と考えた方が気持ちいですけど、C言語のループ条件式は継続する方を true にすることに統一されています。 while 文では、反復(ループ)を継続する条件を、ループの先頭に書きます。 新しくプログラミング言語を習得したら、どうしてもループを継続する条件を 先頭でしなければならないと考えて、制御フロー変数を作ってしまうでしょう。 これはプログラミングのベテランでも、新しいプログラミング言語を使い始めたら やってしまうことです。 なぜなら、途中でループを終了する方法を調べるよりも すぐにできてしまうからです。 プログラミング言語の反復構文は、どの言語でも、for 文(各要素の繰り 返し)、while 文(前判定ループ)、do-while 文(後判定ループ)ぐらいです。 なぜ途中で終了するループがないのかというと、ループ自体が、ループの開始地点 と終了地点から表現されるものであり、どうしてもその2点にのみ反復構文が 登場してしまうからです。 途中で抜けることは反復(繰り返し)とは言いませんからね。 だから、プログラミング言語の解説書では、反復構文と途中で抜ける構文が 同時に説明されないことがあり、途中で抜ける構文は知らないという人が生まれ てしまうのです。 しかしこれらは同時に学ぶべきことです。 途中で抜けることは反復ではないので、構造化プログラミングではないと 理解してしまった人がいると思いますが、構造化プログラミングを提唱した ダイクストラは、ジャンプ(goto 文など)を機械的に削除することは推奨しないと 言っています。 BASIC が主流の当時に多く見られた goto 文のほとんどは、 分岐と反復の構文に置き換えることができると主張しただけなのです。 どうしてもループの途中で抜ける必要があるケースは、現実にあります。 なぜなら、ループを継続する条件が求まるためにしなければならない処理が、 実際に反復して行う処理に比べて大きくなるケースがあるからです。 この現実に対して、どのように対処するかということを考えなければなりません。 1つは制御フロー変数であり、もう1つは途中でループを抜ける break 文など プログラミング言語の構文を使うことです。 どちらが良いのでしょうか。 for (;;) { /* 無限ループ構文だが、無限ループではない */    :   if ( ... ) {     break;   }    : } 制御フロー変数を使えば、break 文などを学ぶ必要がなくなります。 それは いいことだと思います。 また、順次、分岐、反復に実行順序が従うため ジャンプの要素がありません。 しかし、制御フロー変数は、goto 文と同じくらい、 いやそれ以上にスパゲティ・プログラムを生む要因になります。 なぜなら、 goto はジャンプ先を探さなければならないのですが、制御フロー変数はそれが 参照されている場所を探さなければならないからです。 is_loop(done)という 変数名から推測できると思うのなら、goto ラベルも exit_for や fin など 推測できるようにできます。 しかも、実行する順序はジャンプ(goto, break, continue など)に比べて複雑になります。 ループの端まで実行してループを 抜けて、そこでようやくジャンプに追いつくからです。 ネットで検索できる時代になり、(記号ではなく)キーワードを使ってできる プログラミング言語の機能は、検索してすぐ学べます。 中には難しい機能も ありますがそうでなければ、誰でもコードが読めるようにプログラミング言語 の機能を限定する方針は誰のためでもありません。 また、一歩ずつ進まないと不安になる心理が働くのでしょう。 途中でループを 終了することで、ループ内の続きの処理は本当にしなくてよかったのだろうかと。 実は1種類だけあります。 それは、ループを継続するかどうかを判定する 前に生成した、ループ内ローカル・オブジェクトの終了処理(close、free、 finalize などの関数呼び出し)です。 これはスキップできません。 while ( is_loop ) {   (ループ内ローカル・オブジェクトの生成処理)   if ( ... ) {     is_loop = false;   }   if ( is_loop ) {    (反復処理)   }   (ループ内ローカル・オブジェクトの終了処理) } 上記の形に限り、制御フロー変数を使った方がシンプルになります。 ただし、これはレアケースであり、制御フロー変数を使わないコードに比べれば 読みにくいので、常にこの形にすることでコーディングのパターンを減らしたいと 考えるのは汎用主義者(原理主義者)がよく起こす判断ミスです。 ジャンプ処理(break, continue, return, goto)を書いたときは、終了処理が必要で あるかどうかをチェックしなければなりません。 終了処理を知らない初心者プログラマーは、 チェックを忘れるかもしれません。 しかし、制御フロー変数を使ったところで、 終了処理を漏れなくできるわけではありません。 前判定ループか後判定ループの 判定式までスキップするために使っているので、終了処理を実行するかどうかを 気を付けるきっかけにはなっていないからです。 必ず実行しなければならない、終了処理があることを知っているかどうかが分かれ目 なのです。 参考: リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック オライリージャパン ISBN-13: 978-4873115658 9.1章 変数を削除する - 制御フロー変数を削除する Wikipedia - 構造化プログラミング 注目ニュース 一覧 ◇ 廉価版 iPhone 5c が7万円。高過ぎ!と驚愕する中国人。 http://www.itmedia.co.jp/news/articles/1309/13/news054.html http://blogos.com/article/69976/ … 1万円と思いきや7万円。 日本の0円ケータイのような割引がないためか。 ◇ PS4の海外から3カ月遅れて発売に落胆の声。プレイステーション公式ブログ炎上。 http://nlab.itmedia.co.jp/nl/articles/1309/10/news052.html … 海外の競争を優先。 ◇ テレビにつないで遊ぶ 据え置きVita 緊急発表。PS Vita TV、9954円で11月14日発売。 http://nlab.itmedia.co.jp/nl/articles/1309/09/news109.html … PS4 発売延期の代わりに新製品発表。テレビの大画面で Vita のゲームが楽しめる。 ◇ 三井住友銀行がパスワードカードを導入。邦銀初、ネットバンキング用。 http://www.itmedia.co.jp/news/articles/1309/10/news043.html … 厚めのカードサイズに。パスワードカードを使うための暗証番号が設定可能に。 ◇ ソニーの SmartWatch 2。新しくなった腕時計型端末の第一印象。 http://japan.cnet.com/news/commentary/35036837/ http://weekly.ascii.jp/elem/000/000/153/153736/ … GALAXY Gear より CPU が遅いが軽量。 ◇ 日産、スマートウォッチ Nismo Watch Concept を発表。自動車とドライバーを連携。 http://japan.cnet.com/news/service/35036954/ … 心拍数などを計測して、安全運転を促す。 ◇ iPad mini信奉者も買いたくなる、新Nexus 7の満足度。 http://techtarget.itmedia.co.jp/tt/news/1309/13/news06.html … iPad mini サイズで、Retina レベルの解像度。 ◇ デザイナーらが直販できる rinkak 正式サービス開始。3Dプリンタで製品化。 http://japan.cnet.com/news/service/35036981/ … 美術品は 3D プリンター製になるだろう。 ソフトウェアデザイン館 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