如何重构这个巨大的switch语句?

我已经继承了一些代码,并在其中是一个500行转换语句。 基本上,它打开一个string任务并执行相应的操作。

我已经将每个案例陈述在新课堂中转移到他们自己的方法中。 巨大的switch语句仍然存在,但不是内联逻辑,而是每种情况都只是调用一种方法,所以它更简洁。

问题是这些方法修改了很多不同的东西。 50%的方法需要传入0个参数。大约40%需要5个参数,剩下的10%需要10个参数。

目前这有效,但我想让它变得更好。 要么摆脱switch语句,要么以某种方式降低传入参数的数量。

我正在考虑使用将string s映射到Action s的Dictionary来消除整个开关,但这不起作用,因为我使用了很多ref参数(基本类型),并且无法通过这些参数进入构造函数,然后让它们被引用修改。

这个问题的明显解决方案是将所有16个左右的变量放在一个单独的类中,并且通过它们,但是它们中的很多并不是很相关,所以它只是用另一个问题替换一个问题(具有非粘性数据的长参数列表类)。

想知道是否有其他方法来改进这些代码。 谢谢阅读。


由于你的问题不包含任何代码,所以答案也不能。 我认为要做的最好的事情是指向第82页的历史最好的软件书籍:重构:改进现有代码的设计。

“面向对象代码的一个最明显的症状是它比较缺乏switch语句,大多数时候你看到一个switch语句,你应该考虑多态性。”

然后,他列出了一些用于帮助实现这一目标的特定模式。


无法查看任何类型的代码,我可以给出的唯一建议是,您应该考虑使用SOLID设计原则考虑进行重构测试。 我会尝试为每个逻辑模块(或交换机的条件)创建不同的类,通过这些对象的构造函数传递依赖关系(而不是作为方法的参数),并尝试创建一些可用于工作的统一接口在一些测试中。 您可能想要通过投入工厂来提取这些对象的条件创建。 听起来像一团糟。 祝你好运。


您可以在委托中使用ref参数,但不能使用内置的ActionFunc通用委托。 你必须像这样定义你自己的:

public delegate void DelegateWithRefParameters(ref int i, ref long l, ref bool b, ref object o);

public class Program
{
    public static void Main(string[] args)
    {
        int i = 0;
        long l = 0;
        bool b = false;
        object o = null;

        var lookup = new Dictionary<string, DelegateWithRefParameters>() 
        {
            { "object", ModifyObject },
            { "int", ModifyInt },
            { "bool", ModifyBool },
        };

        string s = "object";

        lookup[s](ref i, ref l, ref b, ref o);
    }

    private static void ModifyObject(ref int i, ref long l, ref bool b, ref object o)
    {
        o = new object();
    }

    private static void ModifyInt(ref int i, ref long l, ref bool b, ref object o)
    {
        i++;
    }

    private static void ModifyBool(ref int i, ref long l, ref bool b, ref object o)
    {
        b = !b;
    }              

}

您只需修改所有方法即可使用相同的签名。

链接地址: http://www.djcxy.com/p/91547.html

上一篇: How to refactor this huge switch statement?

下一篇: How should I convert a string to an enum in C#?