如何重构这个巨大的switch语句?
我已经继承了一些代码,并在其中是一个500行转换语句。 基本上,它打开一个string
任务并执行相应的操作。
我已经将每个案例陈述在新课堂中转移到他们自己的方法中。 巨大的switch语句仍然存在,但不是内联逻辑,而是每种情况都只是调用一种方法,所以它更简洁。
问题是这些方法修改了很多不同的东西。 50%的方法需要传入0个参数。大约40%需要5个参数,剩下的10%需要10个参数。
目前这有效,但我想让它变得更好。 要么摆脱switch语句,要么以某种方式降低传入参数的数量。
我正在考虑使用将string
s映射到Action
s的Dictionary
来消除整个开关,但这不起作用,因为我使用了很多ref参数(基本类型),并且无法通过这些参数进入构造函数,然后让它们被引用修改。
这个问题的明显解决方案是将所有16个左右的变量放在一个单独的类中,并且通过它们,但是它们中的很多并不是很相关,所以它只是用另一个问题替换一个问题(具有非粘性数据的长参数列表类)。
想知道是否有其他方法来改进这些代码。 谢谢阅读。
由于你的问题不包含任何代码,所以答案也不能。 我认为要做的最好的事情是指向第82页的历史最好的软件书籍:重构:改进现有代码的设计。
“面向对象代码的一个最明显的症状是它比较缺乏switch语句,大多数时候你看到一个switch语句,你应该考虑多态性。”
然后,他列出了一些用于帮助实现这一目标的特定模式。
无法查看任何类型的代码,我可以给出的唯一建议是,您应该考虑使用SOLID设计原则考虑进行重构测试。 我会尝试为每个逻辑模块(或交换机的条件)创建不同的类,通过这些对象的构造函数传递依赖关系(而不是作为方法的参数),并尝试创建一些可用于工作的统一接口在一些测试中。 您可能想要通过投入工厂来提取这些对象的条件创建。 听起来像一团糟。 祝你好运。
您可以在委托中使用ref
参数,但不能使用内置的Action
或Func
通用委托。 你必须像这样定义你自己的:
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