導入
コマンドモードは次のように定義されています。次のように使用されます。リクエストをオブジェクトにカプセル化するために使用されるため、さまざまなリクエストでクライアントをパラメーター化できます。キューまたはログリクエスト、および取消可能な操作を実行します。言い換えれば、変更モードは、関数の呼び出し、要求、操作を単一のオブジェクトにカプセル化し、オブジェクト上で一連の処理を実行するように設計されています。さらに、コマンドオブジェクトと受信オブジェクトは、特定の関数を実装するオブジェクトを呼び出すことで切り離すことができます。
文章
車両購入プログラムを通じてこのパターンを見せてみましょう。最初に車両購入の特定の操作クラスを定義します。
コードコピーは次のとおりです。
$(function(){
var Carmanager = {
//情報をリクエストします
requestInfo:function(model、id){
' + model +の情報を返します
「id ' + id +」はfoobar'です。
}、
//車を購入します
buyvehicle:function(model、id){
返品「あなたは正常に購入したアイテム」
+ id + '、a' +モデル;
}、
//ビューを整理します
ARFFRECTIONVIEWING:function(model、id){
返品 'あなたは正常に予約しました'
+ model + '(' + id + ')';
}
};
})();
上記のコードを見てみましょう。関数を呼び出すことにより、マネージャーコマンドを実行するだけです。ただし、場合によっては、オブジェクト内のメソッドを直接呼び出したくありません。これにより、オブジェクト間の依存性が増加します。次に、このCarmanagerを拡張して、モデルや自動車IDを含むCarmanagerオブジェクトからの処理リクエストを受け入れましょう。コマンドパターンの定義によれば、次の関数呼び出しを実装したいと考えています。
コードコピーは次のとおりです。
carmanager.execute({commandType: "buyvehicle"、operand1: 'ford escort'、operand2: '453543'});
この要件によれば、このようにcarmanager.executeメソッドを実装できます。
コードコピーは次のとおりです。
carmanager.execute = function(command){
return carmanager [command.request](command.model、command.carid);
};
変換後、コールははるかに簡単になり、次の呼び出しを実装できます(もちろん、いくつかの例外の詳細を改善する必要があります):
コードコピーは次のとおりです。
carmanager.execute({request: "ArrangeViewing"、model: 'ferrari'、carid: '145523'});
carmanager.execute({request: "requestInfo"、モデル: 'ford mondeo'、carid: '543434'});
carmanager.execute({request: "requestInfo"、Model: 'Ford Escort'、carid: '543434'});
carmanager.execute({request: "buyvehicle"、model: 'ford escort'、carid: '543434'});
要約します
コマンドモードはコマンドキューを設計するのが簡単で、必要に応じてコマンドをログにカウントするのが簡単で、リクエストを受け入れる当事者に電話をかけるかどうかを決定し、リクエストの取り消しとリセットを実装することもできます。さらに、追加された特定のクラスは他のクラスに影響しないため、実装は簡単です。
しかし、アジャイル開発の原則は、コードに推測ベースと実際に不要な機能を追加しないように指示しています。システムにコマンドモードが必要かどうかわからない場合は、通常、それを実装するために急いではいけません。実際、必要なときにこのモードを実装することは難しくありません。元のコードをコマンドモードにリファクタリングすることは、元に戻す、操作の復元、その他の機能の復元など、本当に必要な場合にのみ意味があります。