簡體   English   中英

對象/類設計問題

[英]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() - FirstNameFilterLastNameFilterPhoneNumberFilter等。

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

這似乎是不適當的保理。 過濾器顯然與枚舉值緊密耦合,並且該類型確定了它所需的特定標准,並且該過濾器的數據值被分為一個類。

擁有單獨的過濾器類且每個過濾器類中僅包含相關數據更為“純粹”。 如果進行更改,則可以刪除該枚舉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM