「読みやすいコードを書く技術」読書メモ
この本は、より良いコードを書くのに役立つように設計されています
コードは、他の人が理解するのにかかる時間を最小限に抑える方法で記述する必要があります
コードを理解するのに必要な時間を最小限に抑えることがより良い目標です
まったくやり取りがありません
他の人があなたのコードを理解しやすく、余分な時間が必要かどうかを常に考えてください
適切な名前を選択し、適切なコメントを書き、より適切な形式でコードをきちんと記述します
その機能を用語的に区別し、より表現力豊かな言葉を見つけます
適切な名前は、変数の目的または変数が持つ値を説明する必要があります
tmp、lt、retval などの一般的な名前を使用する必要がある場合は、十分な理由が必要です
変数、関数、その他の要素に名前を付けるときは、抽象的ではなく、より具体的に説明してください
変数について読者が知っておくべき重要な点がある場合は、名前に追加の「単語」を追加する価値があります。
単位付きの値、追加の重要な属性
名前は長すぎてはなりません
短い名前は狭い範囲で使用できます
長い名前を入力しても問題ありません (エディターの「単語補完」機能)
頭字語と略語
無駄な言葉は捨てましょう
CamelCase クラス名、アンダースコア メソッド名、定数 CamelCase と kConstant プレフィックス、マクロはすべて大文字とアンダースコア、コンストラクターの最初の文字は大文字、jQuery オブジェクトの前には $
大文字、下線などを意図的に使用します
「この名前は他の人によって別の意味を持つものとして解釈されるだろうか?」と何度か自問してください。
曖昧な言葉で、「選ぶ」という意味なのか「引く」という意味なのかわかりません
曖昧な単語は末尾から削除するか、最大長の段落を切り取る場合があります
制限に名前を付ける最も明確な方法は、制限したいものの前に max または min を追加することです。
ブール値を返すブール変数または関数の名前を選択するときは、true と false を返す意味が明確であることを確認してください。
反意名の使用は避けるのが最善です。 「disable_ssl」など。
名前によっては、たとえそれが意図したものではなくても、ユーザーがその意味について先入観を持っているため、誤解を招く可能性があります。この場合、その名前をやめて、誤解を招きにくい名前を使用することをお勧めします。
それぞれの代替名を分析し、誤解の可能性を考慮します。
コードを読みやすくするには、次の 3 つの原則があります。
。読者がスタイルにすぐに慣れるように、関連するコード行をコード ブロックにグループ化します。
美的感覚が非常に重要な理由改行を再配置して、一貫性とコンパクトさを保ちます
必要に応じて列の配置を使用します
。変数の順序を HTML フォームの対応する フィールドの順序と一致させます。
をアルファベット順に並べ替えます。
第5章 どのようなコメントを書き換えるべきかコメントは不要です
コメントのためのコメントはしないでください
悪い名前にはコメントを追加しないでください。良い名前に変更してください
あなたの考えを記録してください
読者の視点に立って
起こり得る落とし穴を発表
コメントを全体的に表示し、新しい人が参加することを検討し、コードベースに慣れてもらいます
最終的な考え—「著者のブロック」を克服する
あれ、これ
このファイル内の行数を返し、ファイル内に改行バイト ('n') が何バイトあるかをカウントします
例
やりたいこと
デフォルトパラメータ Connectc(timeout = 10, user_encryption = false)
それができない場合は、Connet(/* timeout_ms= */ 10, /* use_encryption = */ false) を使用してください
コメントが長すぎると感じる場合は、一般的なプログラミング シナリオを使用してコメントを説明できるかどうかを確認してください
コード内の「思考の荷物」を最小限に抑えるようにしてください
条件、ループ、その他の変更を加えて、フローをできるだけ「自然に」制御します。読者がコードを止めて読み直す必要がないようなメソッドを使用してください
比較の左側は、比較の右側の「クエリされた」式であり、比較に使用される常に変化する式に傾きがあり、その値は定数に傾きます
。負論理ではなく正論理の場合を最初に処理します。たとえば、if(!debug) の代わりに if(debug) を使用します。 . まず単純なケースを取り除きます。このアプローチにより、if と else が画面上に表示されるようになり、興味深い状況や疑わしい状況を最初に処理できるようになります
コード行を最小限に抑えることを追求するのではなく、より良い指標は、人々がコードを理解するのにかかる時間を最小限に抑えることです。
デフォルトでは if/else を使用します。三項演算子?: 最も単純な場合にのみ使用します
私の経験では、do ステートメントはエラーと混乱の原因です...私は条件文を「目に見えるところに前に置く」傾向があります。その結果、私は do ステートメントの使用を避ける傾向があります。
Goto は避けるべきです
深くネストされたコードは理解しにくい
コードに変更を加えるときは、新しい視点からコードを見て、全体を見てください
早めに戻ることで巣作りを減らします
コード内で「スレッド」、「セマフォ」、「例外」、「関数ポインターと匿名関数」、および「仮想メソッド」を多用しすぎて、実装プロセスが高度になり、理解しにくくなる場合があります。
長い表現を理解しやすいように小さな部分に分割します
一時中間変数
それぞれ、否定、変換、および/または
「賢い」小さなコードには注意してください。後で読む他の人にとって混乱を招く傾向があります。
struct Range{ int begin; int end; //For example,[0,5) overlaps with [3,8) bool OverlapsWith(Range other);}
反対の比較
bool Range::OverlapsWith(Range other){ if(other.end <= begin) return false; if(other.begin >= end) return false; return true;}
共通部分を抽出し、集計変数として関数に入れる
マクロを定義する
変数が増えるほど、それらすべてを追跡するのが難しくなります
変数のスコープが大きいほど、その動きを追跡するのに時間がかかります
変数が頻繁に変更されるほど、その現在の値を追跡するのが難しくなります
値のない一時変数
中間結果を削減
制御フロー変数を減らす
変数を可能な限り少ないコード行で表示できるようにします。
変数を操作する場所が増えるほど、その現在の値を判断するのが難しくなります。
関数レベルでのコードへのより大きな変更
関数またはコードのブロックを見て、このコードの高レベルの目標は何なのかを自問してください。
コードの各行について、「それは目標に向かって直接的に機能しますか?」と尋ねます。このコードの大まかな目標は何ですか?
十分な関数が無関係な部分問題を解決する場合は、コードを独立した関数に抽出します。
一般的なコードとプロジェクト固有のコードを分離する
サブコード自体を呼び出すと、サブコードの改善が容易になります
共通コードが優れているのは、「プロジェクトの残りの部分から完全に切り離されている」ためです。
最適ではないインターフェイスに決して妥協すべきではありません
分割が細かすぎて、小さな機能が複数あると読みにくくなります
コードは、一度に 1 つのことを実行できるように編成する必要があります。
投票の例
おばあちゃんに説明できないことは、それを本当に理解していないということです。
自然言語でロジックを説明する
洗練されたコードを書くことの一部は、ライブラリが提供するものを理解することです。
自然言語はロジックを記述し、それ自体を適切に再帰的に呼び出します
読むのに最適なコードはコードなしです
コードベースを可能な限り小さく軽量にしてください
無駄なコードを削除
時々、15 分かけて標準ライブラリ内のすべての関数/モジュール/型の名前を読んでください
成熟したライブラリでは、コードの各行が多くの設計、デバッグ、書き換え、ドキュメント化、最適化、テストを表します。
次のような新しいコードの作成は避けてください:
。プロジェクトから不要な機能を削除し、過剰なデザインをしないでください。
。要件を再考し、仕事が完了する限り、最も単純なバージョンの問題を解決します。
。標準ライブラリの API 全体を定期的に読んで、よく理解してください。
他のプログラマーが快適に変更したり追加したりできるように、テストは読み取り可能である必要があります
このテストを読みやすくします
より重要な詳細が目立つように、重要でない詳細をユーザーから非表示にします
最小限のテスト宣言を作成します
ほとんどのテストの基本的な内容は、「このような入力/出力状況では、このような動作/出力が期待される」というものに絞り込むことができます
カスタマイズされた「マイクロ言語」を実装する
エラーを表示するライブラリについて学習します
手作りのエラー メッセージ
エラー メッセージはできる限り役立つものである必要があります
基本原則は、テスト対象のコードを完全に使用できる最も単純な入力セットを選択する必要があるということです
シンプルで仕事を完了させるテストの方が価値があります
1 つの関数に対する複数のテスト
テスト__()
テストしやすいコードの作成を開始します。
。テストを可能にするためだけに実際のコードの可読性を犠牲にします。テストが製品開発の障害になるようにします。
過去 1 分および 1 時間に Web サーバーが転送したバイト数を追跡します。