在過去的幾天裏,我一直在編寫課程,起初我認爲堅持Command設計模式,但是我已經對它們進行了修改,並且對它們真正匹配哪種模式感到好奇(如果有的話)。這是什麼設計模式?
一個基本的例子是我用來查詢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模式。
爲了進一步弄清事情,我在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()
到目前爲止,這種模式一直運作良好,我測試錯誤。我知道設計模式的細節並不總是寫得很好,解決問題比解決語義問題更重要,但我真的很好奇這一點,並希望看看我是否可以改進我的代碼(或者如果我以某種方式挖掘自己的墳墓)。
儘量不要太掛在標籤上。所有這些模式的設計目的都是爲了讓您更容易知道您第一次參加項目時或者您正在設計項目時對象的期望。我會說Command很接近。也許你應該給這個味道它是自己的名字?現場指揮?大聲笑 – DampeS8N 2010-11-22 19:47:51