元に戻す/やり直しの実装をリファクタリングしようとしていますが、その方法がわかりません。
public class MyObject
{
public int A;
public int B;
public int C;
}
public abstract class UndoRedoAction
{
protected MyObject myobj;
protected int oldValue;
protected int newValue;
public abstract void Undo();
public abstract void Redo();
}
public class UndoRedoActionA : UndoRedoAction
{
UndoRedoActionA(MyObject obj, int new)
{
myobj = obj;
oldValue = myobj.A;
newValue = new;
myobj.A = newValue;
}
public override void Undo()
{
myobj.A = oldValue;
}
public override void Redo()
{
myobj.A = newValue;
}
}
public class UndoRedoActionB : UndoRedoAction
{
UndoRedoActionB(MyObject obj, int new)
{
myobj = obj;
oldValue = myobj.B;
newValue = new;
myobj.B = newValue;
}
public override void Undo()
{
myobj.B = oldValue;
}
public override void Redo()
{
myobj.B = newValue;
}
}
public class UndoRedoActionC : UndoRedoAction
{
UndoRedoActionC(MyObject obj, int new)
{
myobj = obj;
oldValue = myobj.C;
newValue = new;
myobj.C = newValue;
}
public override void Undo()
{
myobj.C = oldValue;
}
public override void Redo()
{
myobj.C = newValue;
}
}
明らかに、UndoRedoAction 子クラスのそれぞれは、異なるフィールドにアクセスするためのカスタム機能を備えていますが、これらのフィールドに対して実行する機能は同じです。これらの int をプロパティにしてプロパティ名を渡す以外に (私はやりたくない、魔法の文字列など)、すべてを実行する子クラスの束を作成する代わりに、これらを汎用の UndoRedoAction に結合するクリーンな方法はありますか?異なる変数に対するまったく同じアクション?
この問題を解決する Memento パターンの使用を検討しましたが、これほど小さなシナリオではやり過ぎのように思えますし、心配する必要のある一方通行のアクションもありません。Memento パターンが本当に役立つのはこのような場合です。
ありがとう。
明確化:これらの UndoRedoAction オブジェクトは、元に戻すキャッシュとして機能する Stack<UndoRedoAction> 内に配置されます。より具体的には、2 つのスタックがあり、1 つは取り消し用、もう 1 つはやり直し用であり、一方からポップされたアクションは他方にプッシュされます。さらに、Zaid Masud の回答に応じて、変数は必ずしもすべて int ではなく、すべて同じオブジェクト型でさえありません。私の例では、簡単にするためにそれを行っただけです。