2009-10-22 100 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

这似乎是不正当的因式分解。该过滤器显然与枚举值强烈耦合,并且该类型决定了它需要什么特定的标准,并且该类型的数据值混杂在一个类中。

单独的过滤器类只包含相关的数据是更“纯”的。如果你做了这个改变,这个枚举可能会被删除。