У меня проблема с дизайном, с которой я сейчас сталкиваюсь.
Допустим, существует иерархия компонентов. Каждый из этих компонентов происходит от абстрактного 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);
}
}
Какую стратегию вы бы выбрали или у вас есть идеи получше?
Заранее спасибо!