c# - 选择合适的对象和合适的方法的策略

标签 c# .net

在下面的代码中,第一个 if 语句 block (不仅仅是“worker”条件,与 else if 连接)我选择正确的 filter_object 。之后,在同一条件 block 中,我选择过滤器对象应应用什么过滤器。这段代码很愚蠢。

public class Filter
{
    public static List<data.Issue> fetch(string type, string filter)
    {
        Filter_Base filter_object = new Filter_Base(filter);

        if (type == "worker")
        {
            filter_object = new Filter_Worker(filter);
        }
        else if (type == "dispatcher")
        {
            filter_object = new Filter_Dispatcher(filter);
        }

        List<data.Issue> result = new List<data.Issue>();

        if (filter == "new")
        {
            result = filter_object.new_issues();
        }
        else if (filter == "ended")
        {
            result = filter_object.ended_issues();
        }

        return result;
    }
}

public class Filter_Base
{
    protected string _filter;

    public Filter_Base(string filter)
    {
        _filter = filter;
    }

    public virtual List<data.Issue> new_issues()
    {
        return new List<data.Issue>();
    }

    public virtual List<data.Issue> ended_issues()
    {
        return new List<data.Issue>();
    }
}

public class Filter_Worker : Filter_Base
{
    public Filter_Worker(string filter) :
        base(filter)
    { }

    public override List<data.Issue> new_issues()
    {
        return (from i in data.db.GetInstance().Issues
                where (new int[] { 4, 5 }).Contains(i.RequestStatusId)
                select i).Take(10).ToList();
    }
}

public class Filter_Dispatcher : Filter_Base
{
    public Filter_Dispatcher(string filter) :
        base(filter)
    { }
}

它将用于某种:

Filter.fetch("worker", "new");

此代码意味着,对于属于“worker”角色的用户,只会获取"new"问题(这是某种小型且简单的 CRM)。或者另一个:

Filter.fetch("dispatcher", "ended"); // here we get finished issues for dispatcher role

关于如何改进它有什么建议吗?

最佳答案

我假设您在问如何修剪 Fetch 方法。我会使用泛型

public static List<data.Issue> Fetch<T>( string filter ) where T : FilterBase, new()
{
    var filterBase = new T();
    filterBase.Initialize( filter );

    List<data.Issue> result;
    if ( IsNew( filter ) )
        result = filterBase.NewIssues();
    else if ( IsEnded( filter ) )
        result = filterBase.EndedIssues();
    else
        result = new List<data.Issue>();

    return result;
}

这需要:

  1. FilterBase 及其派生类的无参数公共(public)(或至少是内部)构造函数。
  2. 名为 Initialize 的虚拟方法,它采用 FilterBase 上的字符串。
  3. Filter 类上的 IsNew 和 IsEnded 静态函数,以便 Fetch 方法可以确定您可以使用哪个函数。另一种解决方案是为 Fetch 添加一个委托(delegate)参数,以确定应调用哪个方法。

如何改进代码的其余部分?

  1. 停止在类和方法名称(以及字段名称)中使用下划线。
  2. 方法名称使用帕斯卡大小写(因此使用 NewIssues 而不是 new_issues)
  3. 使您的基类抽象,除非有令人信服的理由。
  4. 找到更明确的方法来确定"new"和“结束”。也许是一个额外的枚举参数?

关于c# - 选择合适的对象和合适的方法的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2642681/

相关文章:

c# - C# 是否具有运行时分配的 goto?

c# - 获取 bindingSource 的 CurrentRow 的实例

c# - 如何在 Node.js WebSocket 服务器和 C# 客户端之间交换二进制数据?

c# - 完整的 Entity Framework 存储库接口(interface)

c# - 数据库查询中的存储过程与代码

c# - 如何使用 SQUID 代理验证 .NET2 Web 服务

C#转义字符

c# - ASP.NET Core 中 Func<T> 类型的依赖注入(inject)

c# - 如何指示单行 C# winforms 文本框中有更多文本?

c# - 如何在 WinForms 自定义控件的控件设计器属性中添加组合框?