C# 对象/类设计问题
我的课程如下:-C# 对象/类设计问题,c#,.net,oop,class-design,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
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
}
接口条件
{
列表应用过滤器(列表名称过滤器);
}
类过滤器名称:IFilterCondition
{
public namefilternum namefilternum{get;set;}
公共列表排除列表{get;set;}
公共字符StartCharacter{get;set;}
#区域条件成员
公共列表ApplyFilter(列表名称过滤器)
{
交换机(名称过滤器)
{
案例名称FilterEnum.FilterFirstName:
//检查排除列表
//检查起始字符
打破
案例名称FilterEnum.FilterLastName:
//只勾选排除列表
打破
违约:
打破
}
返回过滤器名称;
}
#端区
}
枚举名称过滤器
{
没有一个
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
{
公共列表排除列表{get;set;}
公共虚拟列表ApplyFilter(列表名称过滤器)
{
//检查排除列表
返回过滤器名称;
}
}
类FilterFirstName:FilterName
{
公共字符StartCharacter{get;set;}
公共覆盖列表ApplyFilter(列表名称过滤器)
{
namesToFilter=base.ApplyFilter(namesToFilter);
//检查起始字符
返回过滤器名称;
}
}
类FilterLastName:FilterName
{
}
枚举通常是一种代码味道,表明您的设计不太正确。在这种情况下,您可以通过将排除列表功能重构为基类,然后为名字过滤器和姓氏过滤器添加单独的派生类来做得更好。姓氏筛选器与泛型筛选器没有任何不同,但姓氏筛选器还将检查起始字符
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
{
公共列表排除列表{get;set;}
公共虚拟列表ApplyFilter(列表名称过滤器)
{
//检查排除列表
返回过滤器名称;
}
}
类FilterFirstName:FilterName
{
公共字符StartCharacter{get;set;}
公共覆盖列表ApplyFilter(列表名称过滤器)
{
namesToFilter=base.ApplyFilter(namesToFilter);
//检查起始字符
返回过滤器名称;
}
}
类FilterLastName:FilterName
{
}
看看你已经得到了什么,让多个类从IFilterCondition继承似乎是最有意义的,这些类定义为每个类都完全实现自己版本的ApplyFilter()
-FirstNameFilter
,LastNameFilter
,PhoneNumberFilter
,等等
要保存代码,只要在需要重用类似逻辑来定义过滤器时,从创建的具体实现派生即可。例如,您可能有一个[abstract]
StartCharacterFilter
定义该字符并在其ApplyFilter()
方法中截断列表,FirstNameFilter
将简单地覆盖ApplyFilter()
,调用基本实现并将结果传递给它自己的逻辑。看看你在那里得到了什么,让多个类继承IFilterCondition定义,每个类都完全实现自己版本的ApplyFilter()
-FirstNameFilter
<,LastNameFilter
,PhoneNumberFilter
等
要保存代码,只要在需要重用类似逻辑来定义过滤器时,从创建的具体实现派生即可。例如,您可能有一个[abstract]
StartCharacterFilter
定义该字符并在其ApplyFilter()
方法中截断列表,FirstNameFilter
将简单地覆盖ApplyFilter()
,调用基本实现并将结果传递给它自己的逻辑。这似乎是不正确的分解。过滤器显然与枚举值强耦合,类型决定了它需要什么特定的条件,并且这些条件的数据值混杂在一个类中
更“纯粹”的做法是使用单独的过滤器类,每个过滤器类中只包含相关数据。如果进行更改,枚举可能会被删除。这似乎是不正确的分解。过滤器显然与枚举值强耦合,类型决定了它需要什么特定的条件,并且这些条件的数据值混杂在一个类中
更“纯粹”的做法是使用单独的过滤器类,每个过滤器类中只包含相关数据。如果进行更改,枚举可能会被删除。那么在数据库设计方面,我必须将每个对象存储为一个单独的表吗?像firstnamefilter表和lastnamefilter表吗?不,我会使用枚举类型的方法来处理您的数据库。在这种情况下就可以了。所以在数据库设计方面,我必须将每个对象存储为一个单独的表?像firstnam