2009-12-03 6 views
0

PHP 프로그래머가 (진지한) 진술에 많은 어려움을 겪었으므로 어떻게 처리하는지 궁금합니다. 스위치, if-elseif-else 또는 if-else 구조를 사용하고 있습니까?빠른 처리를위한 가장 좋은 방법

나는 2 개 이상의 경우를 처리 할 때 개인적으로 스위치 선택기를 사용하는 것을 선호합니다. 이것은 또한 성과 관점에서 가장 좋은 방법입니까? 중첩 된 문장은 어떻습니까?

원하는 방법과 답변에 궁금합니다.

세 - 옵션 - 선택의 필요성 :

스위치 사용 : 사용

switch($option) 
{ 
    case 1 : $result= "foo"; break; 
    case 2 : $result= "bar"; break; 
    default : $result= "foobar"; 
} 

을 경우-ELSEIF - 다른

if($option == 1) 
{ 
    $result= "foo"; 
} elseif ($option == 2) 
{ 
    $result= "bar"; 
} else 
{ 
    $result= "foobar"; 
} 

사용하는 경우-IF- else

if($option == 1) 
{ 
    $handle = "foo"; 
} 
if($option == 2) 
{ 
    $result = "bar"; 
} 
else 
{ 
    $result = "foobar"; 
} 
+0

당신이 예제를 줄 수 : 게으른 프로그래머로서, 나는 사물의 종류 가고 싶어? – Gumbo

+0

질문이 너무 광범위하기 때문에 더 많은 정보가 필요합니다. 해결책은 너무 많은 중첩 된 if 문이 필요없는 프로그램 디자인을 수정하는 것입니다. –

답변

1

모두하지만 초보 프로그래머 switchif..else보다 빠르다고 알고 있지만 if 문에 입력 할 수있는 모든 복합 표현식을 대체 할 수는 없습니다 (예 : 논리 AND를 사용하는 두 표현식)

function foo() 
{ 
    if (/* expr1 */) 
    { 
    // code 

    if (/* expr2 */) 
    { 
     // code 

     if ( /* expr3 */) 
     { 
     // code 
     if (/* expr4 */) 
     { 
      // code   
     } 
     } 
    } 
    } 
} 

처럼 중첩 코드에 대해 이야기하는 경우 16,

또한, 그럼 내가 말할 수있는 것은, 그 일을 중지하십시오된다. 기능을 일찍 종료하도록하는 약간의 가드 조건이 있습니다. 위 스타일은이 스타일로 다시 작성되었습니다. 물론

function foo() 
{ 
    if (!/* exp r1 */) 
    { 
    return; 
    } 
    // code 1 

    if (!/* expr 2 */) 
    { 
    return; 
    } 
    // code 2 

    if (!/* expr 3 */) 
    { 
    return; 
    } 
    // code 3 

    if (!/* expr 4 */) 
    { 
    return; 
    } 
    // code 4 
} 

하는 실제 응용 프로그램에서이 두 아마도 더 많은 기능을 추가하여 더 나은 리팩토링 할 수있다.

+0

두 번째 예에서 접근법을 중단 한 적이 없지만 분명히 나에게 의미가 있습니다. 게다가 코드는 특히 10 배 정도 중첩 될 때 훨씬 더 읽기 쉽습니다. Btw, 나는 성능 문제에 대해 몰랐다.) – Ben

1

많은 경우에 하나의 로직을 공유하면 편리하게 스위치를 찾을 수 있습니다. 예.

case 1: 
case 2: 
case 3: 
    // do stuff for 1, 2 and 3 
    break; 
case 4: 
    // other stuff just for 4 
    break; 
default: 
    // fallback for everything else 
    break; 

의 그 스위치가 않습니다주의하는 것이 중요합니다 특정 시나리오

에 바람직하지 않은 될 수 loose comparison

가 성능 관점에서 말을 너무 많이하지 않아도

+0

스위치는 일반적으로 일반 ifs보다 빠릅니다. –

+0

은 모든 프로그래밍에서 사용하거나 PHP 만 사용합니까? 스위치가 더 빠른 이유에 대해 자세히 설명해 주시겠습니까? – Sneakyness

+0

나는 당신에게 동의한다. 그것은 깔끔하게 보이고 특정 기준이 발견되면 쉽게 그룹을 가져올 수있다. – Ben

1

세 가지 예제를 보면 가장 아름답고 깨끗한 것이 선택하기 쉽습니다. switch 문. 스위치의 느슨한 비교로 살 수 있다면 선택하십시오. 이 수준에서 잠재적 인 이익이 극히 적기 때문에 성능 고려 사항은 일반적으로 무의미합니다.

+0

나는 이점이 거의 없다는 것을 안다.하지만 표준을 사용하지 않는 이유는 무엇인지 잘 아는가? 최적 화는 덩어리가 아닌 비트 단위로 이루어집니다.) 모든 동아리는 '매끄럽게'하기 위해 함께 작동해야합니다. – Ben

+0

당신이 의미하는 바를 알고 있지만 당신의 의견을 공유하지 않습니다 : 몇 밀리 초를 절약 할 수 있지만 코드는 읽기가 어려워지고 관리하기가 어려워 질 것입니다. 거의 모든 애플리케이션에서 일반적으로 병목 현상이 발생하여 최적화시 처리 시간을 수십 배 또는 수백 배 줄입니다. –

1

나는 보통 가장 깔끔한보고 이해하기 쉬운 방법을 선호합니다. 그러나, 나는 시도하고 질문을 할 필요가 절대 피하십시오. 코드에서 많은 양의 if/else 블록을 사용하면 디자인에 문제가 있음을 나타냅니다.
연관 배열을 만드는 것이 쉽다는 것을 감안할 때, 사소한 데이터 세트 이외의 다른 것에 대한 스위치 명령문보다 성능이 우수한 함수 또는 값에 키를 매핑 할 수있는 이유는 없습니다.또는 훨씬 더 나은 솔루션 인 polymorphism을 사용하면 커다란 if 또는 switch 블록을 단일 함수 호출로 변환하는 경우가 많습니다.

+0

함수를 배열로 매핑하여 만든 멋진 점도 있습니다. 내가 틀렸을지라도 인덱스는 항상 동일한 속도로 읽히지 않았고, 인덱스의 위치에 의존하지 않습니다. – Ben

+0

구현에 따라 O (n)의 선형 검색보다는 O (n log n) 또는 O (log n)에 가까울 수도 있습니다. – Yacoby

+0

분명히 당신은 나보다 수학을 더 공부했습니다. 로그 안 ..;) – Ben

1

이러한 미세 최적화가 필요한 경우 다른 언어를 사용해야합니다.

class blabla{ 
    private $_actions; 
    public function __construct(){ 
    $this->_actions = array(1 => '_firstAction', 
          2 => '_secondAction', 
          3 => '_thirdAction'); 

    } 
    public function whatever($choice){ 
    if(isset($this->_actions[$choice])){ 
     $this->{$this->_actions[$choice]}(); 
    } 
    } 
    private function _firstAction(){} 
    private function _secondAction(){} 
    private function _thirdAction(){} 
} 
+0

하지만 코드가 읽기에 불편 해하게 만들지 않습니까? – Ben

+0

2 개 또는 3 개의 다른 선택 사항에 대해서는 읽기가 어려울 수 있습니다. 하지만 10 개가 있다면, 깔끔한 배열을 큰 스위치 나 if/else 블록보다 훨씬 더 좋아합니다. – Arkh

+0

당신도 포인트가 있어요;) +1! – Ben