我最近遇到了一些代码,通过硬编码
取代了交换机的使用Dictionary<string (or whatever we would've been switching on), Func<...>>
并且切换到哪里,它改为dict [“value”]。调用(...)。 代码在某种程度上感觉不对,但与此同时,这些方法确实看起来更清晰一些,特别是在有很多可能的情况下。我不能给出任何关于为什么这是好的或坏的设计的理由,所以我希望有人可以给出一些支持/谴责这种代码的理由。性能有提升吗?失去清晰度?
示例:
public class A {
...
public int SomeMethod(string arg){
...
switch(arg) {
case "a": do stuff; break;
case "b": do other stuff; break;
etc.
}
...
}
...
}
变为
public class A {
Dictionary<string, Func<int>> funcs = new Dictionary<string, Func<int>> {
{ "a", () => 0; },
{ "b", () => DoOtherStuff(); }
... etc.
};
public int SomeMethod(string arg){
...
funcs[arg].Invoke();
...
}
...
}
答案 0 :(得分:6)
优点:
case a + b == 3
)缺点:
default
中的switch
)你应该用吗?这真的取决于。你必须在某个地方定义字典,所以代码会在某处混乱。你必须自己决定。如果你需要在运行时切换行为,字典解决方案确实很突出,特别是,如果你使用的方法没有副作用(即不需要访问范围变量)。
答案 1 :(得分:5)
有几个原因:
case
分支在运行时运行的内容。否则,你必须编译它。为什么这个解决方案对你有误?如果字典在编译时填充,那么你肯定不会失去任何安全性(进入的代理肯定必须编译而没有错误)。你做会失去一点性能,但是:
答案 2 :(得分:2)
Jon有几个很好的答案。还有一些:
答案 3 :(得分:2)
没有人说过我认为这种方法的最大缺点。
它的可维护性较差。
我说这有两个原因。
大多数程序员都知道switch语句的工作原理。许多程序员从未见过函数词典。
虽然这看起来像是switch语句的一个有趣且新颖的替代方案,并且很可能是解决某些问题的唯一方法,但它要复杂得多。如果您不需要增加灵活性,则不应使用它。
答案 4 :(得分:1)
如果有更多可能的案例,那么最好将Switch
语句替换为strategy pattern
,See this。
Applying Strategy Pattern Instead of Using Switch Statements
答案 5 :(得分:0)
将您的A
类转换为分部类,并在其中仅使用委托字典的另一个文件中创建第二个分部类。
现在,您可以更改分支数量,并为switch语句添加逻辑,而无需触及其余类的源代码。