昨天我正在玩jQGrid插件和ASP.NET。一切都很好,我的网格现在正在工作,但我有两种方法,让我的代码闻起来。
臭方法:
private IOrderedEnumerable<Employee> GetOrderedEmployees(Column sortColumn, bool ascending)
{
switch (sortColumn)
{
case Column.Name:
{
return GetOrderedEmployees(e => e.Name, ascending);
}
case Column.Salary:
{
return GetOrderedEmployees(e => e.Salary, ascending);
}
default:
{
return GetOrderedEmployees(e => e.ID, ascending);
}
}
}
private IOrderedEnumerable<Employee> GetOrderedEmployees<TSortKey>(Func<Employee, TSortKey> func, bool ascending)
{
return ascending ? Context.Employees.OrderBy(func) : Context.Employees.OrderByDescending(func);
}
我无法找到,如何正确地重构它们。似乎最好的解决方案是在switch语句中只返回lambdas(f.e return e=>e.Name
),但是怎么做呢?
在switch语句中ascending
参数传递3次。这不是重复吗?
答案 0 :(得分:7)
我认为你可能会超越这里。返回lambdas(IMO)比简单的switch语句或if; else if; else block更令人困惑。可能有更好的方法,但有时你需要检查一个条件,特别是列(我讨厌使用ListViews,但它们是必需的,通常需要这种代码。)
我认为你不需要重构任何东西。如果那个switch语句成为一个维护头痛的问题,那就不要过去了,但并不是所有的switch语句都构成了“代码味道”。
要解决代码重复问题,可以使用开关来获取e。??首先保存,然后在方法结束时调用函数。
答案 1 :(得分:2)
这里有一些可能有用的模式,但是提供商呢?您可以创建一个提供GetOrderEmployees的Provider,然后传入您想要使用的Provider而不是sort列。
编辑 - 但我也认为第一张海报的评论有很多优点 - 无论如何都不要为小土豆制作复杂的解决方案。
答案 2 :(得分:0)
如果您只是想减少代码中的重复:
private IOrderedEnumerable<Employee> GetOrderedEmployees(Column sortColumn, bool ascending)
{
Func<Employee, TSortKey> func = e => e.ID;
switch (sortColumn)
{
case Column.Name:
{
func = e => e.Name;
}
case Column.Salary:
{
func = e => e.Salary;
}
}
return GetOrderedEmployees(func, ascending);
}
private IOrderedEnumerable<Employee> GetOrderedEmployees<TSortKey>(Func<Employee, TSortKey> func, bool ascending)
{
return ascending ? Context.Employees.OrderBy(func) : Context.Employees.OrderByDescending(func);
}
(我不熟悉.NET;请原谅任何语法错误。)