2011-09-12 3 views
0

중첩 된 IF 문이 너무 많아서 속도, 크기 및 가독성을 최적화하는 방법에 대한 제안이 있으면 궁금합니다.많은 IF 문 최적화

다음은 if 문 중 하나와 해당 중첩 문을 보여주는 예제입니다. 이 문서에는 약 25-30 가지가있을 것입니다.

if($row["inlet_moisture"] > $row["inlet_moisture_high_warning"]) { 
    if($row["inlet_moisture"] > $row["inlet_moisture_high_critical"]) { 
     if($row["inlet_high_critical"] == 0) { 
      if($row["email_notification"] == 1) { 

      } 
      if($row["mobile_notification"] == 1) { 

      } 
     } 
    } else { 
     if($row["inlet_high_warning"] == 0) { 
      if($row["email_notification"] == 1) { 

      } 
      if($row["mobile_notification"] == 1) { 

      } 
     } 
    } 
} else if($row["inlet_moisture"] < $row["inlet_moisture_low_warning"]) { 
    if($row["inlet_moisture"] < $row["inlet_moisture_low_critical"]) { 
     if($row["inlet_low_critical"] == 0) { 
      if($row["email_notification"] == 1) { 

      } 
      if($row["mobile_notification"] == 1) { 

      } 
     } 
    } else { 
     if($row["inlet_low_warning"] == 0) { 
      if($row["email_notification"] == 1) { 

      } 
      if($row["mobile_notification"] == 1) { 

      } 
     } 
    } 
} 

아이디어는; 나는 을 읽는 (temp/speed/moisture)이고, 만약 내가 그것이 맞는지를 확인해야한다면, 어떤 한계 (high warning/high critical/low warning/low critical)를 치는지 점검 할 필요가있다. 이미 경고를 보냈습니다. 알람이 전송되지 않은 경우 사용자가 알람 알림 (모바일/이메일/모두)을 요청했는지 확인해야합니다.

현재이 기능이 작동합니다. 나는 얼마나 무거워서 싫어하나요? 이 문제를 개선 할 수 있습니까?

감사합니다.

+0

가장 먼저하는 일이다 선호하는 것, 예를 들어, '$ inlet_moisture = $ row [ "inlet_moisture"]'등등. 이 과정에서 나는 모든 곳에서'== 1'을 명시 적으로 검사 할 필요가 없도록'boolean'으로 변환 할 것입니다. –

+0

@Oli, 실적에 영향을 미칩니 까? 또한, 값은 내 DB에 boolean으로 저장되지만, MySQL은 부울 값에 대해 0과 1을 반환합니다. 나는'$ email_notification = $ row [ "email_notification"] == 1일까요? true : false;' – rlemon

+2

이것은 성능에 거의 영향을 미치지 않는다고 생각합니다 (확인을 위해 프로파일 링해야하지만). 또한, 당신은'? true : false'. –

답변

2

이 나에게 훨씬 더 명확한 것, 당신이 중첩 된 IFS를 결합 할 수에도 불구하고 오히려 짧은 변수 이름을 만들어 가독성을 향상시키기 위해 할 것이 하나

if($row["inlet_moisture"] > $row["inlet_moisture_high_critical"]) { 
    if($row["inlet_high_critical"] == 0) { 
    $message = 'the pertinent message'; 
    } 
} 
else if($row["inlet_moisture"] > $row["inlet_moisture_high_warning"]) { 
    if($row["inlet_high_warning"] == 0) { 
    $message = 'the pertinent message'; 
    } 
} 
else if($row["inlet_moisture"] < $row["inlet_moisture_low_critical"]) { 
    if($row["inlet_low_critical"] == 0) { 
    $message = 'the pertinent message'; 
    } 
} 
else if($row["inlet_moisture"] < $row["inlet_moisture_low_warning"]) { 
    if($row["inlet_low_warning"] == 0) { 
    $message = 'the pertinent message'; 
    } 
} 


if($row["email_notification"] == 1) { 
    sendMessage($message, $email); 
} 
if($row["mobile_notification"] == 1) { 
    sendMessage($message, $mobile);  
} 
+0

알림 조건에서 나중에 플래그로 사용하기 위해 $ message를 처음에 false 또는 null로 초기화 할 수 있습니다. 예 : if ($ row [ "email_notification"] && $ message) {...} –

1

Premature optimisation is the root of all evil - 우리가 여기서 다루는 것과 관련하여, 당신이 무엇을 하든지 성능에 별다른 영향을주지 않습니다.

if 문 다량 종종 성능을 향상 또는 가독성 미해결이지만 여부, 하나 개 이상의 switch 구조로 대체 될 수 있음을 미루어 보아. 반복적 인 코드 비트에 대해 일부 기능을 만들 수도 있지만 실제로 성능에 부정적인 영향을 미칠 수 있습니다.

위의 사용자 의견에서 ... 더 멋진 이름으로 변수를 만들면 성능에 거의 영향을 미치지 않습니다. 메모리 사용량을 약간 늘리면 처리 시간에 미치는 영향이 0이됩니다. 그리고 값을 부울 값으로 평가하는 경우 1은 여전히 ​​TRUE이고 0은 FALSE으로 계산되므로 명시 적으로 부울로 변환 할 필요가 없습니다. 당신이 원하는 경우 그러나, 그것은

$email_notification = $row["email_notification"] == 1 ? true : false; 

... 불필요하게 긴 호흡, 당신은이 작업을 수행 할 수 있습니다

$email_notification = $row["email_notification"] == 1; 
... 또는 ...

$email_notification = (bool) $row["email_notification"]; 

... 같은 효과가 있습니다.

+0

나의 가장 큰 '최적화'포인트는 가능할 것입니다; 위의 요구 사항/구조와 함께이 모든 소형 또는 소형 있지만 모든 경우를 처리 할 수 ​​있습니다. 그러나 나는 당신의 요점을 좋아합니다. – rlemon

+0

@rlemon 위의 코드에서 여러분이 궁금해하는 것이 문서의 크기라면, 그것을 하나의 블록과'foreach '로 줄일 수는 있지만, 이것은 성능을 떨어 뜨릴 수 있습니다. 내가 무엇을 의미 하는지를 보여주기 위해 나의 대답을 편집 할 것이다 ... – DaveRandom

+0

@rlemon Feida Kila의 반응은 아마도 당신이 겪은 것일 것이다. 더 이상 프로세서/메모리는 효율적이지 않지만 확실히 가독성을 향상시킵니다. – DaveRandom