[英]Object/Class Design Question
我的課如下:
interface IFilterCondition
{
List<Name> ApplyFilter(List<Name> namesToFilter);
}
class FilterName : IFilterCondition
{
public NameFilterEnum NameFilterEnum{ get; set; }
public List<Name> ExcludeList { get; set; }
public char StartCharacter{ get; set; }
#region IFilterCondition Members
public List<Name> ApplyFilter(List<Name> namesToFilter)
{
switch (NameFilterEnum)
{
case NameFilterEnum.FilterFirstName:
// Check Exclude List
// Check Start Character
break;
case NameFilterEnum.FilterLastName:
// Check Exclude List only
break;
default:
break;
}
return namesToFilter;
}
#endregion
}
enum NameFilterEnum
{
None,
FilterFirstName,
FilterLastName
}
請注意,僅當將其標記為FilterFirstName時,它才需要StartCharacter屬性。
以上是正確的還是我應該分開FirstName過濾器和LastName過濾器,因為它們需要不同的屬性? 因為我認為在這種情況下,在向此類輸入數據時需要執行一些業務規則。
請指教,謝謝
枚舉通常是代碼的味道,說明您的設計不太正確。 在這種情況下,您可以通過將排除列表功能重構為基類,然后為名字和姓氏過濾器添加單獨的派生類來做得更好。 姓氏過濾器與通用過濾器沒有任何區別,但名字過濾器還會檢查起始字符。
interface IFilterCondition
{
List<Name> ApplyFilter(List<Name> namesToFilter);
}
abstract class FilterName : IFilterCondition
{
public List<Name> ExcludeList { get; set; }
public virtual List<Name> ApplyFilter(List<Name> namesToFilter)
{
// Check Exclude List
return namesToFilter;
}
}
class FilterFirstName : FilterName
{
public char StartCharacter{ get; set; }
public override List<Name> ApplyFilter(List<Name> namesToFilter)
{
namesToFilter = base.ApplyFilter(namesToFilter);
// Check Start Character
return namesToFilter;
}
}
class FilterLastName : FilterName
{
}
望着你有什么有它似乎將最有意義有從IFilterCondition繼承多個類定義,每個充分行使自己的版本ApplyFilter()
- FirstNameFilter
, LastNameFilter
, PhoneNumberFilter
等。
為了節省代碼,您可以簡單地從創建的具體實現中派生,如果需要和何時需要重用類似的邏輯來定義過濾器。 例如,您可能有一個[抽象] StartCharacterFilter
,它定義了該字符並在其ApplyFilter()
方法中截斷了列表,然后, FirstNameFilter
會簡單地重寫ApplyFilter()
,調用基本實現並將結果傳遞給其自己的邏輯。
這似乎是不適當的保理。 過濾器顯然與枚舉值緊密耦合,並且該類型確定了它所需的特定標准,並且該過濾器的數據值被分為一個類。
擁有單獨的過濾器類且每個過濾器類中僅包含相關數據更為“純粹”。 如果進行更改,則可以刪除該枚舉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.