在下面的代码中,第一个 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;
}
这需要:
- FilterBase 及其派生类的无参数公共(public)(或至少是内部)构造函数。
- 名为
Initialize
的虚拟方法,它采用 FilterBase 上的字符串。 Filter
类上的 IsNew 和 IsEnded 静态函数,以便Fetch
方法可以确定您可以使用哪个函数。另一种解决方案是为Fetch
添加一个委托(delegate)参数,以确定应调用哪个方法。
如何改进代码的其余部分?
- 停止在类和方法名称(以及字段名称)中使用下划线。
- 方法名称使用帕斯卡大小写(因此使用 NewIssues 而不是 new_issues)
- 使您的基类抽象,除非有令人信服的理由。
- 找到更明确的方法来确定"new"和“结束”。也许是一个额外的枚举参数?
关于c# - 选择合适的对象和合适的方法的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2642681/