Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对象/类设计问题_C#_.net_Oop_Class Design - Fatal编程技术网

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