Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在开关箱中安装开关箱是一种不好的做法吗?_Javascript_Coding Style - Fatal编程技术网

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,我宁愿筛选嵌套的开关,也不愿去寻找一次性的函数。)谢谢大家给出的好答案。我欣赏所有的洞察力。