IT ニュース&コラム 2018/ 4/23 通巻761号 技術版 ソフトウェアデザイン館 Sage Plaisir 21  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ■■ if節と主節を逆にするな - リーダブル コード(49) ■■ 日本語では、「もし A なら B です」の A と B を入れ替えて「Bです。もし A ならね」としゃべる人はほとんどいません。アップルの宣伝ぐらいです。 しかし、英語では if節(従属節)を、主節の後(右側)に書く場合が結構ある 印象があります。 結構ショッキングなので、英語はそうなのかと思っていました が、実際にはどちらの順序でもいいそうです。 英語のネイティブの方も、「Bです。」と言われてから、「Aならね」と 言われると肩透かしにならないんでしょうか? 主節(B)が長いときは、 「もし A なら B です」のが多いらしいので、やはり軽く肩透かしを食らって いると思います。 プログラミング言語では、ご存知の通り、「もし A なら B です」の順になります。 C言語なら「if ( A ) { B }」と書きます。 分かりやすいですね。 しかし、条件が多重にある場合は、プログラミング言語でも分かりにくくなる ケースがあります。 次のC言語のコードの最後の行にある条件文がどういう意味か読んでみてください。 char* path = ...; bool is_skipping_period_file = ...; if ( path[0] != '.' || ! is_skipping_period_file ) { ... } 直訳すると「文字列 path の先頭の文字がピリオドではないとき、または、 is_skipping_period_file(ピリオドから始まる名前のファイルをスキップする設定) ではないとき」になります。 よく分からないですね。 実はこの if 文での内容は単純で、is_skipping_period_file (ピリオドから始まる名前のファイルをスキップする設定)に関する処理内容、 ただそれだけなのです。 もっと読みやすいコードにできないか考えた結果、次のコードになりました。 char* path = ...; bool is_skipping_period_file = ...; if ( is_skipping_period_file ) { is_skipping = ( path[0] == '.' ); } else { is_skipping = false; } if ( ! is_skipping ) { ... } 直訳すると「is_skipping_period_file(ピリオドから始まる名前のファイルを スキップする設定)なら、文字列 path の先頭の文字がピリオドのファイルは スキップして、is_skipping_period_file(ピリオドから始まる名前のファイルを スキップする設定)ではないときは、スキップしない」という意味です。 if節と主節で同じことを言っていますね。if文を満たさない場合でも、if節と 主節で同じことを言っていますね。 だから、if 〜 else 〜 の 5行が is_skipping_period_file に関する処理(しか行っていない)と分かります。 簡単な処理内容でしたね。 読みやすくしたコードは処理速度がごくわずかだけ遅いケースがあります。 それは、フォルダーの中のすべてのファイルについて、is_skipping_period_file の処理を行う場合です。 先頭がピリオドのファイルは、一般に少ないため、 元のコード if ( path[0] != '.' || ! is_skipping_period_file ) { ... } は、|| の左の判定文だけ実行することになります。 読みやすいコードは、 is_skipping_period_file = true のときに必ず 2つの判定文を実行する ことになります。 この読みやすいコードは論理的に遅いコードなのですが、実際に計測すると、 この程度の処理量の違いは、数値に表れません。 説明変数を活用すれば、 処理量の違いを抑えることもできます。 よって、読みやすいコードに すべきです。 どうしても論理的に速いコードにしたいときは、次のようなコードに するとよいでしょう。 #if 0 // readable code if ( is_skipping_period_file ) { is_skipping = ( path[0] == '.' ); } else { is_skipping = false; } #else // faster code if ( path[0] == '.' ) { is_skipping = is_skipping_period_file; } else { is_skipping = false; } #endif if ( ! is_skipping ) { ... } #if 0 の部分をコメントで表現するべきだ、何のためにコメントを書く ルールにしていると思っているんだ、という人がいたら、ルールの副作用 に気づいていません。 コメントにすると次のようにあいまいになって 理解に苦しむソース ファイルになってしまいます。 // ピリオドから始まる名前のファイルをスキップする設定の処理をする if ( path[0] == '.' ) { is_skipping = is_skipping_period_file; } else { is_skipping = false; } if ( ! is_skipping ) { ... } レビュアーは「コメントを読んですぐに理解できるようになったから良くなった じゃないか」と言うでしょうが、それは単にレビュアーがコードの概要を知った だけです。 コードのレビューになっていません。(多くのレビューは、これで 済ますため、レビューで品質が上がるわけがありません) また、コードを見るのは バグが起きたときや移植するときがほとんどなので、結局、コード(変数)の 論理関係(処理)を理解しなければなりません。 その理解しようとするコードは 読みにくいコードしかないため、余計に時間がかかってしまうというわけです。 コメントを書くことより、コード自体をリーダブルにする必要があるのです。 ■■ 注目ニュース 一覧 ■■ ◇ 政府、海賊版サイトへの緊急対策案を発表。漫画村、Anitube、Miomio を名指し。 https://japan.cnet.com/article/35117716/ … 予告してからブロッキングする個別対応のほうが言論の自由は守れそう。 ◇ マイクロソフト、物体とデジタルをつなぐマット型デバイスを発表へ。 https://japan.cnet.com/article/35117469/ … カードゲーム型のゲームなどに。 ◇ AbemaTV、プレミアムプラン向けに動画ダウンロード機能。 https://japan.cnet.com/article/35117526/ … 外でも高画質な録画番組を安定して見れるようになる。 ◇ 機内の客室乗務員に Xperia Ear Duo。JALが業務改善や効率化の実証実験。 https://japan.cnet.com/article/35117593/ https://japan.cnet.com/article/35117503/ … 美観が損なわれないことは大事。 ◇ YouTube、作者の自己申告機能をテスト。広告掲載の誤判定を防ぐ。 https://japan.cnet.com/article/35118018/ … ファンによるスポンサー制度も実験中。 ◇ W3C、パスワード不要のウェブ認証 Web Authentication を勧告候補に。 https://japan.cnet.com/article/35117538/ … パスワードを経由しなくても生体認証できるようになる。 ◇ 世の中はムダな熱であふれている。体温で発電、充電不要な MATRIX PowerWatch https://japan.cnet.com/article/35117601/ … 100ワットの発電ができるらしい。 ◇ Facebook、非ユーザーの情報収集はTwitterやグーグルも実施と説明。 https://japan.cnet.com/article/35117931/ … Amazon、Google、Twitter も非難されるべき。 ◇ エアバス、飛行機の機体検査にドローンを活用。周囲を自律飛行させて傷を発見。 https://japan.cnet.com/article/35117819/ … 検査場に入らなくてもすぐチェックできる。 ◇ 店内ならどこでも決済できるローソンスマホペイ。深夜帯のレジ無人化の実験も。 https://japan.cnet.com/article/35117645/ … 万引きをどう防ぐのか。 ◇ Windows File Manager がオープンソース化、Windows 10 で実行可能に。 https://japan.cnet.com/article/35117548/ … Windows 3.0 のもの。 ◇ アップル、隠れて見えない物を見る技術。自動車ドライバー向けAR技術で公開特許。 https://japan.cnet.com/article/35117435/ … 相変わらず既存の技術で出来そう。 ■■ ソフトウェアデザイン館 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