在构建表示某些对象状态的列表时,我应该询问每个对象的状态并自己修改列表,还是应该给对象列表并告诉它添加自己?
我正在为页面上的输出构建一个模板列表。表单元素要求将此列表精简为键/值对。一位同事提到我应该更多地关注“告诉,不要问”,我正在努力理解这个问题的原则。
我采取了一种方法,我创建了一个 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());
这两种方法都有优势吗?还有什么我完全没有考虑到的吗?