2012-08-09 21 views
4

回報考慮以下兩種編碼的樣式:嵌套條件下對比上出現意外結果

嵌套條件:

if(is_numeric($user_id)) { 

    // .. do stuff 
    if(is_valid_user($user_id)) { 
     return foo($user_id); 
    } else { 
     return FALSE; 
    } 

} else { 
    return FALSE; 
} 

與只是單純的停止什麼是錯的:

if(!is_numeric($user_id)) { 
    return FALSE; 
}  

// .. do stuff 

if(!is_valid_user($user_id)) { 
    return FALSE; 
} 

return foo($user_id); 

這當然至少部分是關於味道;但這兩種不同的風格稱爲什麼?

什麼時候比另一個更喜歡?

還有其他的,也許更乾淨的編碼風格?

回答

1

我通常認爲最簡單的東西是閱讀的嵌套最少。出於這個原因,我更喜歡第二種風格。當然,不管你使用什麼風格,我甚至會稍微改變你的第二個例子,讓我更容易閱讀。

if(!is_numeric($user_id)) return FALSE; 

// .. do stuff 

if(!is_valid_user($user_id)) return FALSE; 

return foo($user_id); 

對我而言,右側的返回語句讓他們脫穎而出。而且,將所有東西放在一行上,可以幫助我描繪出正在成爲大門的聲明,並輕鬆地將代碼分割成幾部分......但那只是我自己。

1

您可以完全不用關閉else

if (is_numeric($user_id)) { 

    // do stuff 

    if (is_valid_user($user_id))  
     return foo($user_id); 
} 

return false; 

有點清潔,少代碼,仍然易於閱讀/理解。

+0

但在is_numeric檢查和is_valid_user檢查之間存在代碼 – hackattack 2012-08-09 23:50:21

+0

@hackattack在問題 – 2012-08-09 23:52:19

+0

中沒有提到否? ...我從2/if語句 – hackattack 2012-08-09 23:57:23

1

與您的問題相關的另一種編碼風格是每個方法/函數只有一個return語句。

學校經常教這個原則。我認爲Martin Fowler最初是基於一些在線搜索的支持者。

主要原因可能與PHP無關,但是在C語言中,例如,如果您在需要清理的函數中動態分配內存,返回到整個地方要麼導致重複代碼,泄漏內存,或者不得不使用goto來獲得釋放內存的代碼。