Что это за дизайн? - PullRequest
       3

Что это за дизайн?

3 голосов
/ 22 ноября 2010

В течение последних нескольких дней я писал классы, которые, на первый взгляд, я придерживался шаблона проектирования Command, но с тех пор я изменил их, и мне любопытно, с каким шаблоном они действительно соответствуют (если таковые имеются).

Базовый пример - это класс, который я использую для запроса API-интерфейса 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 должен принимать объект-приемник, а мой -не.И кажется, что и мой клиент, и invoker одинаковы.Добавьте к этому тот факт, что я загружаю данные с открытыми переменными и чувствую, что это определенно не соответствует шаблону 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 ]

3 голосов
/ 22 ноября 2010

Похоже, шаблон командования для меня. Клиент - это тот, кто создает Команду, инициатор - это тот, кто вызывает метод execute, а получатель - тот, кто реализует execute.

То, что клиент и инициатор у вас одинаковы, похоже, не меняет шаблон для меня. Я думаю, что важной частью является то, что вы создаете команду, передавая параметры в конструкторе или устанавливая свойства. Впоследствии команда может быть выполнена другим объектом (инициатором), просто вызвав метод execute интерфейса команды - ей не нужно знать параметры на этом этапе.

1 голос
/ 23 ноября 2010

Шаблон команды полезен для отложенного выполнения, может вызываться с аргументами, которые не зависят от его создания или местоположения.

Возможно, вам больше подойдет шаблон фасада .

Пример:


class MyFacebookApi {
  function __construct(Facebook $fb)
  function getFeed()
  function sendWallpost($msg)
  function getError()
}
1 голос
/ 22 ноября 2010

Для меня это немного похоже на начало паттерна Стратегии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...