Clean Code Notes

4805 ワード

一、有意義な命名及び関数
  • 類名:使用名詞,方法名:動詞
  • バイリンガルを使用しないでください.同じ単語を異なる目的で使用することを避けます.eg. add
  • ソリューションレルム名を使用します.eg. JobQueue;プログラマーが熟知している用語を使用して手元の作業に名前を付けることができない場合は、関連する問題からの名前を使用します.
  • 関数は短くなければなりません(行ごとに150文字、100行を超えず、20行が最も優れています).
  • 関数は1つのことしかしないが、設計モデルと同様に、できるだけ単一の権責原則と開閉原則に従うべきである.
  • 各関数の文は、同じ抽象レベルにあるはずです.
  • ウォードの原則:各インスタンスが自分の意に合っていると感じたら、それはクリーンコード(長い名前のメソッド名を恐れない)
  • です.
  • 関数のパラメータ:最も理想的なパラメータの数はゼロで、次に1で、再び2で、できるだけ3を避けます.3つ以上のパラメータを使用するには十分な特殊な理由があります(アリババJava開発マニュアル:同じパラメータタイプ、同じビジネス意味、Javaの可変パラメータを使用することができます.可変パラメータは最後に置いて、できるだけ可変パラメータを使用しないで、Objectの使用を避ける)
  • 識別パラメータ:醜くて、render(Boolean isSuite)はこの関数がtrueとして識別されると、falseのためにそうすることを表しています.二つに分けるべき--renderForSuite()とrenderForSingleTest()
  • 二元及び三元関数:単一値の秩序構成部分が不確定である場合、多重関数は
  • を選択するのに良いものではない.
  • パラメータオブジェクト:関数が2つ、3つまたは3つ以上のパラメータを必要とする場合は、いくつかのパラメータがクラスにカプセル化されるべきであることを示します.Circle makeCircle(double x,double y,double radius) Circle makeCircle(Point center,double radius)

  • 後者は前者より優れている
  • 関数とパラメータ:非常に良好な動詞/名詞対形式write(name)
  • であるべきである
  • 副作用なし:関数を実行するとき、他の部分の変更をもたらすべきではない
  • 区切り命令と質問:関数は何をするか、何を答えるか
  • エラーコードを返す代わりに異常を使用して、Try/Catchコードブロックを抽出する.Try/Catchコードブロックは醜くて、コード構造を混乱させて、その中の内容を単独で関数に書いたほうがいいです.

  • 二、注釈
  • 注記悪いコードを美化することはできません.
  • をコードで説明したほうがいいです.
  • TODOはプログラマーがやるべきだと思っていますが、いくつかの理由でまだやっていない仕事のため、不要な特性を削除したり、問題に注意したりするように注意したりする可能性があります.
  • 悪い注釈:つぶやき、余計な注釈、誤導的な注釈、規則的な注釈、ログ的な注釈、くだらない話の注釈.(p55-p61)
  • にあるべきでない注釈:位置タグ、括弧の後ろの注釈、帰属と署名、注釈の落ちたコード、HTML注釈、非ローカル情報、情報過多、明らかでない連絡(p 62-p 65)
  • 非共通コードのJavadoc
  • 三、フォーマット
  • 垂直形式単一ファイルコード行数fitneseは200行から500行の間の
  • が多い.
    (著者らは,できるだけコードを単一のファイルに簡略化し,ファイル間のコード行数の最小値と最大値の差を大きくしないようにすると考えている)
  • 新聞に学ぶ(上から下へ、内容は逐次展開される).実際のプログラミングでは注意が難しい
  • 適切な改行
  • メソッドとメソッドの間
  • 変数とメソッド間
  • importとクラス間
  • importシステムクラスとインポートパッケージのクラスまたはカスタムクラスの間の
  • 垂直距離
  • 変数宣言は、使用位置
  • にできるだけ近づくべきである.
  • エンティティ変数はクラスの上部宣言
  • に配置する必要があります.
  • 関連関数はできるだけ一緒に置くべきで、1つの方法はこのクラスの別の方法を呼び出して、できるだけ1つの
  • に置くべきです.
  • 概念に関するコードは一緒に置くべきで、リロードの方法も
  • と計算される.
  • 横方向距離(1行のコードで使用される文字[アリババjava開発マニュアルに定義がある]、水産物の位置合わせ、水平方向の取個と近接-不承認)
  • 同じレベルのコードは同じレベル(Pythonでは強制インデント)
  • にインデントすべきである.

    四、オブジェクトとデータ構造
  • プロセス向けコードとオブジェクト向けコード(p 89−p 90)は、オブジェクト向けが難しいことに対して、プロセス向けコードに対しては容易であり、逆も同様である.
  • デメテル則は、クラスCのメソッドfは、以下のオブジェクトのメソッドのみを呼び出すべきであると考えている.
  • C
  • fによって作成されたオブジェクト
  • は、パラメータとしてfのオブジェクト
  • に渡す.
  • Cのエンティティ変数が持つオブジェクトメソッドは、関数が返されるオブジェクトのメソッドを呼び出すべきではありません.言い換えれば、友人とのみ会話し、見知らぬ人とは会話しません.(実生産環境用jfinal service調daoは、このエンティティクラスの静的内部オブジェクトであり、ssmとは異なる)
  • DTO(Data Transfer Objects)にはビジネス・ルール・コードがないほうがいいです.

  • 五、エラー処理
  • は、戻り符号
  • ではなく異常を用いる.
  • try-catch-finally
  • を先に書きます
  • ある意味では、tryコードブロックはトランザクションのように、catchコードブロックはtryコードライブラリで何が起こってもプログラムを継続的に維持します.
  • は、異常が発生した環境の説明を与える.
  • null値を渡さないでください:判定の代わりに断言を使用できます.assert p1 != null: "p1 should not be null";

  • 六、境界
  • 学習log 4 j
  • 使用上まだ存在しないコード:アダプタモード(著者が採用した)
  • 七、類
  • クラスの組織:共通静的変数->プライベート静的変数->プライベートエンティティ変数.共通エンティティ変数
  • はめったに発生しません.
  • クラスは短くなければならない:クラスに対して、私たちは異なる測定方法を採用して、権利と責任を計算します.
  • 単一の権利と責任の原則:クラスまたはモジュールは、修正された理由が1つしかありません.
  • 集約:クラスにはエンティティ変数が少量しかないはずです.クラス内の各メソッドは、この変数を1つ以上操作する必要があります.
  • では、Sqlクラスの再構成が例示されている.Sqlクラス内のすべてのCRUDメソッドをgenerateメソッドとして抽象化し、対応するCRUDクラスによって継承します.(現在のjfinalとは使用方法が異なり、設計モード開閉の原則に違反しているが、中小規模プロジェクトの開発には逆設計モードの方が便利だと思う)
  • 八、システム
  • 依存注入(Dependency Injection DI)、制御反転(Inversion of Control IOC):分離構造と使用を実現でき、制御反転は第2の権限責任を対象から取り出し、別の集中対象に転義し、単一の権限責任の原則に従った.初期設定はグローバルな問題であるため、この認証メカニズムは通常mainルーチンであるか、特定の目的を持つコンテナである(SpringではConcurrentHashMapをコンテナとして採用している).
  • 拡張:緩和結合を達成するためにAOPを用いていくつかのコードの挙動修正を実現した.(最終的なシステムでは、システム内のモジュールは高集約低結合状態に達し、拡張しやすい)
  • Javaエージェント:詳細p 148
  • 九、同時プログラミング
  • 同時はデカップリングポリシーである.それは私たちが何をするか(目的)といつ(タイミング)を分解するのに役立ちます.
  • よく見られる迷いと誤解
  • 同時でパフォーマンスを向上させることができますか?同時にパフォーマンスが向上し、複数のスレッドまたはプロセッサ間で多くの待機時間を共有できる場合にのみ使用できます.事はそんなに簡単ではない.
  • コンカレントプログラムを作成するには、設計を変更する必要はありません.実際には、コンカレントアルゴリズムの設計は、単一スレッドシステムの設計と極めて異なる可能性があります.目的と時間のデカップリングは往々にしてシステム構造に大きな影響を及ぼす.
  • WebまたはEJBコンテナを採用する場合、同時問題を理解することは重要ではない(実際の開発ではservlet向けに開発されている...)
  • 併発防御原則
  • 単一責任原則は、同時関連コードを他のコードと分離することを提案する
  • .
  • データの役割ドメインに同時問題が発生する原因を制限して、実は共有変数で、JMMの中で、共有変数はホストメモリの中に存在して、複数のスレッドはホストメモリの中から共有変数を現在のスレッドの中にコピーして、スレッドの内部で変数に対する操作を行います.CPUは各スレッドにタイムスライスを割り当て、スレッドAが共有変数をプライマリメモリに戻す前に、スレッドBはCPUが割り当てたタイムスライスを得た可能性がある.Aスレッドが共有変数をプライマリメモリにタイムリーにリフレッシュしていないため、BスレッドはAスレッドの修正を経ていない値を取得し、データと理想状況が一致しない.最も古典的なマルチスレッド入門で、自己増加操作を行う場合、マルチスレッドを開いて操作を行うと、結果は常に期待値以下になります.例えば` java
  • int num=0;
        for(int i=0;i<100;i++){
          num++;
      }
     }