2010-03-28 541 views

回答

4

這兩者是等價的:

if (condition1) block1 
else if (condition2) block2 


if (condition1) block1 
else 
{ 
    if (condition2) block2 
} 

我相信他們也編到相同的組件,所以應該沒有什麼區別。

+1

這不取決於特定的語言嗎?雖然我想不出一種不正確的語言,但我確實可以創建一個:-) – Rune 2010-03-28 21:18:34

+0

+1編譯部分 – 2010-03-28 21:18:37

+0

符文,你是對的! :)但是C語法現在已經接管了這個世界。在哪裏是沒有算術符號的舊cobol ... – abc 2010-03-28 21:24:19

2

我要看你如何安排他們。嵌套的IF相當於增加一個和每個內部IFS的:

if(A) { 
    if(B) { 
     statement1 
    } 
    else if(C) { 
     statement2 
    } 
} 

等同於:

if(A and B) { 
    statement1 
} 
else if(A and C) { 
    statement2 
} 

我的建議是爭取可讀性和檢查你的邏輯。您可能會發現DeMorgan's Laws有助於重新安排您的邏輯。

這裏有一個總是讓我惱火:

if(A and B) { 
    statement1 
    statement2 
} 
else if(A and C) { 
    statement1 
    statement3 
} 
else if(not A) { 
    statement4 
} 

VS

if(A) { 
    statement1 
    if(B) { 
     statement2 
    } 
    else if(C) { 
     statement3 
    } 
} 
else if(not A) { 
    statement4 
} 

我只是不知道這是更具可讀性。它們在邏輯上等同。第一個更加表格化,更容易處理,但重複陳述1;第二個是更多的嵌套和有點醜陋(在我眼中),但不重複陳述。最終這是一個判斷的要求,因爲它對編譯器沒有任何影響。

+0

在第一個版本中,你正在重複代碼,所以我一定會選擇實現第二個代碼,這也使得它在我看來更具可讀性。重複的線條更加膨脹。 – Dkyc 2013-12-05 10:30:39

1

嵌套if-then-else控制結構是複雜邏輯規則的最小化翻譯。他們善於在檢查條件中避免冗餘。他們的主要缺點是,從長遠來看,這些結構可能會增長並使封閉方法變得過於龐大而複雜。打破嵌套if-then-else塊的第一步是標準化。例如:

if (A) { 
    if (B || C) { 
    block 1; 
    } else { 
    if (!D) { 
     block 2; 
    } 
    } 
} else { 
    block 3; 
} 

可以被歸一化到級聯if-then-else

if (A && (B || C) { 
    block 1; 
    return; 
} 
if (A && !B && !C && !D) { 
    block 2; 
    return; 
} 
if (!A) { 
    block 3; 
} 

我們已經消除else塊和進行了進一步提取方法重構容易。所有這三個如果塊可以被提取到獨立的方法,它們的名稱以其執行的業務邏輯命名。

+0

我喜歡這個想法,但我認爲那麼遠應該只用於保護子句而不是核心功能邏輯。此外,許多公司環境限制了函數可能具有的返回數量,因此這種方法可能無法實現。 – charlieb 2010-03-28 21:43:13

+0

由於嵌套的if-then-else子句,我見過一段時間以後像癌症一樣增長的方法。當他們必須由許多人維護時,沒有人有勇氣或願意將它們分成幾種方法。 '規範化'使得這種重構成爲可能,並且使代碼更好。 – 2010-03-29 07:16:02

+1

測試是勇氣的絕佳替代品。 – 2010-03-31 17:13:58