Javascript 在开关箱中安装开关箱是一种不好的做法吗?
在开关箱中安装开关箱是一种不好的做法吗?如果是,有哪些替代方案?如果我不需要,我真的不想使用Javascript 在开关箱中安装开关箱是一种不好的做法吗?,javascript,coding-style,Javascript,Coding Style,在开关箱中安装开关箱是一种不好的做法吗?如果是,有哪些替代方案?如果我不需要,我真的不想使用if/else if 而不是像这样做: if((this == 1) && (that == 1)){ //something } else if((this == 1) && (that == 2)){ //something } else if((this == 2) && (that == 3)){ //something } 我的思路是: swit
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;
....
}
我只是觉得这真的不对。在语法上没有错,但在正确的练习上是错误的。p>我会认为这是一个错误的练习。在大多数情况下,这是不可读的
您可以将“子”切换情况提取为方法。使用大量的函数来完成许多不同的事情是不好的做法。如果在交换机的情况下有一个开关情况,这表明您的函数可能太大,应该考虑将其拆分为更小更容易理解的块。
但没有硬性规定;这完全取决于具体情况。坏习惯?不当涉及到故障排除时,可能是一种潜在的痛苦!看看你能做些什么,把所有的“选项”变成更有组织、更普遍的联系。甚至可以使用由发送的参数数量决定的方法重载编写自己的函数
看看它是否给了你一些想法。你应该根据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;
}
}
避免采用以下方法
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];
案例
,如果
,循环等都是一个“决策点”。你拥有的越多,你的功能就越复杂
圈复杂度与代码质量和良好的编码实践密切相关,因此,如果您的函数具有较高的CC分数(如果它有多个嵌套的开关
块,可能会这样),那么它就是代码质量差的标志。我上面描述的两种替代解决方案都可以帮助实现这一点。我将留给你阅读更多关于CC的内容
显然,替代解决方案需要根据您的需要进行调整,但希望它们能给您一些想法。我可以看到合适的情况。但是我会盯着它看很长时间,看看我是否能找到一个更简单的技术。实际上不是一个傻瓜,但有相关的/有趣的信息:为了得到相关的答案,最好是将你的代码添加到问题中…而不是像这样做:if((this==1)&((this==1)){//something}或者if((this==1)&((this==2)){//something}否则,如果((this==2)&&(that==3)){//something}我想的是:switch(this){case 1:switch(that){case 1:}break;}一个一次性使用的函数,我认为不值得。更不用说,您现在在代码中跳转位置以遵循工作流程,而不是一个位置。(从可读性的角度来看,这可能是IMHO,我宁愿筛选嵌套的开关,也不愿去寻找一次性的函数。)谢谢大家给出的好答案。我欣赏所有的洞察力。