2014-04-09 4 views
0

이 예제 코드는 작동합니다. $ x는 기본적으로 키와 값이있는 객체이거나 키와 객체가 값인 배열입니다. $ y는 두 가지 방법으로 생성됩니다. 기능은 다른 곳에서는 사용하지 않을 경우이, 좋은 연습프로그래밍에서 '해킹'사용 하시겠습니까?

private function someFunction($x) { 
    if (is_object($x)) { 
     $y = 'result of something'; 
    } elseif (is_array($x)) { 
     $y = 'result of something'; 
    } else { 
     $y = null; 
    } 

    return $y; 
} 

인가? '비 해킹'방법은 아마도 배열을 본질적으로 배열이기 때문에 배열로 개체를 변환 한 다음 배열 수를 기반으로 논리를 만드는 것입니다.

아니면 그냥 '올바른 방법으로'코드를 작성하는 것에 대해 많이 생각하고 있습니까?

+1

사실 꽤 나쁜 습관입니다. 왜 항상이 함수에서 처리중인 데이터 구조를 같은 방식으로 구성하지 않는가? 이와 같은 코드를 가지고 있다면 일반적으로 디자인에 문제가 있음을 나타냅니다. – GordonM

+2

나는 이것에 쪼개졌다. 이상적으로, @GordonM이 말했듯이, 항상 같은 방식으로 데이터를 생성해야합니다. 초기화되지 않은 입력을 적절히 처리하기 위해'is_object '를 여전히 확인할 수 있습니다. 그러나 입력을 제어하지 않으면, 그렇지 않습니다. 이것이 왜 나쁜 생각인지를보십시오. –

+1

필자는이 기능을 사용하여 일반적으로 잘 될 것이라고 생각합니다. 특히 라이브러리/유틸리티 기능 일 경우에는 "무엇을 할 수 있습니까?"라는 말은 두 가지 유형의 입력 모두에 대해 현명하게 원하는 것일 수 있습니다. 본질적으로 is_XXX() 체크는 다른 언어가 호출 할 오버로드 된 함수의 버전을 결정하는 데 사용하는 것과 동일한 체크입니다. 'int myfunc (int param)'대'int myfunc (string param)' – TripeHound

답변

1

입력이 사용자에 의해 제어되고 데이터로 무엇을 할 것인지 알면이 기능을 사용할 수 있습니다. 그러나 외부로부터의 통제되지 않은 출처로부터의 입력에 대해서, 당신은 데이터가 유효한 지 확실히 알지 못하기 때문에 미리 데이터를 검증해야합니다.

내가 이해할 수없는 점은 변수가 두 가지 유형, 배열 또는 객체 일 수 있다는 점입니다.

배열로 변환 한 다음 처리하거나 자신의 함수를 사용하는 경우 중요한 것은 논리 흐름이 흐르고 코드가 의도 한대로 수행된다는 것입니다.

컨텍스트가 맞고 코드가 의도 한대로 작동하면 코드가 정상적으로 작동합니다.

2

PHP에서 이것은 실제로 이것이 가능할 수있는 유일한 방법이며 최소한 유형 검사를 위해 나쁜 습관이라고 부르지 않을 것입니다.

public String someFunction(Object $x) { 
    return "Result of something"; 
} 

public String someFunction(Object[] $x) { 
    return "Result of something"; 
} 

public String someFunction(int $y) { 
    return "Result of something"; 
} 

PHP, 난과 같이 우려의 유사한 분리를 건의 할 것입니다 :

는 PHP가
private function someFunction($x) { 
    if (is_object($x)) { 
     $y = $this->someFunctionObject($x); 
    } elseif (is_array($x)) { 
     $y = $this->someFunctionArray($x); 
    } else { 
     $y = $this->someFunctionScalar($x); 
    } 

    return $y; 
} 


private function someFunctionObject($x) { 

} 

private function someFunctionArray($x) { 

} 

private function someFuctionScalar($x) { 

} 

느슨한 타입 언어의 문제와 같은 자바와 다른 언어에서 우리는 방법 오버로드가 실제로 유형이 있고 때로는 그것들을 다루어야 할 때가 있습니다.

someFunction이 호출 될 때마다 변환을해야한다는 것은 반복되는 코드가 한 가지 방법에서 if/else보다 문제가 많아지기 때문에 내부적으로 형식 검사 및 변환보다 나쁜 것이라고 주장합니다.

+1

이 코드에서 어떤 개선점이 보이지 않습니다. – ponciste

+1

@ponciste : 많은 것들이 코드의 복잡성에 달려 있습니다. 모든 입력 유형에 대해 "거의 동일한"작업을 수행하는 단순한 경우에는 세 가지 개별 기능을 사용하는 오버 헤드로 인해 작업을 수행하기가 더 어려워 질 수 있습니다."수행중인 작업"이 더 복잡해 지거나 서로 다른 유형의 입력에 대한 동작이 서로 멀리 떨어지면 한 대의 디스패처와 세 개의 개별 기능을 사용하면 "나무"를 쉽게 볼 수 있습니다. 특정 유형)을 "나무"(differentnet 유형을 구별하고, 유형 불변 부분을 수행함). – TripeHound

관련 문제