对象/类设计问题

时间:2009-10-22 02:58:56

标签: c# .net oop class-design

我有一个课程如下: -

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过滤器分开,因为它们需要不同的属性? Coz我认为在这个例子中,在向这个类输入数据时需要强制执行一些业务规则。

请指教, 感谢

3 个答案:

答案 0 :(得分: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
{
}

答案 1 :(得分:1)

看看你到底发生了什么,似乎最有意义的是让多个继承自IFilterCondition的类定义为每个完全实现自己版本的ApplyFilter() - FirstNameFilter,{ {1}},LastNameFilter

为了保存代码,您可以简单地从您创建的具体实现派生,如果您需要重用类似的逻辑来定义过滤器。例如,您可能有[abstract] PhoneNumberFilter定义该字符并在其StartCharacterFilter方法中截断列表,然后ApplyFilter()将简单地覆盖FirstNameFilter,调用基础实现并将结果传递给自己的逻辑。

答案 2 :(得分:1)

这似乎是不合理的因素。过滤器显然与枚举值强烈耦合,类型决定了它需要的具体标准,并且数据值混杂在一个类中。

拥有单独的过滤器类并且每个过滤器类中只包含相关数据更为“纯粹”。如果你进行了改变,可能会删除枚举。