̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ IT ニュース&コラム 2015/ 7/13 通巻691号 技術版 ソフトウェアデザイン館 Sage Plaisir 21  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ カッコの内側の空白の有無を統一するな - リーダブル・コード(37) カッコの内側に空白(スペース)を入れる/入れない、というコーディング ルール を策定することは、とても乱暴です。 いろいろなケースのカッコについて考慮しな ければ、乱暴なルールによる副作用がすぐに発覚します。 リーダブルコードを 突き詰めると、文章の表現力と同様に微妙で複雑な法則があり、むしろ、 ないほうが有益です。 具体的に見ていきましょう。 配列の番号にループ変数を指定することがよくありますが、配列の番号を囲む カッコの内側にスペースを入れないと、こうなります。 for ( i = 0; i < 10; i += 1 ) { array[i] = 0; } 上記の場合、読みにくいことはありません。 逆にスペースがあると間延びした 感じがします。 for ( i = 0; i < 10; i += 1 ) { array[ i ] = 0; } 不思議なことに、ループ変数に長い名前、特にアンダースコア(空白に下線が 引かれた記号文字)を入れてみると、逆に、カッコの内側にスペースを入れたほうが、 読みやすくなります。 for ( box_i = 0; box_i < 10; box_i += 1 ) { array[box_i] = 0; array[ box_i ] = 0; } 更に不思議なことに、型にキャストするコードでは、カッコの内側にスペースが あると、間延びした感じというか、型名の主張が強すぎてうっとおしい感じが します。 型キャストは補助的な説明だからです。 box_size = (size_t) read(); box_size = ( size_t ) read(); 関数のカッコの内側には、スペースを入れたほうが、関数名と引数を明確に 分けることができます。 function(size); function(size, count); function( size ); function( size, count ); 特に、function(size, count); は、"function(size" と "count);" の2つに 分かれているように見えてしまいます。 にもかかわらず、内側にカッコを 入れないコードのほうがよく見かけます。 なぜでしょう。 一般的な英文におけるカッコは、補助的な意味を表現するために使われ、 それは、内側にスペースを入れないことで表現できます。 実際、そのように 英文のルールも決められています。 このルールを乱暴にコーディング ルール にも採用してしまい、結果的として、すべてのカッコの内側に入れないという ルールになってしまったことが推測されます。 このルールに従いつつも、関数名と引数を明確に分けたいと思ったのでしょう。 カッコの外にスペースを入れるコードが時々見られます。 function (size); function (size, count); これは、関数名とカッコが離れているために、関数名が関数の名前である ことが分かりにくくなってしまいます。 関数の引数は、補助的ではありません。 プログラムは情報処理ですから、データが主役です。 つまり、英文のルールの カッコは内側にかかるのに対し、関数のカッコは外側にかかる、という違いを 乱暴に抽象化して作ってしまったルールが多いのです。 このように、カッコの中にある文字(数)や役割によって、カッコの内側に スペースを入れるかどうかが変わります。 読みやすさというか、意味の微妙な ニュアンスの違いが変わります。 Visual Studio 2015 の C# は、この複雑な状況に対して真正面から法則化 しようと試みています。 それは、カッコの意味によって、カッコの内側に スペースを入れるかどうかの設定が細かく分かれているのです。 [ ツール >> オプション >> テキスト エディター >> C# >> 書式設定 >> 行間 ] には、カッコの内側にスペースを入れるかどうかの設定だけで、以下のように たくさんあります。 ・メソッド宣言子のスペースを設定する ・メソッドの呼び出しのスペースを設定する ・式のかっこ内にスペースを挿入する ・型キャストのかっこ内にスペースを挿入する ・制御フロー ステートメントのかっこ内にスペースを挿入する 更に、1文字だけの大カッコ、アンダースコアがあるときの大カッコの設定が 分かれていればよいのですが、まだそこまで対応できていないようです。 細かい複雑なルールも自動化できればルール化してもよいですが、そうでなければ、 微妙なルールに従うことに多くの工数を使い切ってしまいます。 そうなれば、 むしろ、ルールがないほうが有益です。 カッコの内側のスペースの有無については、プログラムを習い始めたころに感じた ものと変わっていません。 ただ、一貫して変わっていないというわけではなく、 いろいろなコードのスタイルをまねたり強制させられたりして、上記とは 異なるスタイルにしばらく慣れていました。 しかし、読みやすさを意識したとき、 偶然元に戻りました。 リーダブルコードは、初心者にも読みやすくすることですから、 正しい方向に戻ったと思います。 そして、慣れとは恐ろしいものです。 参考 Visual Studio 2015 C# オプション 括弧の使い方(1)スペースの要・不要(初級) - 英語英文添削センター 注目ニュース 一覧 ◇ Open Container Project 発足。コンテナは統一仕様へ。 http://www.publickey1.jp/blog/15/open_container_project.html http://www.atmarkit.co.jp/ait/articles/1405/16/news032.html … PCハードウェアの仮想化システムで動く環境を、別の仮想化システムへ。 ◇ 主要ブラウザで実行可能なバイナリ形式 WebAssembly の開発がスタート。 http://www.publickey1.jp/blog/15/webassembly.html … Java のバイト コードとどう違うのか? ◇ Node.jsとio.jsに重大な脆弱性。 http://news.mynavi.jp/news/2015/07/08/462/ … クラッシュとは、何が無限ループに入るのか、再起動しないのか。 ◇ ECMAScript 6.0が完成、ECMAが仕様書公開。 http://www.publickey1.jp/blog/15/ecmascript_60ecmaecmascript_2015.html … すべてのブラウザーで同じ動きをする確信が広まったら、今度こそ普及するかも。 ◇ グーグル対オラクルのJava訴訟、米最高裁がグーグルの上告を棄却。 http://japan.cnet.com/news/business/35066650/ … フリーだったのに。 ◇ アップル、iOS 8.4 と OS X 10.10.4 で多数の脆弱性に対処。 http://japan.cnet.com/news/service/35066795/ … 対処したはよいが、対応が十分早いとはいえない。 ◇ 8時59分60秒挿入完了、東京・小金井やTwitter上がうるう秒で盛り上がる。 http://internet.watch.impress.co.jp/docs/news/20150701_709794.html … メンテナンスで時計を止めることをしてこなかったのが不思議。 ◇ 秘密の質問「母親の旧姓」、読めないんですけど……。 http://www.itmedia.co.jp/enterprise/articles/1507/07/news040.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