̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ IT ニュース&コラム 2013/ 7/22 通巻629号 技術版 ソフトウェアデザイン館 Sage Plaisir 21  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 変数の宣言や用語集を先頭にまとめるな - リーダブル・コード(6) C99に対応していない C言語のコンパイラーでは、変数の宣言を関数の先頭に まとめなければエラーになります。 なぜなら、変数の領域を確保/解放する ためにアセンブラー・レベルでスタックを操作するのは、関数の先頭と末尾 で行うからです。 しかし、だからといって、変数宣言を関数の先頭にまとめ なければならない訳ではないことは、C99 を策定したことには明らかに なっています。 一方で、このエラーによって、関数の中で使われるローカル変数の一覧が 常に作られるというメリットも生まれました。 これは用語の定義を先頭に 書くという文書の書き方と同じ考え方に近いものがあると思います。 まず用語の定義を知っておけば、本文はスラスラ読めるという理由です。 親切ですね。 しかし、多くの用語集は定義だけ書かれており、心理学で言われている 概念の理解に必要な定義的特性の列挙(つまり例)が示されていません。 これでは用語の定義を知ることができません。 変数の場合、その例は 変数が使われているコードです。 つまり、本文の一部を読まなければ 変数を知ることができないのです。 先頭にまとめて、そこで理解すれば、 という前提自体が幻想だったのです。 親切のつもりが実は迷惑だったのです。 変数を全文検索(grep)すると、例が列挙されます。 つまり、grep を使う ことが、そのまま、変数を理解する1つの手段になるということです。 先頭にまとめる文法(ルール)にするまでもなかったのです。 たしかに、一覧というのは理解しやすい表現方法であると感じることがあると 思いますが、そうでもないこともあります。 その原因を少し解明したいと 思います。 概念がツリーで構成されるとき、上位の(ツリーの)ノードにある概念を 理解するためには、その『直下のノード』の概念を挙げる必要があります。 つまり、下記の図の a を理解するには、b と c の明示(一覧)が重要で、 b1,b2,c1,c2 の明示は不要です。 しかし、b を理解するには、b1,b2 の 明示が重要です。 これらをごちゃごちゃにしてはいけません。 現実に近い分かりやすい概念から進めるトップダウン方式にするか、 分からない概念が登場しないボトムアップ方式にするかはケースバイケース ですが、それぞれのノードを理解するときは、『直下のノード』に絞り込む ことが重要なのです。 a +-- b | +----b1 | +----b2 +-- c | +----c1 | +----c2 よくある仕様書の章に、関数の章と変数の章を分けるというものがあります。 そのメリットは、検索を使わないで目的のものを探すときに、ある程度 絞り込んで、探しやすくなることです。 すぐに探せれば、直下のノード の名前を使った説明文がすぐに読めて、理解できるというメリットが あります。 だからといって、公開されている関数のプロトタイプ宣言の一覧と、外部 リンケージの変数(extern変数宣言)の一覧を分けることにメリットは ありません。 目的のものをすぐに探すことができたところで、そこには 説明文がないからです。 プロトタイプ宣言が一覧されていると、ファイルやライブラリーの概要を 理解できるのは、主要な構成要素である関数名が一覧されているからです。 しかし、まれに、外部リンケージの変数がライブラリーで重要な構成要素 であることがあります。 その場合、関数と変数を分けるルールがあると 構成要素を列挙できない問題が発生してしまいます。 ローカル変数の宣言だけ関数の先頭にまとめることは、関数と変数を分ける ルールに相当します。 これがエラーによって強制されてしまうと、 変数を使っているところと変数の宣言(型の情報)が、遠く離れる可能性 が高くなり、直下ではないノードが混ざることになってしまいます。 もちろん検索すれば見つかるのですが、近い場所に集まっていた方が、 他の情報が混ざることが少なくなります。 リーダブルコードの本では p122 に「このコードの問題点は、常に3つの (ローカル)変数のことを切り替えて考えなければならないことだ。」 と書いてあります。 他の情報が混ざっている例ですね。 C99 に対応していない C言語コンパイラーでこの問題に対処するには、 関数の途中に { } で囲むブロックを作成することです。 中間のブロック であっても、ブロックの先頭に変数宣言を記述することができるのです。 void FuncA() {   int a;   FuncX();   {     int b; // 変数宣言     FuncY();   } } 動的型付け言語では、変数宣言が不要なものが多くあります。 変数宣言に、 変数を説明する情報(型)がないからです。 説明文のない用語集を作っても 仕方ないですから、関数の最初に変数宣言をまとめるという発想はもちろん ありません。 しかし、中には、型宣言を伴わなくても変数宣言が必要だと 主張する人がいます。 スペルミスを発見できるからだそうです。 ところが、 Python では、代入(型定義を兼ねる)がない変数を参照するとエラーに なりますし、Visual Basic でもスペルミスがあれば何らかのエラーになるため、 スペルミスを防ぐ手段は変数宣言しかないというのは疑問です。 参考: リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック オライリージャパン ISBN-13: 978-4873115658 9.2章 定義の位置を下げる 概念獲得と概念変化 p36 - 田中俊也 - 心理学 - 関西大学 http://www2.ipcku.kansai-u.ac.jp/~ttank/gyoseki/chosho/2008conceputualchange.pdf VBScript の Option Explicit 変数宣言不要論 - livedoor Blog(ブログ) http://blog.livedoor.jp/sage_p/archives/51829980.html 注目ニュース 一覧 ◇ シャープ IGZO初の技術供与。脱ロンリーワン”で再建へ。 http://www.itmedia.co.jp/news/articles/1307/18/news043.html … 知的財産に理解があるなら、ブラックボックスでの提供も理解できるはず。 ◇ 特許権、職務発明を従業員から企業に。知財政策方針で政府検討。 http://www.itmedia.co.jp/news/articles/1306/10/news036.html … 特許権も著作権と同様に、職務で発明したものは企業に。 ◇ JPEG画像のEXIFヘッダにマルウェアを隠して実行させる新しい手口が登場。 http://gigazine.net/news/20130717-malware-hidden-jpeg-exif-header/ http://d.hatena.ne.jp/teracc/20080606 … 2008年から指摘されている。 ◇ タックスヘイブンに流れる日本の税金を取り戻せ。 http://bizmakoto.jp/makoto/articles/1307/18/news001.html … だから法人税を引き下げるとしてはならない。コンプライアンスを重視すべき。 ◇ 企業のJavaユーザー、8割強が旧版放置。Win 95時代の脆弱性も残る。 http://www.itmedia.co.jp/enterprise/articles/1307/19/news038.html … メンテナンスのコストも考えないと。 ◇ Wii Uの開発ソフトを無償配布 任天堂、販売不振で危機感あらわ。 http://www.itmedia.co.jp/news/articles/1307/16/news034.html … Wii U の開発が特殊に見えてしまっている状況を変えたい。 ◇ ST、32ビットマイコンのバリューラインを32セントで販売。 http://news.mynavi.jp/news/2013/07/12/222/index.html … 約32円。メモリーは極小だが32ビット整数が使えると思われる。 ◇ ネット選挙解禁でもやってはいけない7つのこと。 http://japan.cnet.com/news/business/35034748/ … 行き過ぎた選挙運動が起こらないようにするため。 ◇ Google Maps、新インターフェースを全ユーザー向けに公開。 http://japan.cnet.com/news/service/35034772/ … といっても Google アカウントが必要。 ◇ Google Chrome の新規タブをWindows 8のスタート画面風にする iStart。 http://www.forest.impress.co.jp/docs/review/20130718_608059.html … Windows 風なのに、名前はアップル流。 ソフトウェアデザイン館 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