我有一个课程如下: -
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我认为在这个例子中,在向这个类输入数据时需要强制执行一些业务规则。
请指教, 感谢
答案 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)
这似乎是不合理的因素。过滤器显然与枚举值强烈耦合,类型决定了它需要的具体标准,并且数据值混杂在一个类中。
拥有单独的过滤器类并且每个过滤器类中只包含相关数据更为“纯粹”。如果你进行了改变,可能会删除枚举。