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

标签 c# refactoring switch-statement

我继承了一些代码,其中有一个 500 行的 switch 语句。基本上,它会打开一个 string 任务并执行相应的操作。

从那以后,我将每个 case 语句移动到新类中它们自己的方法中。巨大的 switch 语句仍然存在,但不是内联逻辑,每个 case 只是调用一个方法,因此它更简洁。

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

目前这个有效但我想让它变得更好。要么去掉 switch 语句,要么以某种方式减少传入参数的数量。

我正在考虑使用将 string 映射到 ActionDictionary 来消除整个开关,但这行不通因为我使用了很多 ref 参数(原始类型)并且没有办法将它们传递给构造函数并在以后对它们进行引用修改。

该问题的明显解决方案是将所有 16 个左右的变量放入一个单独的类中并传递它,但其中很多不是很相关,所以它只是用另一个问题替换一个问题(长参数列表不-内聚数据类)。

想知道是否有任何其他方法可以改进此代码。感谢阅读。

最佳答案

由于您的问题不包含任何代码,因此答案也不可能。我认为最好的办法是将您指向有史以来最好的软件书籍之一的第 82 页:Refactoring: Improving the Design of Existing Code .

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

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

关于c# - 如何重构这个巨大的 switch 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12926518/

相关文章:

c# - HttpResponseMessage 返回什么作为 Json

c# - 重构多个 StringBuilder.Append 语句

java - 如何以重构安全的方式分配方法名称(或注释元素)字符串?

Java switch case 语句 - 一个 case 的多个条目

c - C switch 语句中的最终子句(可能使用 goto)

c# - 终止由Visual Studio插件生成的所有线程的正确方法是什么?

c# - Linq 返回实体中的所有记录,其中字段包含列表中的一个或多个单词

c# - 如何配置 owin/Katana 以监听所有主机 ip 地址

c# - 如何清理此代码以消除重复?

你能帮我一个符号状态表和嵌套开关吗?来自 Illustrationing C- Donald Alcock 的练习