2012-08-07 2 views
11

중첩 된 IF 문을 여러 개 사용하는 것이 좋지 않은 경우 이 궁금합니다.PHP - 중첩 IF 문

는 예 :

if(!change_password($email, $password, $new_password, $confirm_new_password) 
{ 
    echo 'The form was not filled in correctly!'; 
    exit; 
} 

나는 이런 내 모든 함수를 호출하고, 내 코딩 스타일에 문제가 있는지 궁금하네요 :

function change_password($email, $password, $new_password, $confirm_new_password) 
{ 
    if($email && $password && $new_password && $confirm_new_password) 
    { 
     if($new_password == $confirm_new_password) 
     { 
      if(login($email, $password)) 
      { 
       if(set_password($email, $new_password)) 
       { 
        return TRUE; 
       } 
      } 
     } 
    } 
}  

이 기능은 다음과 같이 사용된다. 나는이 디자인을 따르면 모든 단일 함수가 IF로 중첩되어 모든 단계에서 오류가 있는지 검사한다는 것을 의미하므로 내 의구심을 갖고 있습니다. 이것은 다른 사람들이하는 일입니까?

중첩 된 IF가 삼각형 모양을 만들고 중간에 원하는 결과 만 갖는 많은 스크립트가 이와 같이 작성된 것을 볼 수 없습니다. 중간에 도달하지 못하면 무언가가 엉망이되었습니다.

이것은 좋은 기능 구조입니까?

+0

당신은 단순히 하나의 if 문에 모든 내용을 추가하거나 그대로 두어 개인 취향에 대한 모든 것을 명확히 할 수 있습니다 – Hawili

답변

29

중첩이 너무 심한 것은 일반적으로 나쁜 생각입니다. 스파게티 논리이며 따르기가 어렵습니다. 귀하의 확인 단계의 각각 이전 단계에 따라 성공 한 이후, 모든 둥지를하지 않습니다 - 단계가 실패하면 그냥 보석 :

function change_password(blah blah blah) { 
    if (!$condition1) { 
     return false; 
    } 
    if (!$condition2) { 
     return false; 
    } 
    etc.... 


    // got here, must have succeeded 
    return true; 
} 

논리 순서가 무엇인지 명시 적으로 명확하게 그. 너무 많이 들여 쓰기가 좀 짜증나 얻을 수 있습니다 -

2

나는 확실히 잘 읽을 쉽게 한 if 문 난 아직도 이런 식으로 일을 선호하는 것 그러나

if (blah and blah and blah and blah and blah and blah and blah) {} 

처럼 사용하여 비교하여 이해 될 수 있다고 생각 :

function change_password($email, $password, $new_password, $confirm_new_password) 
{ 
    if (!$email || !$password || !$new_password || !$confirm_new_password) return false; 
    if ($new_password != $confirm_new_password) return false; 
    if (!login($email, $password)) return false; 
    if (!set_password($email, $new_password)) return false; 

    return true; 
} 
1

이 때문에 여분의 비교를 피할 수 있습니다 순서를 변경하여, 둥지 그들에게 좋을 수있다.

function change_password($email, $password, $new_password, $confirm_new_password) 
{ 
    if($new_password == $confirm_new_password && $email && $password && $new_password && $confirm_new_password) 
    { 
     if(login($email, $password)) 
     { 
      if(set_password($email, $new_password)) 
      { 
       return TRUE; 
      } 
     } 

    } 
} 

$의 여기서 new_password는 == $의 confirm_new_password은 사실이지만, $ 이메일이 비어있는, 당신은을 한 경우 : 대신으로 쓴 경우에 당신이 지금하고있는 것은 좋아 보인다, 그러나 당신의 기능은 덜 효율적이 될 것입니다 추가 비교.

다른 사람들이 말했듯이, 기능적으로 동등한 모든 것을 중첩하지 않고이 문제를 해결할 다른 방법이 있습니다.