2010-05-07 4 views
3

나는 약간의 자작 ORM (학문적 관심사)를 쓰고있다. TDD 개념을 교육용으로 고수하면서이 연습의 일환으로 클래스를 개발할 때 API에 대한 설명서를 작성하고 있습니다.PHP OOP : 인수 유형별 고유 메소드?

사례 연구 - 고전적인 "getCollection"유형 매퍼 클래스 작업 중입니다. 특정 사용자에 대한 애셋 X의 콜렉션 (블로그 포스트라고 가정 해 봅시다)과 숫자 값의 임의의 배열을 기반으로하는 콜렉션을 검색 할 수 있기를 원합니다. 그래서 - 당신은 getCollection 방법에 대한 설명서를 서면으로, 그래서이

$User = $UserMapper->load(1); 
$ArticleCollection = $ArticleMapper->getCollection(range(10,20)); 
$ArticleCollection = $ArticleMapper->getCollection($User); 
$ArticleCollection = $ArticleMapper->getCollection($User->getId()); 

중 하나와 같은 방법이있을 수 있습니다 - 나는 Docblock의 @param 변수를 선언합니다. 각 인수 유형에 대해 고유 한 메소드를 갖는 것이 더 좋습니까? 아니면 인수 유형에 따라 올바른 내부 메소드/클래스에 위임하는 메소드를 사용할 수 있습니까?

답변

6

올바른 내부 메소드를 위임하는 방법이 허용됩니다. 이처럼 문서 수 : 다음

@param Array|User|Integer $argName optional explanation 

그러나 다시, 각

public function getCollectionByRange(array $range) 
public function getCollectionByUser(User $user) 
public function getCollectionByUserId($id) 

또한, 위의 방법이 존재 척하는 magic __call method를 사용할 수있는 하나의 방법을 갖는 방해 아무도 없다 그런 다음 메서드 호출을 캡처하고 내부 메서드 (ZF does that f.i. for finding dependant database rows)에 위임합니다. 클래스 DocBlock에 @method 주석을 사용하여 이러한 메소드를 문서화합니다. 그러나 마법 방법은 항상 적절한 방법을 사용하는 것보다 더 느린다는 것을 명심하십시오.

응용 프로그램 및 용도에 가장 적합하다고 생각되는 것을 사용하십시오.

1

소리가이고 과부하를 원하지만 PHP (PHP5조차도)는 Java와 같이 오버로드를하지 않습니다. PHP 매뉴얼의 Overloading section하지 function overloading입니다 :

참고 : 의 PHP의 해석은 "오버로드"가장 객체 지향 언어와 다릅니다. 을 오버로드하면 전통적으로 이름이 같지만 인수가 다른 유형 인 유형의 여러 메소드를 가질 수 있습니다.

이 의미가 있습니다

class ArticleMapper { 
    public function getCollection($param) { 
     if (is_array($param)) { $this->getCollectionByArray($param); } 
     if (is_int($param)) { $this->getCollectionByInt($param); } 
     if (is_a($param, 'User')) { $this->getCollectionByUser($param); } 
    } 
    private function getCollectionByArray(array $param) { ... } 
    private function getCollectionByInt($param) { ... } 
    private function getCollectionByUser(User $param) { ... } 
} 

이 내 눈에 그것을 할 수있는 좋은 방법처럼 보인다.

+0

덕분에, 답을 고맙게 생각하며 초기 구현에 매우 가깝습니다. 내가 궁금한 점은 OOP 베스트 프랙티스 관점에서 고유 한 메소드 re : responsibility를 사용하는 것이 더 나은가라는 것입니다. – sunwukung

+0

아, 좋은 지적 : http://php.net/manual/en/language.oop5.typehinting.php 필자는 대답에서 그 잘못된 "int"를 제거 할 것이다. – artlung

1

당신은 (PHP는 ADA, 자바, C# 또는 C++ 예를 들어 같은 다른 언어에서 알려진이 개념을 지원하지 않습니다) 런타임에 전달 된 매개 변수의 유형을 확인하여 method overloading 뭔가를 얻을 수 :

[...] 
/** 
* @param User|array|integer $user 
* @return array 
*/ 
public function getCollection($user) { 
    // perhaps a switch-case would be better here 
    if ($user instanceof User) { 
     // do what has to be done if you passed in a User object 
    } else if (is_int($user) { 
     // do what has to be done if you passed in a user id 
    } else if (is_array($user)) { 
     // do what has to be done if you passed in an array of user ids 
    } 
} 
[...] 
+0

답변 해 주셔서 감사합니다. 그러나 어떻게, 왜 (또는 "우수 사례"로 간주되는) 방법에 덜 흥미 롭습니다. – sunwukung

+0

"귀하의 애플리케이션 및 용도에 가장 적합하다고 생각되는 것을 사용하십시오." - 고든이 26 분 전에 내가 생각하기에 덧붙였다. 대부분의 경우 나는 최선의 접근 방법이 없다고 생각합니다. 개인적으로 API를 깔끔하게 유지하기 때문에 one-method-approach를 사용합니다. –