当前位置:  开发笔记 > 编程语言 > 正文

什么是失控开关声明的最佳替代方案?

如何解决《什么是失控开关声明的最佳替代方案?》经验,为你挑选了3个好方法。

我继承了一个包含一些巨大的switch语句块的项目,其中一些包含多达20个案例.什么是重写这些的好方法?



1> Dana Robinso..:

你为什么要在不同的结构中重写它们?如果您确实有20个案例需要单独处理,那么就可以使用开关/箱子了.维持一个if/then逻辑的大链条是可怕的.

如果使用面向对象语言,多态性是另一种选择.每个子类都将在方法中实现它自己的功能.


现在我看到这个问题有C#和Javascript标签.在C#中我会考虑多态性.在Javascript OO是如此可憎,我只是保持开关/案例:P

2> Mitch Wheat..:

多态性.但这可能不是一个微不足道的重构.

一些例子和参考:

重构(Googe书籍)

切换语句代码气味和多态性

重构switch语句



3> Breton..:

正如其他人所指出的那样,它取决于switch语句.但是,在过去,我通过以下方式继续重构switch语句.假设我们有一个像这样的switch语句,有很多重复的代码

switch(x){
   case 1:
     makeitso("foo");
     globalLog += "foo";
   case 2:
     makeitso("bar");
     globalLog += "bar";
   case 3:
     makeitso("baz");
     globalLog += "baz";
   ...
   default:
      throw("input error");
}

要做的第一件事就是要认识到是常见部分(在现实世界中,这将可能是一个更大幅度)

makeitso([some string]);
globalLog += [some string];

并把它变成一个函数

function transformInput(somestring) {
     makeitso(somestring);
     globalLog += somestring;
}

然后对于每种情况下改变的部分,使用散列或数组;

var transformvalues = ["foo", "bar", "baz"];

从这里我们可以这样做:

var tvals = ["foo", "bar", "baz" ... ];
function transformInput(somestring) {
     makeitso(somestring);
     globalLog += somestring;
}
var tval = tvals[x];
if(tval!==undefined) {
     transformInput(tval);
} else {
    throw ("invalid input");
} 

从switch语句中考虑了tvals,它甚至可以在外部提供,以扩展您可以处理的案例数量.或者你可以动态构建它.但在现实世界中,switch语句通常会有特殊情况.我把它作为读者的练习.

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有