2010-11-22 14 views
3

私は授業を書いてきましたが、最初は授業デザインパターンに従っていると思っていましたが、修正してから実際にどのパターンにマッチしているのか不思議です。これはどのようなデザインパターンですか?

基本的な例は、FacebookのAPIをクエリしてページのフィードを取得するためのクラスです。私のクラスには、次のようになります。

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パターンと一致しないように感じます。

さらに問題を混乱させるために、私はコマンドスーパークラスにいくつかの機能を追加しました。これにより、発生したエラーを追跡していきます。たとえば:

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

もラベルにハングアップを取得しないようにしてください。これらのパターンは、初めてプロジェクトに参加するとき、またはプロジェクトを設計するときに、オブジェクトから期待されるものを簡単に知ることができるように設計されています。私はコマンドが十分に近いと言うでしょう。たぶんあなたはこの風味を自分の名前にするべきでしょうか?フィールドコマンド? lol – DampeS8N

+3

古来の知恵は、まずパターンを覚えなければならない、パターンを忘れなければならないということです。そうすれば真のマスターになります。 –

+0

@Bill Yang - あ、とても禅。私はそれが好きです。 –

答えて

3

私のコマンドパターンに似ています。クライアントはCommandを作成し、イニシエータはexecuteメソッドを呼び出し、受信者はexecuteを実装するものです。

あなたのインスタンスでクライアントとイニシエータが同じであるという理由だけで、私のパターンは変わっていないようです。私は重要な部分は、コンストラクタのパラメータを渡すコマンドを作成するか、プロパティを設定することだと思います。コマンドインタフェースのexecuteメソッドを呼び出すだけで、後で他のオブジェクト(intitiator)によってコマンドを実行することができます。そのステージでパラメータを知る必要はありません。

1

これは私にとって戦略パターンの始まりのような小さなものです。

1

コマンドパターンは、遅延実行に便利です。遅延パターンの実行は、作成または配置に依存しない引数で呼び出すことができます。

facade patternはおそらくあなたに適しています。

例:


class MyFacebookApi { 
    function __construct(Facebook $fb) 
    function getFeed() 
    function sendWallpost($msg) 
    function getError() 
} 
関連する問題