環境
オブジェクトの階層(式ツリー)で「疑似」ビジターパターン(二重ディスパッチを使用しないように疑似)を使用しています。
public interface MyInterface
{
void Accept(SomeClass operationClass);
}
public class MyImpl : MyInterface
{
public void Accept(SomeClass operationClass)
{
operationClass.DoSomething();
operationClass.DoSomethingElse();
// ... and so on ...
}
}
ただし、MyInterfaceの実装の数は非常に多く(〜50以上)、余分な操作を追加する必要がないため、この設計は疑わしく、かなり快適でした。
各実装は一意であり(異なる式または演算子です)、一部は複合(つまり、他の演算子/リーフノードを含む演算子ノード)です。
トラバーサルは現在、ツリーのルートノードでAccept操作を呼び出すことによって実行され、その操作は、その子ノードのそれぞれでAcceptを呼び出します。
しかし、きれいな印刷などの新しい操作を追加する必要があるときが来ました。
public class MyImpl : MyInterface
{
// Property does not come from MyInterface
public string SomeProperty { get; set; }
public void Accept(SomeClass operationClass)
{
operationClass.DoSomething();
operationClass.DoSomethingElse();
// ... and so on ...
}
public void Accept(SomePrettyPrinter printer)
{
printer.PrettyPrint(this.SomeProperty);
}
}
基本的に2つのオプションがあります:
- 保守性を犠牲にして、同じ設計を維持し、操作の新しいメソッドを各派生クラスに追加します(オプションではなく、IMHO)
- 「真の」訪問者パターンを使用して、拡張性を犠牲にします(オプションではなく、今後実装が増える予定です...)、Visitメソッドの約50以上のオーバーロードで、それぞれが特定の実装に一致します?
質問
Visitorパターンを使用することをお勧めしますか?この問題を解決するのに役立つ他のパターンはありますか?
MyInterface
..の実装者は50以上あります。これらのクラスはすべて、DoSomething
およびの一意の実装を持っていDoSomethingElse
ますか?あなたの訪問者のクラスは、実際に階層を横断ところ、私は表示されません-それはより多くのように見えるfacade
瞬間に...