gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:21:36 25 4
gpt4 key购买 nike

在下面的代码中,首先 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. 方法名称使用 Pascal 大小写(因此使用 NewIssues 而不是 new_issues)
  3. 除非有令人信服的理由,否则请将您的基类抽象化。
  4. 找到一种更明确的方法来确定"new"和“已结束”。也许是一个额外的枚举参数?

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com