天天看點

寫給所有程式員_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{
    }
}      

繼續閱讀