在开关箱里放一个开关箱是不是不好的做法
Is it bad practice to have a switch case in a switch case?
在开关案例中使用开关案例是不是一种糟糕的做法?如果是,有哪些替代方案?如果我不需要的话,我真的不想使用if
/else if
。
而不是做一些类似的事情:
if((this == 1) && (that == 1)){ //something }
else if((this == 1) && (that == 2)){ //something }
else if((this == 2) && (that == 3)){ //something }
我当时的想法是:
switch(this){
case 1:
switch(that){
case 1:
// something
break;
....
}
break;
....
}
在我看来,这确实是错误的。不是语法错误,而是正确的练习错误。
拥有能做很多不同事情的大量函数是不好的做法。如果你在switch案例中有一个switch案例,这表明你的函数可能太大了,你应该考虑把它分成更小、更容易理解的块。
但没有硬性规定;这完全取决于具体情况。
避免以下方法
switch(id)
{
case 1:
{
switch (subid)
{
case 4:
// nested code
}
}
case 2:
// some code
}
通过将嵌套部分移动到方法中来改进代码的首选方法
switch(id)
{
case 1:
SubSwtich(subid);
break;
case 2:
// some code
}
function SubSwtich(int subid)
{
switch (subid)
{
case 4:
// nested code
}
}
我会认为这是一个糟糕的做法。在大多数情况下,这是不可读的。
您可以提取"子"切换案例到方法。
如果这会使代码更难阅读,那么这是一种糟糕的做法。
在你的特定例子中是否是这种情况由你决定,但总的来说,我想说可能是这样。
你要求其他选择。。。
-
将部分代码提取到子函数中。例如:
case 'foo' : myVar = 'blah'; break; case 'bar' : myVar = secondLevelFunction(); break;
这里,
secondLevelFunction()
包含附加的switch()
语句,其中每个case
返回myVar
的值。 -
使用数组映射。例如:
var mapper = {'foo':'blah', 'bar':'bibble', etc}; //now, instead of a big switch(input) { .... } block that sets myVar //for each option, you can just set it directly in a single line, like so: var myVar = mapper[input];
此外,如果您正在寻找代码质量的具体衡量标准,您应该了解Cyclomatic Complexity。这是一个函数复杂程度的度量。通过观察函数有多少"决策点"来进行度量。每个case
、if
、循环等都是一个"决策点"。你拥有的越多,你的功能就越复杂。
循环复杂性与代码质量和良好的编码实践密切相关,因此,如果函数的CC得分很高(如果它有多个嵌套的switch
块,它可能会这样做),那么这是代码质量差的标志。我上面描述的两种替代解决方案都可以帮助解决这一问题。我会让你在CC上读更多。
显然,替代方案需要根据您的需求进行调整,但希望它们能给您一些想法。
您应该根据switch语句在不同的例程中中断代码,并且在例程中您也可以继续使用switch case。就像下面一样。
private void Switch(int value)
{
switch (value)
{
case 1:
SwitchNest(value);
break;
case 2:
break;
}
}
private void SwitchNest(int value)
{
switch (value)
{
case 1:
SwitchOtherMethod(value);
break;
case 2:
break;
}
}
不良做法?不当涉及到故障排除时,这可能是一种潜在的痛苦!看看你能做些什么,把所有的"选项"都变成更有组织性和通用性的东西。甚至可以使用由发送的参数数量决定的方法重载来编写自己的函数。
看看这个SO的帖子,看看它是否给了你一些想法。
- 我是不是一直在为图像标签强制固定图像大小
- JS请求-这是不是过时了
- 在javascript中使用覆盖变量是不是一种糟糕的做法
- AngularJS-我是不是在工厂注射中遗漏了什么
- 试图把注意力集中在一个不重要的元素上是不是一种糟糕的做法;不存在
- 我正在验证一个联系人表单.我是不是过滤太多了
- Uglifier是不是弄坏了我的睡衣
- 有没有办法缩短Require.js's require statement?我是不是误解了怎么用它
- 比较:用缓冲区视图调整ArrayBuffer的大小(Uint8 vs Float64),我是不是遗漏了什么
- 用Javascript在forEach中设置开关是不是一种糟糕的做法
- 无法在单个网页上加载所有谷歌图表;我是不是错过了什么
- 微观优化,是不是被现代浏览器优化了
- Java小程序——今天是不是一个错误的选择
- Angular 模板缓存是否在应用程序之间共享?是不是坚持不懈
- JQuery 缓存选择器 - 我是不是误会了
- ThreeJS camera.lookAt() 没有效果,是不是我做错了什么
- 有很多小功能来消除冗余是不是很好
- 在HTML中使用脚本模板是不是一种糟糕的做法
- 把JS文件放在网页的底部是不是很实用
- 在开关箱里放一个开关箱是不是不好的做法