2009-10-22 133 views
0

我有一個類如下: -對象/類設計問題

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財產。

是上述正確或應分離出名字過濾器和姓氏過濾器,因爲他們需要不同的屬性?因爲我認爲在這種情況下,在向這個班級輸入數據時需要執行一些業務規則。

請指點,謝謝

回答

2

枚舉往往是一個代碼味道,你的設計是不完全正確。在這種情況下,通過將排除列表功能重構爲基類,然後爲第一個和最後一個名稱過濾器添加單獨的派生類,您可以做得更好。姓氏過濾器不會執行與通用過濾器不同的任何操作,但名字過濾器也會檢查起始字符。

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 
{ 
} 
+0

因此,在數據庫設計方面,我必須將每個對象作爲單獨的表存儲呢?像firstnamefilter表和lastnamefilter表一樣? – Joshscorp 2009-10-22 03:44:00

+0

不,我會爲您的數據庫使用枚舉類型的方法。在這種情況下就沒問題了。 – 2009-10-22 03:47:03

1

看你有什麼就有什麼,好像它將使最有意義有多個類從IFilterCondition繼承定義了每個充分行使自己的的ApplyFilter()版本 - FirstNameFilterLastNameFilterPhoneNumberFilter

爲了節省代碼,您可以簡單地從您創建的具體實現中派生出來,如果需要重用類似邏輯來定義過濾器時。例如,您可能有一個[abstract] StartCharacterFilter,它定義了該字符並在其ApplyFilter()方法中截斷了列表,然後,FirstNameFilter將簡單地覆蓋ApplyFilter(),調用基本實現並將結果傳遞給它自己的邏輯。

1

這似乎是不正當的因式分解。該過濾器顯然與枚舉值強烈耦合,並且該類型決定了它需要什麼特定的標準,並且該類型的數據值混雜在一個類中。

單獨的過濾器類只包含相關的數據是更「純」的。如果你做了這個改變,這個枚舉可能會被刪除。