If statement 简化复杂的if语句

If statement 简化复杂的if语句,if-statement,optimization,coldfusion,If Statement,Optimization,Coldfusion,我有一个值矩阵,我需要对照它来在页面上显示不同的内容。vars VALUE A和VALUE B各自至少有3种可能的状态。下面的代码运行良好,但我想知道是否有更好/更智能的方法来处理此问题。谢谢 <cfif valueA EQ -1 AND valueB EQ -1> <!--- Do something ---> <cfelseif valueA EQ -1 AND valueB EQ 0> <!--- Do something ---&

我有一个值矩阵,我需要对照它来在页面上显示不同的内容。vars VALUE A和VALUE B各自至少有3种可能的状态。下面的代码运行良好,但我想知道是否有更好/更智能的方法来处理此问题。谢谢

<cfif valueA EQ -1 AND valueB EQ -1>
    <!--- Do something --->
<cfelseif valueA EQ -1 AND valueB EQ 0>
    <!--- Do something --->
<cfelseif valueA EQ -1 AND valueB EQ 1>
    <!--- Do something --->
<cfelseif valueA EQ -1 AND valueB GT 1>
    <!--- Do something --->
<cfelseif valueA EQ 0 AND valueB EQ -1>
    <!--- Do something --->
<cfelseif valueA EQ 0 AND valueB EQ 0>
    <!--- Do something --->
<cfelseif valueA EQ 0 AND valueB EQ 1>
    <!--- Do something --->
<cfelseif valueA EQ 0 AND valueB GT 1>
    <!--- Do something --->
<cfelseif valueA EQ 1 AND valueB EQ -1>
    <!--- Do something --->
<cfelseif valueA EQ 1 AND valueB EQ 0>
    <!--- Do something --->
<cfelseif valueA EQ 1 AND valueB EQ 1>
    <!--- Do something --->
<cfelseif valueA EQ 1 AND valueB GT 1>
    <!--- Do something --->
<cfelseif valueA GT 1 AND valueB EQ -1>
    <!--- Do something --->
<cfelseif valueA GT 1 AND valueB EQ 0>
    <!--- Do something --->
<cfelseif valueA GT 1 AND valueB EQ 1>
    <!--- Do something --->
<cfelseif valueA GT 1 AND valueB GT 1>
    <!--- Do something --->
</cfif> 

ColdFusion引擎不会看到上面代码的复杂性。人类开发人员将有一点困难(尽管我确信有些人在解析它时没有问题,(不是我)

这是我的版本,使用编辑器的代码折叠,它使阅读更容易,至少对我来说是这样

<cfif valueA EQ -1>

    <cfif valueB EQ -1>
        <!--- Do something --->
    <cfelseif valueB EQ 0>
        <!--- Do something --->
    <cfelseif valueB EQ 1>
        <!--- Do something --->
    <cfelseif valueB GT 1>
        <!--- Do something --->
    </cfif>    

<cfelseif valueA EQ 0>

    <cfif valueB EQ -1>
        <!--- Do something --->
    <cfelseif valueB EQ 0>
        <!--- Do something --->
    <cfelseif valueB EQ 1>
        <!--- Do something --->
    <cfelseif valueB GT 1>
        <!--- Do something --->
    </cfif> 

<cfelseif valueA EQ 1>

    <cfif valueB EQ -1>
        <!--- Do something --->
    <cfelseif valueB EQ 0>
        <!--- Do something --->
    <cfelseif valueB EQ 1>
        <!--- Do something --->
    <cfelseif valueB GT 1>
        <!--- Do something --->
    </cfif> 

<cfelseif valueA GT 1>

    <cfif valueB EQ -1>
        <!--- Do something --->
    <cfelseif valueB EQ 0>
        <!--- Do something --->
    <cfelseif valueB EQ 1>
        <!--- Do something --->
    <cfelseif valueB GT 1>
        <!--- Do something --->
    </cfif> 

</cfif>



我希望它能有所帮助。

为了向您展示不同选项的不同行为,我创建了一个小提琴,其中包含了迄今为止提供的2个
cfif
选项,并添加了一个
开关
选项,其中带有一点数学魔法,可以使开关工作

整把小提琴在:

我的
开关
代码:

local.valA = arguments.valueA>1?99:arguments.valueA ; // If GT 1, then 99
local.valB = arguments.valueB>1?99:arguments.valueB ; // If GT 1, then 99

local.finalOut = "" ;

switch (valA*valB) { // multiply the two vals and it will be -1,0,1,99,-99 or -99*99
    case -1 : // One is -1 and One is 1 >> 1*-1=-1
        if (valA == 1) {
            finalOut = "1,-1" ;   
        } else {
            finalOut = "-1,1" ;
        }
        break ;
    case 1 : // Both are either 1 or -1  >> -1*-1=1 | 1*1=1
        if (valA == 1) {
            finalOut = "1,1" ;   
        } else {
            finalOut = "-1,-1" ;
        }
        break ;
    case 0 : // One is 0  >> 0*x=0
        if (valA == 0) {
            switch (valB) {
                case -1 : 
                    finalOut = "0,-1" ;
                    break;
                case 0 : 
                    finalOut = "0,0" ;
                    break;
                case 1 : 
                    finalOut = "0,1" ;
                    break;
                case 99 : 
                    finalOut = "0,99" ;
                    break;
            }
        } else {
            switch (valA) {
                case -1 : 
                    finalOut = "-1,0" ;
                    break;
                case 1 : 
                    finalOut = "1,0" ;
                    break;
                case 99 : 
                    finalOut = "99,0" ;
                    break;
            }
        }
        break ;
    default : // One > 1, Other not 0
        switch (ValA) {
            case -1 : // ValA is -1, ValB is >1
                finalOut = "-1,99" ;
                break ;
            case 1 : // ValA is 1, ValB is >1
               finalOut = "1,99" ;
                break ;
            case 99 : // ValA is >1, ValB <> 0
                switch (valB) {
                    case 1 :
                        finalOut = "99,1" ;
                        break ;
                    case -1 :
                        finalOut = "99,-1" ;
                        break ;
                    case 99 :
                        finalOut = "99,99" ;
                        break;
                }
                break ;
        }
        break ;
}
local.valA=arguments.valueA>1?99:arguments.valueA;//如果GT为1,则为99
local.valB=arguments.valueB>1?99:arguments.valueB;//如果GT为1,则为99
local.finalOut=“”;
开关(valA*valB){//将两个VAL相乘,它将是-1,0,1,99,-99或-99*99
案例-1://一个是-1,一个是1>>1*-1=-1
如果(valA==1){
finalOut=“1,-1”;
}否则{
finalOut=“-1,1”;
}
打破
案例1://两者都是1或-1>-1*-1=1 | 1*1=1
如果(valA==1){
finalOut=“1,1”;
}否则{
finalOut=“-1,-1”;
}
打破
案例0://一是0>>0*x=0
如果(valA==0){
开关(valB){
案例1:
finalOut=“0,-1”;
打破
案例0:
finalOut=“0,0”;
打破
案例1:
finalOut=“0,1”;
打破
案例99:
finalOut=“0,99”;
打破
}
}否则{
开关(valA){
案例1:
finalOut=“-1,0”;
打破
案例1:
finalOut=“1,0”;
打破
案例99:
finalOut=“99,0”;
打破
}
}
打破
默认值://一个>1,其他不是0
开关(ValA){
案例-1://ValA为-1,ValB为>1
finalOut=“-1,99”;
打破
案例1://ValA为1,ValB大于1
finalOut=“1,99”;
打破
案例99://ValA大于1,ValB为0
开关(valB){
案例1:
finalOut=“99,1”;
打破
案例1:
finalOut=“99,-1”;
打破
案例99:
finalOut=“99,99”;
打破
}
打破
}
打破
}
我的小提琴将3个选项中的每一个都放在一个函数中,因此我可以多次循环使用它们来演示它们并检查计时。有关这些功能,请参见上面的小提琴

注意:就性能而言,您肯定希望尽可能地缩短逻辑。我的
switch
和Alex的
cfif
解决方案都比原始的、未嵌套的
cfif
快一点。这说明了嵌套选项以绕过某些逻辑的价值

cfif
自上而下工作。当我将数组更改为添加大约100K行,并且主要包括在循环早期满足条件的值,而不必经过许多选项时,这三个选项的性能非常相似。如果我将选项末尾的条件包括在内,那么原始的
cfif
执行速度比短路逻辑的其他两个选项慢约三分之一,其中
cfif
开关的执行速度非常相似

我测试了大约1米、10万和10万行。行数较少时,所有3行的性能都非常接近。我假设这可能是因为变量实例化和数学检查相当一致(尽管迭代次数很多),并且在
cfif
版本中不需要

我没有测试的一件事是标签和脚本。我用脚本语法编写了我的
开关
,用标记语法可能会稍微快一点。我也没有测试脚本中的
cfif
s。这可能会有点不同。改变逻辑也可能改变选项的速度


TL;DR:因为我相信您说过您将使用此方法仅评估一组值,那么Alex的解决方案可能会最有效。我认为你应该选择这里最容易阅读和解释的内容。我的示例主要是因为您询问了性能问题。:-)

看看开关/箱子。是的,也许会干净一点。我可以将所有值加载到二维数组中,然后使用switch/case。谢谢开关只能测试相等值,所以在本例中我看不出开关是如何工作的。@Redtopia正确,我很抱歉。我想的更多的是SQL的
CASE/WHEN
是如何工作的。如果有大量的案例需要过滤,你可以做一些数学魔术来加速。据我所知,
if/else