現在発生している設計上の問題があります。
コンポーネントの階層があるとしましょう。これらの各コンポーネントは、次のComponent
ような抽象型から派生します。
public abstract class Component
{
public abstract Component Parent { get; }
public abstract ComponentCollection Children { get; }
}
ここで、これらのコンポーネントにいくつかのオプション機能を追加したいと思います。例として、コンポーネント階層内で検索し、階層内でコンポーネントを選択できるようにしましょう。
次のような基本クラスでこれらのオプション機能を提供することは悪い習慣と見なされますか?
public abstract class Component
{
// Other members
public abstract bool IsSearchable { get; }
public abstract bool Search(string searchTerm);
public abstract bool IsSelectable { get; }
public abstract bool Select();
}
「検索機能」と「選択機能」は、たとえば戦略パターンを使用して派生コンポーネントで管理されますか?
どういうわけか、これは SRP に違反しているように思えますが、私の意見では、唯一の代替手段は、各オプション機能のインターフェイスを持ち、この機能をサポートするコンポーネントにのみ実装することです。
私の意見では、これには、コンポーネントが特定の機能を提供するかどうかを確認するたびに、このようなコードを書かなければならないという欠点があります。
public bool Search(Component component, string searchTerm)
{
ISearchable searchable = component as ISearchable;
if(searchable != null)
{
searchable.Search(searchTerm);
}
}
どちらの戦略を選択しますか、またはより良いアイデアがありますか?
前もって感謝します!