我怎样才能重构这个switch语句?

时间:2009-02-04 23:17:55

标签: lambda switch-statement

昨天我正在玩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次。这不是重复吗?

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;请原谅任何语法错误。)