我有一个Display
对象来处理脚本的HTML输出。它具有mode
属性,该属性定义了如何生成输出的许多方面。有几种模式,我可能会在以后添加更多。每种模式都意味着它自己的参数。例如,author
模式意味着authorID
。 search
模式意味着Search
对象作为参数,其中包含查询信息。 comment
模式意味着postID
和commentID
参数。
因此,mode
有一个name
和一些parameters
,具体取决于name
。
我决定创建一个Display_Mode
对象,它有两个属性:name
和parameters
。但是,如何将parameters
分配给names
?因此,如果我使用comment
模式,则有必要表示有postID
和commentID
个参数?
我目前的解决方案是:
class display_mode{
public $name;
public $params;
public function __construct($name)
{
$this->name = $name;
switch ($this->name){
case 'comment':
$this->params = array('postID', `commentID`);
break;
case 'author':
$this->params = array('authorID');
}
//etc..
}
}
这看起来有点乱。有没有更好的办法?
UPD:给出答案让我问another question,关于整个设计,这也为这个提供了背景。
答案 0 :(得分:4)
最好将Display_Mode
类的常用功能抽象为抽象基类或接口,然后将每个单独的模式定义为从基类继承(或实现接口)的类。 / p>
然后,这些专用模式类将在其构造函数和/或方法中明确定义它们所需的参数,并负责生成每个“模式”所需的输出。
但是,如果不确切地知道你的Display_Mode
课程应该做什么,那么很难给出更具体的建议。
这里的想法是你应该避免在OOP中使用do-it-all类,而是选择每个只有一个目的的小型自包含类。通过为每个模式提供可以独立呈现其内容的类,您可以轻松更改显示模式的工作方式或添加新模式。您所要做的就是添加一个新类。
这称为 loose coupling 。
答案 1 :(得分:1)
描述有点令人困惑,但我会为Display
的每个可能的“参数”创建一个适配器。此适配器可以提供单个接口,与您要显示的资源无关。
$parameter = new UnknownPrameter;
$adapterFactory = new AdapterFactory;
$parameter = $adapterFactory->build( $parameter );
$display->present( $parameter );
其中AdapterFactory::build()
为您提供的特定类型参数创建包装器。返回的实例是该参数的容器。
这种方法还可以防止计算在构造函数中累积,这会使代码更难以测试/扩展。