天天看点

写给所有程序员_if...else简化研究

编程过程中,发现一些if…else写的很乱,需要整理,以下代码中A表示逻辑表达式1,B表示逻辑表达式2。一般情况下不会用A和B,但此处似乎用A和B更清晰,所以用A,B。

简单的与

int num = 0;
if(A){
    if(B){
        num  = 5;
    }
}      

可转换为:

int num = 0;
if(A && B){
    num  = 5;
}      

简单的或

int num = 0;
if(A){
   num  = 5;
}else if(B){
   num  = 5;
}      

可转换为:

int num = 5;
if(A || B){
    num = 5;
}      

复杂变式:A和!A&&B设置相同

int num = 0;
if(A){
    num = 5;
}else{
    if(B){
        num = 5;
    }
}      

合成步骤1:

int num = 0;
if(A){
    num = 5;
}else if(B){
    num = 5;
}      

结果:

int num = 0;
if(A || B){
    num = 5;
}      

解析:

A||B含义:A成立时截断,不会判断B,A不成立时,判断B

验算表:

写给所有程序员_if...else简化研究

复杂变式:A&&B和!A设置相同

int num = 0;
if(A){
    if(B){
            num = 5;
    }
}else{
        num = 5;
}      

合成步骤1:

int num = 0;
if(!A){
    num = 5;
}else{
    if(B){
        num = 5;
    }       
}      

根据复杂变式:A和!A&&B设置相同带入上一个例子,可得:

if(!A||B){

}      

不过这几种写法也不绝对要这样变,如果改变后的含义不容易理解,上面那个,我宁可这样写:

int b = 0;

if(A && B){

b = 5;

}else if(!A){

b = 5;

}

复杂变式:与非和非或(数学逻辑)

int b = 0;
if(!(A&&B)){
    b = 5;
}      
int b = 0;
if(!A || !B){
    b = 5;
}      

复杂变式:或非和非与(数学逻辑)

int b = 0;
if(!(A||B)){
    b = 5;
}      
int b = 0;
if(!A && !B){
    b = 5;
}      

这种修改,是以含义完整性为前提的,否则以后再去检查,看不懂就悲催了,呵呵。尤其是后面两种,因为基于数学逻辑,虽然逻辑没错,但可能一下变得很难理解,这样的话就没有必要修改。

我很讨厌多重嵌套,看起来很糟糕,于是强迫自己计算下,新的逻辑方式可以让代码变得更整洁。通过计算发现了这些规律,特此记录。

附:

(1)

if(A){
    if(B){
    }else{
    }
}      
if(A && B){

}else if(A      
if(A){
    checkB();      
private void checkB(){
    if(B){
    }else{
    }
}