我有一個設計問題,我目前遇到的問題。可選組件功能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