jsの中の設計の原則とプログラミングの技巧
8998 ワード
1設計の原則
1.1単一職責原則(SRP)
意味:各対象/方法は一つの役割しかしない.
例:ワンケースモードでdivを作成する方法:取得例と作成divを分離して実現する.は、単一の方法/オブジェクトの複雑性を低減する .は、コードの多重化およびユニット試験 を容易にする.一つの職責が変化した場合、他の職責に影響を与えない. 職責分離の原則:職責間の独立は相互に影響しない. 二つの職責がいつも同時に変化するなら、分離する必要がない. 一緒にいるいくつかの職責が何の変化もないなら、分離する必要がない.
デメリット: コードの複雑さを増加させる は、オブジェクト間の相互接続の難しさを増大させる.
1.2最小知識原則(LKP)
意味:1つのソフトウェアエンティティは、できるだけ他のエンティティと相互作用しなければならない.ソフトウェアエンティティは、オブジェクト、クラス、モジュール、システム、変数、関数などを含む.
例:仲介者モード、ショッピングモールで携帯電話を購入し、携帯電話の色、購入数量、携帯電話のメモリを選択できます.在庫が十分ある場合、購入ボタンをクリックしてもいいです.在庫が足りない場合、ボタンをクリックしてはいけません.在庫不足の情報方法を表示します.次の行動を仲介者に実行させる.実現:
1.1単一職責原則(SRP)
意味:各対象/方法は一つの役割しかしない.
例:ワンケースモードでdivを作成する方法:取得例と作成divを分離して実現する.
var getSingle = function(fn:Function) {
var result:any
return function () {
return result || (result = fn.apply(this,arguments))
}
}
var createDiv = function () {
var div = document.createElement('div')
div.innerHTML = ' div'
document.body.appendChild(div)
return div
}
var createSingleDiv = getSingle(createDiv)
var div1 = createSingleDiv()
var div2 = createSingleDiv()
div1 === div2 //true
利点:デメリット:
1.2最小知識原則(LKP)
意味:1つのソフトウェアエンティティは、できるだけ他のエンティティと相互作用しなければならない.ソフトウェアエンティティは、オブジェクト、クラス、モジュール、システム、変数、関数などを含む.
例:仲介者モード、ショッピングモールで携帯電話を購入し、携帯電話の色、購入数量、携帯電話のメモリを選択できます.在庫が十分ある場合、購入ボタンをクリックしてもいいです.在庫が足りない場合、ボタンをクリックしてはいけません.在庫不足の情報方法を表示します.次の行動を仲介者に実行させる.実現:
index.html
:
:
:
:
:
:
main.js
var goods = { //
"red|32G": 3,
"red|16G": 0,
"blue|32G": 1,
"blue|16G": 6
};
Function.prototype.after = function (fn) {
var self = this;
return function () {
var ret = self.apply(this, arguments);
if (ret === 'nextSuccessor') {
return fn.apply(this, arguments);
}
return ret;
}
};
var colorCheck = function (obj,color,memory,number,stock,nextBtn) {
if (obj === colorSelect) { //
colorInfo.innerHTML = color;
}
if(!color) {
nextBtn.disabled = true;
nextBtn.innerHTML = ' ';
} else {
return 'nextSuccessor'
}
}
var memoryCheck = function (obj,color,memory,number,stock,nextBtn) {
if (obj === memorySelect) {
memoryInfo.innerHTML = memory;
}
if(!memory) {
nextBtn.disabled = true;
nextBtn.innerHTML = ' ';
} else {
return 'nextSuccessor'
}
}
var numCheck = function (obj,color,memory,number,stock,nextBtn) {
if (obj === numberInput) {
numberInfo.innerHTML = number;
}
if(!Number.isInteger(number - 0) || number <= 0) {
nextBtn.disabled = true;
nextBtn.innerHTML = ' ';
} else if(number > stock){
nextBtn.disabled = true;
nextBtn.innerHTML = ' ';
} else {
nextBtn.disabled = false;
nextBtn.innerHTML = ' ';
}
}
var checkBtn = colorCheck.after(memoryCheck).after(numCheck)
var mediator = (function () {
var colorSelect = document.getElementById('colorSelect'),
memorySelect = document.getElementById('memorySelect'),
numberInput = document.getElementById('numberInput'),
colorInfo = document.getElementById('colorInfo'),
memoryInfo = document.getElementById('memoryInfo'),
numberInfo = document.getElementById('numberInfo'),
nextBtn = document.getElementById('nextBtn');
return {
changed: function (obj) {
var color = colorSelect.value, //
memory = memorySelect.value, //
number = numberInput.value, //
stock = goods[color + '|' + memory]; //
checkBtn(color,memory,number,stock,nextBtn)
}
}
})();
// :
colorSelect.onchange = function () {
mediator.changed(this);
};
memorySelect.onchange = function () {
mediator.changed(this);
};
numberInput.oninput = function () {
mediator.changed(this);
};
:は、オブジェクト の を らす .
:は、オブジェクト の を な り らすことができ、2つのオブジェクト の が でない 、2つのオブジェクト の を うために 3のオブジェクトを することができる.オブジェクトが のオブジェクトを しなければならない 、オブジェクトを なインターフェースだけに させ、オブジェクト の を ( ) に させる.
デメリット:は、 が な までの なオブジェクトを させる がある.
1.3 (OCP)
:ソフトウェアエンティティは であるはずだが、 できない.ソフトウェアエンティティは、オブジェクト、クラス、モジュール、システム、 、 などを む.プログラムの を するか、またはこのプログラムに しい を する がある は、コードを する ではなく、コードを する を することができます.
:1つの を の にマッピングします.マッピングのステップは です.マッピングの は です.マッピングの はコールバック に れて します.var arrMap = function(arr,callback) {
var i = 0,
length = arr.length,
value,
ret = []
for(;i
:ソースコードの による を ける . ソースコードのコストを する は、システムの した と しやすい を して、 された を で き えるのに である.
: を して、プログラムが するところを し して、これらの をカプセル します. が けられない 、できるだけ しやすいところを してください.
2プログラミング
2.1インターフェース けプログラミング
:インターフェースプログラミングとは、 なプログラミングに けて、オブジェクトのタイプからオブジェクトに を てる であり、オブジェクトに する タイプの な をプログラミングすることである.
インターフェースは、オブジェクト の のセットを すだけでなく、Javaのinterfaceなど、いくつかの が するキーワードをも し、クラスとクラスの の を に する.
2.1.1 お を れてもコーヒーを れても、 を に し む がある 、お を れることとコーヒーを れることを み に えることができます. み を れるクラスに、 を に し むという な を いておきながら、 み から け いだお を れる とコーヒーを れるサブカテゴリーを き えて、 を に し む を いています.abstract class Beverage {
abstract operation():void
}
class Tea extends Beverage{
operation() {
console.log(' ')
}
}
class Coffee extends Beverage {
operation() {
console.log(' ')
}
}
2.1.2インターフェース
2.2の は、 を つのインターフェースとして することもできる.interface Beverage {
operation: Function
}
class Tea implements Beverage{
operation() {
console.log(' ')
}
}
class Coffee implements Beverage {
operation() {
console.log(' ')
}
}
2.2コード
2.2.1
に きなコードがあれば、 してこのコードを の した に れるのが いいです.
:ページの み みが したら、 を したり、ページの を したりします. を することと を して します.window.onload = function () {
createCircle()
log()
}
function createCircle() {
var canvas = document.getElementById('canvas')
if(canvas.getContext) {
var ctx = canvas.getContext('2d')
ctx.fillStyle='red';
ctx.arc(20,20,20,0,2*Math.PI)
ctx.fill()
}
}
function log() {
console.log(' ')
}
2.2.2 セグメントの
if else で じセグメントのコードを すれば、このコードを の に き むことができます. から き して、 の の を きます.ページにジャンプして、 のページが の でない は、 のページにジャンプします. のページが ページ より きい 、 のページに します.その の 、 のジャンプ :ジャンプページを き、 の に くと、function paging(currPage,totalPage) {
if(currPage <= 0) {
currPage = 1
} else if (currPage >= totalPage) {
currPage = totalPage
}
jump(currPage)
}
2.2.3 を に する
が すぎると、この を つの の に き すことができます. のアクティビティが され、ユーザがすでに し んでいるか、または のアクティビティが した 、ユーザは のアクティビティの の で を ることができます. を に します.function canPhoto (activityState,userState) {
return (activityState === ' ' && userState === ' ') || activityState === ' '
}
function photoActivity(activityState,userState) {
if(canPhoto(activityState,userState)) {
doSomething()
}
}
2.2.4 なサイクル
いくつかのステートメントが した をする 、 を つの に れて、 を うことができます.XHRオブジェクト(IE 9 のブラウザ)の : のパラメータを に れて に します.var createXHR = function () {
var versions = ['MSXML2.XMLHttp.6.0ddd', 'MSXML2.XMLHttp.3.0', 'MSXML2.XMLHttp'];
for (var i = 0, version; version = versions[i++];) {
try {
return new ActiveXObject(version);
} catch (e) {}
}
};
var xhr = createXHR();
2.2.5ネスト の わりに でキャンセルします.
が すぎる 、これらの をできるだけ の に き して、いくつかの に ると、 を ちに させることができます.
2.2.6 パラメータが すぎるパラメータリストに わる
パラメータリストが すぎると、パラメータを つのオブジェクトに れることが えられます.パラメータの や は にしなくてもいいです.
えば、ファイルをフィルタする 、ファイルの 、 、タイプ、 、キーワード、ダウンロード などの を してフィルタリングして、これらのパラメータを つのファイルの に くことができます.
2.2.7パラメータ をできるだけ らす
によって られるパラメータがある は、これらのパラメータをできるだけ らす わりに、 で によって します.
えば、 を く 、 ってきたパラメータは 、 さ、 がありますが、 は と さで できますので、 ってきたパラメータの から というパラメータを り くことができます.
2.2.8 を なく う
つの は、コードの と を しますが、 されたコード は されます.a === b ? a : b === doc ? b : doc === 'text' ? doc : null
2.2.9チェーンを に して び す
チェーンの び しはデバッグの に です.チェーンが っていたら、このチェーンを してデバッグガーといくつかのconsolieを えて、 った に します.
チェーンコールはjqueryを できます.
2.2.10
きいクラスの の をより かい のオブジェクトに します.
2.2.11マルチループをリセットする
マルチループを する がある は、メソッド を し、 に する またはコードをリセットします.
: 15の2つの10 の のやり を つける:ダブルサイクル :for(var i = 0; i < 10; i ++ ) {
for(var j = 0; j < 10; j ++) {
if( i + j === 15) {
return console.log(i,j)
}
}
}