當建立一個表示一些對象狀態的列表時,我應該詢問每個 對象的狀態並自己修改列表,或者我應該給對象 列表並告訴它添加本身?建立一個基於對象狀態的列表
我正在構建頁面上輸出模板的列表。表單元素 要求將該列表蒸餾至鍵/值對。一位同事提到 ,我應該更多地關注「告訴,不要問」,並且我正在努力讓 理解這個問題的原理。
我已經採取了一種方法,我創建了TemplateList 的一個實例,然後要求每個模板將自己添加到列表中。這允許模板 確定它將傳遞給TemplateList::addTemplate()
的參數。
class TemplateList {
public $templates = array();
public function addTemplate($id, $label) {
$this->templates[$id] = $label;
}
public function getTemplates() {
return $templates;
}
}
interface TemplateInterface {
public function addToTemplateList(&$templatelist);
}
class DiskTemplate implements TemplateInterface {
public function addToTemplateList(&$template_list) {
$template_list->addTemplate($this->name, $this->name);
}
}
class DatabaseTemplate implements TemplateInterface {
public function addToTemplateList(&$template_list) {
$template_list->addTemplate($this->id, $this->name);
}
}
使用範例:
$template_list = new TemplateList;
// fetch $disk_templates and $db_templates
foreach ($disk_templates as $template) {
$template->addToTemplateList($template_list);
}
foreach ($db_templates as $template) {
$template->addToTemplateList($template_list);
}
另一種方法是要求模板用於它的狀態和結果添加到模板列表:
$template_list = new TemplateList;
// fetch $template
$template_list->addTemplate($template->propertiesForTemplateList());
是否有優勢,這兩種方法?還有什麼我完全沒有考慮到的?
哈,哎呦。我有一個標籤中的「告訴,不要問」文章,只是改變了文字。固定。感謝您的答覆。 –
不客氣。如果你可以閱讀奈特的文章;它不僅具有我閱讀過的關於OO設計的最好建議,而且它也很容易閱讀。 –