2012-09-23 51 views
2

我已經查了幾個其他的問題,但他們真的不給我我所期望的答案..嵌套if語句,任何可能的清潔方法?

我的代碼是這樣的..

private function handle() 
{ 
    if() 
    { 
     if(!condition) 
     { 
      if(!condition) 
      { 
       if(!condition) 
       { 
        if(!condition)) 
        { 
         if(!condition) 
         { 
          if(!condition) 
          { 
           if(!condition) 
           { 
            if(!condition) 
            { 
             if(!condition) 
             { 
              code 
             } 

             return; 
            } 

            return; 
           } 

           return; 
          } 

          return; 
         } 

         return; 
        } 

        return; 
       } 

       return; 
      } 


      return; 
     } 

     return; 
    } 
} 

在我看來,這是可讀的,但凌亂,可悲的是我還沒有找到真正讓它看起來很「漂亮」的方法。有任何想法嗎?

編輯:每個返回是不同的。編輯2:給我一個答案,謝謝大家!

+2

如果實際代碼存在的唯一位置在最內層範圍內,那麼可以將結構扁平化爲類似於if(first_precondition_failed){return error_1; } if(second_precondition_failed){return error_2; } ... if(last_precondition_failed){return error_x; }/* code * /'。 – DCoder

+0

你只是遞歸的if語句沒有語句塊,直到到達'code'部分,我建議像[Rajat Singhal](http://stackoverflow.com/users/1114536/rajat-singhal)建議的那樣。 – hjpotter92

回答

3

條件可以由&& operator..It作品形式左至右,這意味着,只要任何一個從左側開始出現故障,它會停止評估條件..

if($a) { 

    if($b) { 
    } 

} 

合併能替換爲

if($a && $b) { 
} 
+0

抱歉沒有指出,但每一個都會返回一個不同的錯誤。 –

+0

@Manuel,如果他們*返回*錯誤,那麼你的代碼也將更順利,非嵌套ifs:'if(!$ a)return $ error1;'(等等等等)可讀。後來ifs只有在前ifs沒有拋出錯誤的情況下才會被評估。 – tucuxi

0

使用變量檢查或將條件組合成更少的IF語句。

變量檢查,像這樣:

$execute = TRUE; 
// Opposite of what you want, e.g. if you want $a only to be TRUE, do $a !== TRUE 
if (condition) { 
    $execute = FALSE; 
} 

... 
// If all the conditions were met, then everything is OK 
if($execute === TRUE) { 
    // code 
}else { 
    // return 
} 

編輯: 可變檢查可以優選相結合IF語句,如果你想在什麼返回更多的控制,例如如果特定條件失敗,則會發生某些特定情況,這種組合條件並不總是允許的。

0

像已經發布使用

if(condition1&&condition2){} 

,或者如果這是不行的,你也可以使用功能,只要條件爲真

function some(){ 
if(!conditon 1){return 0;} 
if(condition 2) {return 1;} 
} 

這提供了更多的功率第二,如果停止只有在先不滿足時纔有效。 您必須根據您的要求進行選擇。有時雖然嵌套循環是不可避免的。

0

我以爲它已經找到了一個很好的方法,基本上我會爲每個基本條件做一個方法,我會用if運算符(&)在if語句中調用它們,它不要短路。

/** 
* nonsql_condition - It means it doesn't check with the database 
* 
* sql_condition - It means it does check with the database. 
*/ 
if(!$this->nonsql_condition() & !$this->nonsql_condition() & !$this->nonsql_condition() & !$this->nonsql_condition()) 
{ 
    if(!$this->sql_condition()) 
    { 
     return error; 
    } 

    if(!$this->sql_condition()) 
    { 
     return error; 
    } 

    code; 
} 

這使我可以在我的方法中使用更少的代碼行,並且不會對我的數據庫進行不必要的查詢。