Commandパターン
1つ1つのCommand(Userのactionとか)をObjectとして表現する
GoFの文脈なので、Objectとは即ちclassのinstanceのことを指しているmrsekut.icon
OOPとしてmodelingをする際に、「1つ1つのCommand」をclassとして表現しよう、という考え方に対し、わざわざ「Commandパターン」とかいう名前をつけているに過ぎない
別に画期的なことは言っていないmrsekut.icon
modelingの仕方の一例を示しただけ
undoの例
1つ1つのユーザーの入力を1つのCommand Objectとして表現する
そのObjectは1つ前の状態も保存しておく
ユーザーが10個の入力したら、10個のCommand Objectが作られていく感じ
コマンドのリンクドリストみたいになっているので、undoをやっていける
code:ts
function main() {
const unit = new Unit(0, 0);
// いくつかコマンドを定義
const c1 = makeMoveUnitCommand(unit, 1, 0);
const c2 = makeMoveUnitCommand(unit, 2, 0);
const c3 = makeMoveUnitCommand(unit, 2, 1);
// コマンドを実行したり、undoしたり
c1.execute();
c2.execute();
c3.execute();
c3.undo();
c2.undo();
}
function makeMoveUnitCommand(unit: Unit, x: number, y: number) {
let xBeforе: number, уBefore: number;
return {
execute: function () {
xBeforе = unit.x;
уBefore = unit.y;
unit.moveTo(x, y);
},
undo: function () {
unit.moveTo(xBeforе, уBefore);
},
};
}
こんなコード初めて書いたmrsekut.icon
このコード片だけでも状態を持つことの難しさを感じる
参考
こういうコード例のほうが良い気がする
Commandのstackと、iterator的な処理のほうがイメージしやすいmrsekut.icon