В течение последних нескольких дней я писал классы, которые, на первый взгляд, я придерживался шаблона проектирования 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()
До сих пор этот шаблон работал довольно хорошо для меня.Я знаю, что детали шаблона проектирования не всегда написаны в камне, и что более важно решить проблему, чем беспокоиться о семантике, но мне искренне любопытно это и хочу посмотреть, смогу ли я улучшить свой код (или если я как-то копаю себе могилу).