我的问题是关于实例化选项......
(我用PHP编写,但问题适用于一般OOP)
举一个示例域对象:
class User{
private $id;
private $name;
private $email;
...
etc
}
目前已在2个地方实例化。
控制器: 来自客户端的请求。控制器提取POST变量,实例化User对象并将其传递给堆栈。
数据访问层: 某些服务调用了一些getUser()方法。用户数据从数据库中提取,DAL实例化User对象并将其传递给堆栈。
我们有2个构造函数选项
选项1
public function __construct($id, $name, $email,...){
$this->id = $id;
$this->name = $name;
$this->email = $email;
...
}
在这种情况下,控制器实例化对象,如下所示:
parse_str($_POST['data'], $data);
$user = new User($data['id'], $data['name'], $data['email'],...);
DAL实例化对象:
$row = ...Get row from DB...
$user = new User($row['id'], $row['name'], $row['email'],...);
这是明确/明确的,但将我们的域对象的实例化与控制器和DAL相结合。如果我们决定将另一个字段添加到User表,我们必须更新域对象,控制器和DAL。
选项2
public function __construct($data){
...check $data is valid etc, handle if not...
$this->id = $data['id'];
$this->name = $data['name'];
$this->email = $data['email'];
...
}
在这种情况下,控制器实例化对象,如下所示:
parse_str($_POST['data'], $data);
$user = new User($data);
DAL实例化对象:
$row = ...Get row from DB...
$user = new User($row);
现在,如果我们决定将另一个字段添加到User表,我们只需要更新域对象。
问题