2010-11-22 2 views
3

지난 며칠간 저는 처음에 커맨드 디자인 패턴을 고수했다고 생각한 클래스를 작성했지만, 그 이후로 수정 한 적이 있습니다. 그리고 어떤 패턴이 실제로 일치하는지에 대해 궁금합니다.어떤 디자인 패턴입니까?

기본 예제는 Facebook 피드에 페이지 피드를 가져 오도록 쿼리하는 데 사용하는 클래스입니다. 내 클래스는 다음과 같습니다

class FetchPageFeedCommand extends Command { 

    public $feed; 

    private $pageId; 

    public function __construct($pageId) { 
     $this->pageId = $pageId; 
    } 

    public function execute() { 
     if ($feed = Facebook::api('/page/feed') /* psuedo code */) { 
      $this->feed = $feed; 
      return true; 
     } else { 
      return false; 
     } 

    } 
} 

나는 다음과 같은 클래스를 사용합니다 :

$com = new FetchPageFeedCommand(12345); 
if ($com->execute()) { 
    $feed = $com->feed; 
    print_r($feed); 
} 

내가 이해에서 Command 개체 내하지 않는 수신기 객체를해야합니다. 그리고 내 클라이언트와 호출자가 같아 보입니다. 공용 변수를 사용하여 데이터를 페이로드한다는 사실을 추가하면 커맨드 패턴과 확실히 일치하지 않는 것처럼 느껴집니다.

더 많은 것을 혼란스럽게하기 위해 Command superclass에 몇 가지 기능을 추가하여 발생하는 오류를 추적하도록하겠습니다. 예를 들어 :

public function execute() { 
     if ($feed = Facebook::api('/page/feed') /* psuedo code */) { 
      $this->feed = $feed; 
      return true; 
     } else { 
      $this->addError('Could not fetch feed'); // Error management 
      return false; 
     } 

그때 $com->hasErrors()

$com->getErrors() 지금까지이 패턴이 나를 위해 꽤 잘 작동되었습니다와 오류를 테스트합니다. 나는 디자인 패턴의 세부 사항이 항상 돌로 쓰여진 것은 아니며, 의미를 걱정하는 것보다 문제를 해결하는 것이 더 중요하다는 것을 알고 있지만, 나는 진정으로 궁금해하며 코드를 개선 할 수 있는지보고 싶어한다. 또는 나는 어떻게 든 나 자신을 무덤에 파고있다).

+3

하는 것은 너무 얻을 라벨을 끊었하지보십시오. 이 모든 패턴은 처음 프로젝트에 올 때 또는 객체를 만들 때 객체에서 기대하는 것을 쉽게 알 수 있도록 설계되었습니다. 나는 Command가 충분히 가깝다고 말한다. 어쩌면 당신은이 맛을 자신의 이름으로 주어야합니까? 필드 명령? lol – DampeS8N

+3

고대의 지혜에 의하면, 먼저 패턴을 배워야하고 패턴을 잊어 버려야합니다. 그러면 당신은 진정한 주인이되기 시작합니다. –

+0

@Bill Yang - 아, 매우 젠. 나는 그것을 좋아한다. –

답변

3

저에게 커맨드 패턴처럼 보입니다. 클라이언트는 명령을 작성한 사람이고 개시자는 실행 메소드를 호출하고 수신자는 실행을 구현하는 사람입니다.

클라이언트와 초기자가 인스턴스에서 동일하기 때문에 패턴이 변경되지 않는 것 같습니다. 중요한 부분은 생성자의 매개 변수를 전달하거나 속성을 설정하여 명령을 만드는 것입니다. 명령은 나중에 명령 인터페이스의 execute 메소드를 호출하여 다른 객체 (intitiator)에 의해 실행될 수 있습니다.이 단계에서는 매개 변수를 알 필요가 없습니다.

1

그것은 전략 패턴의 시작처럼 보입니다.

1

명령 패턴은 지연된 실행에 유용하며 생성 또는 위치와 무관 한 인수로 호출 할 수 있습니다.

facade pattern은 아마도 당신에게 더 적합 할 것입니다.

예 :


class MyFacebookApi { 
    function __construct(Facebook $fb) 
    function getFeed() 
    function sendWallpost($msg) 
    function getError() 
} 
관련 문제