私はあなたがオブジェクトを複製し、クローン化した後にその状態を変更する責任が分離されるべきだと思っていると思います。あなたは同様のタスク(私はUserCommandを意味します)に直面しているからです。私はこのような状況で、次の操作を行います
:
変異インターフェイスを作成します。
public interface ICopyCommandMutation
{
void Mutate(Command target);
}
extensabilityさのために私は、デフォルトのmuateの実装作成します。作成
public class NoMutation : ICopyCommandMutation
{
public void Mutate(Command target) {}
}
をCopyableCommandクラスを開き、そこにDeepCopy()メソッドを移動します(CopyableCommandからFloatCommandも継承する必要があります)。
public CopyableCommand : Command
{
public CopyableCommand DeepCopy(ICopyCommandMutation commandMutation = null)
{
var newCommand = (CopyableCommand)MemberwiseClone();
if (commandMutation == null) commandMutation = new NoMutation();
commandMutation.Mutate(newCommand);
return newCommand;
}
}
これで、すべてのCopyableCommand継承者を 'mutations'でコピーできます。クラスを実装するだけで済みます。たとえば、あなたの質問からFloatCommand「変異」:ここでは
public class ChangeLocationRecountProducts : ICopyCommandMutation
{
// these fields should be initialized some way (constructor or getter/setters - you decide
LocationHeaderDTO locHeader;
string commandId;
List<FloatProductDetailsDTO> recountProducts;
public void Mutate(Command floatCommand)
{
var fc = floatCommand as FloatCommand;
if (fc == null) { /* handle problems here */ }
fc.Location = locHeader ?? fc.Location;
fc.CommandId = commandId ?? fc.CommandId;
fc.RecountProducts = recountProuducts ?? fc.RecountProducts;
}
}
が用法である:あなたがUserCommand「を変異させる」する必要がある場合
var clrp = new ChangeLocationRecountProducts();
// ... setting up clrp
_tCheckinCommand = _pTCommand.DeepCopy(clrp);
は今 - あなたはそれのために別々の突然変異クラスを行うことができますそこに突然変異の論理を保つ。異なる突然変異で異なる突然変異を作る能力は、(別々の突然変異クラスを定義するだけで)自由になる。 私がここで見ることができる唯一の問題は、あなたはおそらくCopyableCommandを作成し、それから他のコマンド(サードパーティのライブラリですか?)を継承することができないということです。解決策は、キャッスル動的プロキシを使用することです。
私はAutomapperを使用していませんが、私はそれが似たようなことをしていると思われます。
解決策は「コードライン最適化」ではありませんが、インスタンスのコピー時に多数のコマンドクラスを変更する必要がある場合は、その利点があります。
あなたはAutoMapperを知っていますか? –
@MatíasFidemraizer私はそうです。しかし、AutoMapperは "オブジェクトBをオブジェクトBにクローンし、その違いをどうするかを選択する"のようなものがありますが、本質的に "オブジェクトAをオブジェクトAに複製する"ことをするのは面倒だったように、参照リストから削除しました。私は本当に価値があると思うところです。 – notsoobvious
車輪を再発明することが余計に残っているかどうかはわかりません。 AutoMapperができることの10%を使っているかもしれませんが、あなたはまだ時間を節約し、他の問題に集中してください。 –