我有一个设计问题,我目前遇到的问题。可选组件功能VS SRP
比方说,有分量的层次结构。每个组件从抽象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);
}
}
你会选择还是你哪种策略有什么更好的想法?
提前感谢!
为什么你指出的缺点与你当前的代码有很大的不同,它必须首先检查component.IsSearchable()? – 2011-06-15 09:18:14
这是我不确定的。就我个人而言,我会考虑检查一个属性比检查对象的类型更清洁(可能更快)。 – 2011-06-15 09:21:31
概念上,对象的类型是它的一个属性(一般意义上),所以这不是问题。性能可能是一个问题,并且可能会使用C++之类的语言,但可能不是Java或C#。还要考虑具有ISearchable接口的好处 - 您可能也有可搜索的非组件。 – 2011-06-15 09:24:24