CleanCode TIL (2022.02.12)


DAY 21
🔖 今日の読書範囲:Final mission
🤓 本の中で覚えたい内容
任務の総括を完成する.
  • コードの作成者です.読者とコミュニケーションするためにきれいなコードを書く責任があります.
  • コードの作成が容易
  • 繰り返しを減らし、表現力を高め、最初から簡単な抽象→本当の問題を考える
  • 良い名前を取るには時間がかかりますが、良い名前で節約する時間はずっとかかります.
  • 変数が長くなると、かえって検索しやすくなります.
  • 発音しやすい名前を使う→建亜木ダヒムス
  • 禁止
  • きれいな名前は人にとって、クラスはコンパイラにとって
  • です.
  • 抽象概念の中で一致する語を選択し、
  • を堅持する.
  • IDEの自動完了を考慮して、不要な接頭辞をすべて追加しないでください.
  • 関数では、インデントレベルは1セグメントまたは2セグメントを超えてはいけません.
  • (指定した関数名の下で抽象レベルが1のステップのみを実行)、
  • 関数のパラメータが少ないほど良いです.
  • 付随効果は発生しないでください!
  • コマンドとクエリーの分離!
  • のエラーコードではなく、例外を使用します.
  • 平均200行のファイル(
  • 500行を超えない)で、大規模なシステム
  • を構築できます.
  • のニュース記事のように書かれています.抽象→詳細、似たような概念は
  • 近くあります.
  • オブジェクトは新しいタイプを追加しやすいが、新しいアクション
  • を追加するのは難しい.
  • データ構造では新しいタイプを追加することは難しいが、新しい動作
  • を追加することは容易である.
  • 優秀な開発者は必ずしも対象に向いているとは限らず、場合によってはプログラムガイドの資料構造も
  • をよく使用する.
  • エラーと比較(不確定)使用例外
  • の例外を引き起こすtry-catchを完了し、論理
  • を追加します.
  • Errorパッケージクラスによる依存性の低減
  • 特殊な状況をデフォルト値に戻し、不要なエラー処理(割り込み)
  • を解消する.
  • NULLを返さず、例外または特殊オブジェクト
  • を返します.
  • メソッドを使用してNULLを渡さないでください.新しい例外を投げ出すか、assert文
  • を使用します.
  • 自動化ユニットテストキットの変更が容易→設計とアーキテクチャの整合性を最大限に維持できる
  • 可読性はテストコードにおいて実際のコードよりも重要→Build-Operate-Checkモード
  • テストコードは、実際のコードのように効率的に→テスト環境で実行する必要がないため、
  • .
  • 各概念のassert数を最小限に抑え、
  • テスト関数は、1つの概念
  • のみをテストします.
  • テストには、高速、独立、繰り返し可能、自己検証、定期テスト
  • が必要です.
  • 類責任の個数は小さい→簡潔な25語程度
  • は、機能および名称が明確な要素
  • を区切るための複数の小さな引き出しである.
  • 類を分離し、凝集度を高める
  • クラス区分が小さく、
  • を変更しやすい
  • は、具体的な実施ではなく抽象的に境界
  • を分離する.
  • SRP、OCP、DIP原則
  • を遵守
    1.1つのみ実行(指定した関数名の下に抽象レベルが1つしかないステップ)
    🥲 **Before**
    const handleConnect = () => {
        let config = data[dbIdx];
        localStorage.setItem("alias", config.alias);
        localStorage.setItem("config", JSON.stringify(config));
        execPost("/connect", {
          config: config,
        })
          .then((res) => {
            console.log(res.data);
            if (res.data === "CONNECTED") {
              setIsConnected(true);
              history.push("/dashboard");
            }
          })
          .catch((err) => {
            console.log(err);
          });
      };
    😍 **After**
    const handleConnect = () => {
    		let config = data[dbIdx];
    		saveConnect();
        moveToDashboard();
      };
    
    const saveConnect = () => {
      localStorage.setItem("alias", config.alias);
      localStorage.setItem("config", JSON.stringify(config));
    }
    
    const moveToDashbaord = () => {
    		execPost("/connect", {
          config: config,
        })
          .then((res) => {
            console.log(res.data);
            if (res.data === "CONNECTED") {
              setIsConnected(true);
              history.push("/dashboard");
            }
          })
          .catch((err) => {
            console.log(err);
          });
    }
  • HandleConnectには多くの作業があるため、saveConnectとmoveToDashboardを実行するために別々の関数に分離することができます.
  • 論点については,関数外のものを用いることができるかどうか,再検討が必要である.
    2.発音しやすい名前を使う
    🥲 **Before**
    const toYYYYMMDD = (date) =>
        new Date(date - date.getTimezoneOffset() * 60000)
          .toISOString()
          .split("T")[0];
    😍 **After**
    const generateDate = (date) =>
        new Date(date - date.getTimezoneOffset() * 60000)
          .toISOString()
          .split("T")[0];
  • の本でgenymdhmsの名前を見て腹を抱えて笑った.でも私にもあります.Two WiiとYi M DJ...
  • 直ちに関数の名前を→generateDate,
  • に変更
    3.NULLではなく、例外または特殊なオブジェクトを返します.
    🥲 **Before**
    function closePool(name) {
      if (Object.prototype.hasOwnProperty.apply(POOLS, [name])) {
        const pool = POOLS[name];
        delete POOLS[name];
        if (typeof pool.close === "function") {
          return pool.close();
        } else {
          return null;
        }
      }
    }
    😍 **After**
    
    function closePool(name) {
      if (Object.prototype.hasOwnProperty.apply(POOLS, [name])) {
        const pool = POOLS[name];
        delete POOLS[name];
        if (typeof pool.close === "function") {
          return pool.close();
        } else {
          throw Error("Could not close pool")
        }
      }
    }
  • Poolをオフにできない場合はnullではなく正確なエラーを投げ出すように変更します.
    🤔 浮想
  • まず修正が必要なコード量が不足している.これまでに書かれたコードやrepoの数は多いと思いますが、実際に見るとほとんどのコードがフロントエンドであり、Niko Samの講義に基づいて、すでに小さな関数によく分けられており、例を見つけるのは難しいです.
  • 🔎 n.問題

  • 📝 感想3行ダイジェスト
  • 実際には、自分のコードに本の内容を適用して汚れを探すのは難しいです.
  • がクリーンな距離を作ることができるように、スクリプトの作成から始まるコード量
  • を増やすべきである.
  • 保理は本当に
  • を継続するために多くの時間と精力を費やす必要があります.