近几天,我一直在编写类,起初我认为它们符合命令设计模式,但现在我已经对它们进行了修改,并且好奇它们实际上匹配哪种模式(如果有的话)。
一个基本例子是我正在使用的类,用于查询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);
}
据我所知,一个命令对象应该带有一个接收者对象,但我的命令对象没有。而且我的客户端和调用者似乎是同一个对象。再加上我使用公共变量来传输有效负载数据,我觉得这明显不符合命令模式的要求。
更让事情变得混乱的是,我在命令超类中添加了一些功能,可以让我跟踪发生的错误。例如:
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()
来测试错误。到目前为止,这种模式对我来说一直运作良好。我知道设计模式的细节并不总是固定的,解决问题比担心语义更重要,但我真的很好奇,并想看看能否改进我的代码(或者我是否在自掘坟墓)。