JavaScript設計原則とプログラミング技術

3150 ワード

本文は本人が『JavaScriptデザインモデルと開発実践』(曽探著)についての総括から来ています.具体的な内容を詳しく知りたいので、この本を読むことをオススメします.
1.単一責任原則(SRP)
定義:一つの対象(方法)は一つのことしかしない.
設計モードのSRP
  • プロキシモード:画像プリロード、プリロード機能はプロキシオブジェクトに配置されます.
  • .アプリDivは本来はdivのレンダリングだけを担当していましたが、巡回の効果も担っています.ここでは、ディエ代機を使ってエルゴード機能を抽出し、レンダリングして一つのコールバック関数とします.
  • 単例モード:管理単例の機能を提示する.
  • 装飾者モード:装飾者は追加の機能を実行する.
  • 長所と短所:
  • の利点:単一クラスまたはオブジェクトの複雑さを低減し、維持しやすい.
  • 欠点:単一クラスの複雑さが減少し、一部のオブジェクト間の相互接続の複雑さを意味する.
  • 2.最小知識原則(LKP)
    定義:1つのソフトウェアエンティティは、他のエンティティと少なく相互作用するべきである(対象、システム、関数、モジュール、コンポーネントなど).
    例えば、将軍がいくつかの兵舎を掘りたいなら、まず少佐と呼ぶことはできません.大尉を呼んで、もう一人の兵士を呼んで、任務を手配します.彼は少佐というだけで、他の人に任せたらいいです.
    設計モードのLKP
  • 仲介者モード:飛行機が飛行し、管制塔を導入する.
  • パッケージに反映されるLKP:変数の視認性をできるだけ小さい範囲に制限して、この変数は他の関連しないモジュールに与える影響が小さいほど、書き換えられて衝突する確率が小さいです.
    3.開放-閉鎖原則(OCP)
    定義:ソフトウェアエンティティ(クラス、モジュール、関数など)は拡張可能ですが、変更できません.ソフトウェアプログラミングの中で一番重要な原則です.
    引申:プログラム機能を変更する必要がある場合や、このプログラムに新しい機能を追加する場合は、コードを追加する方式を使用することができますが、ソースプログラムを変更することはできません.
    変化の場所を探してください.プログラムが変化する部分を見つけて、変化をカプセル化します.
  • ホックを置く:サブクラスの個別化処理を与える.
  • は、コールバック関数を使用する.
  • デザインモードのOCP:
  • は、新しい購読者がいるときに、発行者のコードを変更する必要はありません.
  • テンプレート方法モード:サブクラスで実行される方法と順序は変更されず、具体的にどのように実現されるかは可変である.
  • ポリシーモード:ポリシーとポリシークラスを使用することは別です.
  • 責任チェーンモード:現在実行できないものは直接に次のノードに渡し、変更がある場合はノードを追加すればいいです.
  • 相対性:
  • 最も変化しやすいところを選び、抽象的な閉鎖的な構造に変化します.
  • 変更が避けられない時、できるだけ修正しやすいところを修正します.
  • 4.基礎コードの再構築
  • 合併重複条件判断:
  • var totalPage = 100;
    
    var paging1 = function(currPage) {
      if(currPage <= 0) {
        currPage = 0;
        jump(currPage);
      } else if(currPage >= totalPage) {
        currPage = totalPage;
        jump(currPage);
      } else {
        jump(currPage);
      }
    }
    
    jump関数は3回書いて、完全に抽出できます.
    var paging2 = function(currPage) {
      if(currPage <= 0) {
        currPage = 0;
      } else if(currPage >= totalPage) {
        currPage = totalPage;
      }
      jump(currPage);
    }
    
  • 条件分岐文を関数に抽出します.
  • var getPrice = function(price) {
      var date = new Date();
      if(date.getMonth() >= 6 && date.getMonth() <= 9) {
        return price * 8;
      }
    
      return price;
    }
    
    function isSummer() {
      return date.getMonth() >= 6 && date.getMonth() <= 9;
    }
    
    ifの中の語句の意味は弱すぎて、直接に1つの関数に精錬することができて、語意を強めます.
  • サイクルを合理的に利用する:いくつかの関数が起動できるかどうかを判断するなら、1つずつif-elseを書かないでください.サイクルを直接利用することができます.
    var funcArr = [func1, func2, func3];
    
    for(var i = 0,func; func = funcArr[i++];){
        if(!func) {
            return;
        }
        func();
        break;
    }
    
  • 事前に関数をネストされた条件分岐の代わりに退出させる:
  • var del = function (obj) {
      var ret;
      if (!obj.isReadOnly) {
        if (obj.isFolder) {
          ret = deleteFolder(obj);
        } else if (obj.isFile) {
          ret = deleteFile(obj);
        }
      }
      return ret;
    }
    
    var del = function (obj) {
      if (obj.isReadOnly) {
        return;
      }
      if (obj.isFile) {
        return deleteFile();
      }
      if (obj.isFolder) {
        return deleteFolder();
      }
    }
    
  • は、長すぎるパラメータの代わりに対象パラメータを伝達する
  • .
  • パラメータ数をできるだけ減らす.
  • 多層三目ネストを使用しない
  • チェーン式の呼び出しを合理的に使用する:デバッグに不便な
  • もし一つの種類が大きすぎるなら、それぞれの小分類
  • に分割することを提案する.
  • は、リセットで多層サイクル
  • を終了する.