̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ IT ニュース&コラム 2016/ 7/18 通巻717号 技術版 ソフトウェアデザイン館 Sage Plaisir 21  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄    メインの処理の前の空行を詰めるな - リーダブルコード(45) プログラムのソースコードを読むときは、まず、その概要が知りたくなります。 そのためにドキュメントがあるわけですが、ドキュメントを書くとソース コードと情報が一元化されなくなってしまうことと、コンパイラーによる様々な チェックができなくなってしまう問題があります。 コードと離れているため 対応関係が取れず、取扱説明書が読めない人もいます。 このため、なるべくソース コードで概要を知ることができるように読みやすくしておいて、後々再利用や 保守がしやすくなるようにします。 読みやすくする方法は、小説を書くことと同じように奥が深いのですが、 たとえば、ソースコードに空行を入れることで、ソースコードをいくつかの ブロックに分け、それぞれのブロックの最初の行に概要をコメントで書いて おくことで、全体を読みやすくするという方法があります。 その1つの方法が 以前説明したシンプル・コメントです。 参考:ソースコードが早く読めるようになる、シンプル・コメント。 http://blog.livedoor.jp/sage_p/archives/51850426.html それぞれのブロックの概要を知ろうとするときは、ブロックの中をときどき スキップしながら、しかし、基本的には上から下へ読み進めていきます。 概要が分かって次のブロックにジャンプするときは、空行を頼りに、次の ブロックの先頭から読み進めていきます。 その先頭に概要のコメントを 書くようにしたのがシンプル・コメントの特徴なのですが、コメントが なくても、空行の次をブロックの先頭として、そこから読む傾向があります。 ブロックの先頭がコメントではないことがよくありますからね。 この傾向を利用したのが、「メインの処理の前に空行を入れる」です。 シンプル・コメントを書かなくても、最後の処理の前に空行を入れてブロックを 分ければ、その最後の処理だけのブロックが重要なブロックであるとして記憶に 残り、関数全体の理解に役立つのです。 シンプル・コメントを使ったコードの例: /* Call "ParseXML" */ path = "File.xml"; config.Flags = F_ParseXML_Delegate | F_ParseXML_OnStartElement; config.Delegate = work; config.OnStartElement = App_onStartElement; e= ParseXML( path, &config ); IF(e){goto fin;} メインの処理の前に空行を入れたコードの例: path = "File.xml"; config.Flags = F_ParseXML_Delegate | F_ParseXML_OnStartElement; config.Delegate = work; config.OnStartElement = App_onStartElement; e= ParseXML( path, &config ); IF(e){goto fin;} ブロックの概要を再確認するときも、最後の処理の1行だけなので、早く済みます。 ちなみに、ParseXML の左の e= の e と = の間に空白を入れないのは、e (C言語の エラーコード)への代入が重要ではないことを表しています。 文法的には代入なの ですが、処理概要は代入ではありません。 なお、シンプル・コメントと、メインの 処理の前に空行を入れたコードとでは、概要の読みやすさにあまり差はありません。 しかし、このメインの処理の前に空行を入れる方法には副作用があり、それは、 ブロックが2つに分かれてブロックが増えてしまうことです。 この副作用の対処法は、「代入だけするブロックと、処理だけするブロックに分ける」 ことです。 ライブラリが充実した現在では、ライブラリの関数のパラメーターをローカル変数 である説明変数に代入して、最後に処理関数を呼び出すというのがブロック内に よくあるパターンです。 このパターンでは、関数呼び出しが主で、ローカル変数への 代入は従という関係があります。 つまり、概要を知るとき、従であるローカル変数への代入はまず読み飛ばすことが できると判断する傾向ができてくるのです。 そうなれば、代入だけのブロックなら、 そのブロック全体をごっそり読み飛ばすようになります。 さらに、代入だけする ブロックと、処理だけするブロックに分けるコーディング ルールを採用しているな、 と分かれば、先頭の行が代入であることだけで、ブロック全体をごっそり読み飛ばす ようになります。 もちろん、読み飛ばせないケースもあるのですが、そのときは 読み方を変えて、後で読み直せばよいのです。 書いた人のパターン(コーディング ルール)を読むというのは、ソースコードを読むうえでよく使う手です。 また、概要を理解する上で、代入するソースコードを書く順序は重要ではありません し、代入をブロックに分けることも重要ではありません。 たとえば、 path = "File.xml"; config.Delegate = work; config.OnStartElement = App_onStartElement; e= ParseXML( path, &config ); IF(e){goto fin;} というソースコードと、 config.OnStartElement = App_onStartElement; config.Delegate = work; path = "File.xml"; e= ParseXML( path, &config ); IF(e){goto fin;} というソースコードのどちらが読みやすいかは、あまり差がありません。 なぜなら、主である ParseXML 関数呼び出しの詳細を知りたいときに、 従である config 引数の内容は、config で検索することで知ることができるからです。 最新のテキスト エディターでは、config をクリックするだけで、すべての config を強調表示してくれますし、代入するソースコードまで表示するエディターも 出てくると思います。 検索して分かるので代入をブロックで分ける必要もなくなり、代入のブロックの数を 減らすことができ、そのようなソースコードから概要を知るときは、大きな代入の ブロックをごっそり読み飛ばすことができるようになるのです。 ちなみに、関数型プログラミング言語は、処理方法を記述しないで宣言のみになるので シンプルだという主張は、上記のように書く順序の影響がないという性質によるもの だと思います。 一方で処理には順序があるので、関数型プログラミング言語だけで プログラミングすることには無理があるのです。 ソース: リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック オライリージャパン ISBN-13: 978-4873115658 8.1章 説明変数、8.2章 要約変数 ソースコードが早く読めるようになる、シンプル・コメント http://blog.livedoor.jp/sage_p/archives/51850426.html 注目ニュース 一覧 ◇ Pokemon Go、1日のアクティブユーザー数がTwitterを上回る。 http://japan.cnet.com/news/business/35085942/ … 世界的に見れば Twitter ユーザーは少ないが。 ◇ Pokemon GO のおかげでARメガネがいよいよ普及する? http://www.itmedia.co.jp/pcuser/articles/1607/16/news017.html … ARメガネをかけると逆に歩きスマホをしなくなるので安全。 ◇ Pokemon GO はうつ病や不安神経症を改善。精神医学の専門家が語る。 http://japanese.engadget.com/2016/07/15/pokemon-go/ … 「すべての人が笑顔になるためにはどうすれば良いか」。 ◇ Windows 10、8月2日の大型アップデートでどう変わる?主な新機能を紹介。 http://japan.zdnet.com/article/35085226/ http://cloud.watch.impress.co.jp/docs/special/1009475.html … 少しずつ変わる UI。 Webサービス同様、正しく書かれた手順書がなくなる。 ◇ グーグル、日本でも車載ソフト Android Auto を公開。日産やホンダも対応。 http://japan.cnet.com/news/service/35085794/ … Google Maps の信頼性で参入。 いずれ検索での広告表示が入るだろう。 ◇ 元スパイが恐怖の自動車ハッキングを実演、ブレーキやハンドルを操作するなど何でもあり。 http://gigazine.net/news/20160713-hacking-car-former-nsa/ … 脆弱性を無くすアップデートは必須。 ◇ グーグル、新ツール My Activity を導入。ユーザーの詳細な行動履歴を提供。 http://japan.cnet.com/news/service/35085173/ … スポンサー向けにプライバシーを脅かす Google。 中止するオプションも信用できるのか。 ◇ 外出先からスマホで操作できるエアコン ノクリアX が賢すぎる!。 http://kaden.watch.impress.co.jp/docs/column_review/kdnreview/1008441.html … スマホとの連携機能の追加は、スマホの普及状況を見た正しい進化。 ◇ Mozillaの新型高速ブラウザエンジン Servo、初めてのデベロッパープレビューが公開。Rust言語で開発中。 http://www.publickey1.jp/blog/16/mozillaservorust.html http://japan.cnet.com/news/service/35085786/ … また、同じ意味に違うキーワードを付けてしまう新言語。 ◇ 数千万円クラスの3Dプリンターは数十万円クラスのものとどれくらい性能に違いがあるのか比べてみた。 http://gigazine.net/news/20160713-3d-printer-high-low-price-quality/ … アップルのレベルの製品では金型は無くならない。 ◇ LINE上場は最悪のタイミング? 予想以上に強かった韓国色。 http://www.itmedia.co.jp/news/articles/1607/11/news063.html … 元々韓国の会社であるし、グローバル スタンダードな対応であろう。 ◇ このVRの進化ヤバすぎ! ハニーセレクトの肌は驚愕ものの質感【アダルトご注意】。 http://ascii.jp/limit/group/ida/elem/000/001/194/1194905/ … 黒モノ家電の普及にはアダルトがつきもの。 ソフトウェアデザイン館 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