IT ニュース&コラム 2018/12/ 3 通巻777号 技術版 ★特別号★ ソフトウェアデザイン館 Sage Plaisir 21  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ■■ 空行はブロックの前ではなく読ませたい文の前に入れる - リーダブル コード(56) ■■ 今回紹介する方針は非常に重要です。 プログラムのコードを書くときの方針として、 今までの常識としていた方針が間違っていた、目から鱗が落ちるような方針を紹介します。 次に示すように処理内容が10行近く以上の長い関数があるとします。 void FunctionA() { OptionClass* option = new OptionClass; option.Source = "C:\\FolderA"; option.Destination = "C:\\FolderB"; SpecialCopy( option ); option.Source = "C:\\FolderAA"; option.Destination = "C:\\FolderBB"; SpecialCopy( option ); } 上記の関数には7つの文があります。 このように処理内容が長いときは、いくつかの 処理ブロックに分けることができます。 処理ブロックを分ける行に空行を入れてみましょう。 すると、2つのコピーであることがよく分かります。 void FunctionA( int in_a ) { OptionClass* option = new OptionClass; option.Source = "C:\\FolderA"; option.Destination = "C:\\FolderB"; SpecialCopy( option ); option.Source = "C:\\FolderAA"; option.Destination = "C:\\FolderBB"; SpecialCopy( option ); } しかし、これだけでは、2つブロックがあることが分かるだけで、2つのコピーをしている ことまでは、すぐに理解することができません。 なぜなら、ブロックの最後まで読まなければ、 コピーであることを知ることができないからです。 そこで、コピーがある文の前に空行を入れてみましょう。 つまり、読ませたい文の前に空行を入れるのです。 void FunctionA( int in_a ) { OptionClass* option = new OptionClass; option.Source = "C:\\FolderA"; option.Destination = "C:\\FolderB"; SpecialCopy( option ); option.Source = "C:\\FolderAA"; option.Destination = "C:\\FolderBB"; SpecialCopy( option ); } 始めのうちは、2つ目のブロックに3つ目のブロックの内容が混ざっていることが気になる かもしれません。 ただ、そう思うのは、空行がブロックの区切りとして読むことに慣れている 状態のとき、かつ、処理内容をすべて理解していて、ブロックが正しく分けられていることを 監査している状態のときだけです。 文章を読んで理解しようとしているときではありません。 普段、文章を読んでいて、このあたりに期待する情報が書かれていないだろうなと思ったときは、 今読んでいる文を読み飛ばします。 これは、文書でもコードでも同じで、誰でもすることです。 数行読み飛ばすこともありますが、ほとんどの場合、次の段落まで読み飛ばすことでしょう。 つまり、空行の次の行から読み始めるのです。 この行動は、どんな人でも自然に行う ことなので、空行の次が重要であるという知識やルールは必要ありません。 読む人のルールが少なくなるので、(書くときの)ルールとして優れています。 読ませたい文の前に空行を入れることの有用性に気づいたら、ブロックに分けることの 有用性が相対的に低くなるため、ブロックを分ける位置に空行が無いことに 目くじらを立てなくなります。 ルールのためのルールであってはなりません。 それでも納得できない人のために、ためしに、ブロックを分ける行にも空行を入れて、 ブロックの区切りを明示してみることにしましょう。 void FunctionA( int in_a ) { OptionClass* option = new OptionClass; option.Source = "C:\\FolderA"; option.Destination = "C:\\FolderB"; SpecialCopy( option ); option.Source = "C:\\FolderAA"; option.Destination = "C:\\FolderBB"; SpecialCopy( option ); } 上記のコードを素早く読んでみてください。 目に入るのは、SpecialCopy 関数の呼び出し2つと、 option.Source 変数への代入になると思います。 コードを読んで理解しようとしているときは、 目に入ったコードから情報を入手することになります。 果たして、option.Source 変数への 代入するという情報は概要を知るうえで重要でしょうか。 いいえ、むしろ邪魔な情報になります。 とはいえ、少し余分な情報が増えるだけなので、あまり実害はありません。 ですので、 ブロックの区切りに空行を入れるべきではないというルールは必要ありません。 その代わり、 ブロックの区切りに空行を入れるというルールがあるのなら、そのルールを無くすのがよいでしょう。 なお、ルールを少なくすべきというのは、人間が従うべきルールが少ないほうがいいという のであって、機械にとっては、多くの有用なルールや方針に従わせたほうがいいです。 機械が対応できない分を人間がしようと思っても限界があります。 多くのルールは、必要性な 理由がありそうだというだけで、実際には有用ではなく作業の完了を遅らせることが多いので、 ルールの棚卸しが重要です。 ■■ 注目ニュース 一覧 ■■ ◇ アップルのクックCEO、ハイテク企業の規制は避けられない。 https://japan.cnet.com/article/35128896/ … 規制は好きではないのはみんな同じ。実質的規制をITの巨人がしているのが良くない。 ◇ 現在のAIはとても頭が悪い。グーグルのクラウドAI責任者が語る限界と可能性。 https://japan.cnet.com/article/35128687/ … ディープラーニング以降、それほど発展していないという。次のAIを探る。 ◇ 機械学習で負荷を予測し備えるPredictive Scaling(予測スケーリング)機能がAWSのAuto Scalingに追加。 https://www.publickey1.jp/blog/18/aws_auto_scalingpredictive_scaling.html … 負荷が増える前の何らかのパターンを学習したAI。 ◇ AWS、独自の機械学習用プロセッサ AWS Inferentia 発表。高速な推論処理に特化。AWS reInvent 2018。 https://www.publickey1.jp/blog/18/awsaws_inferentiaaws_reinvent_2018.html … 大量のサーバーに設置するための独自のネットワーク機能がありそう。 ◇ SNSの利用、1日30分にすれば孤独感や抑うつが軽減。研究結果。 https://japan.cnet.com/article/35128878/ … 良い評判を受け続けるのは難しいが、たまには受けたい。 ◇ パスワードなしでMSアカウントにサインイン、Edgeで可能に。 https://japan.cnet.com/article/35128976/ … すでに Chrome や Firefox でサポートしている。Safari は独自方式。 ◇ 任天堂、ゲーム著作物の投稿を非営利で認めるガイドライン。指定サイトで収益化も。 https://japan.cnet.com/article/35129363/ … 任天堂製のソフトの話。 ◇ LG、16眼カメラ搭載スマホの動画合成で特許取得。被写体の角度を撮影後に変更。 https://japan.cnet.com/article/35129372/ … 既存の技術のようだが登録された。 ■■ ソフトウェアデザイン館 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