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