我有一个类User
和一个类UserFactory
(工厂模式)。工厂连接到SQL并创建用户对象的实例。
因为我们经常要对从数据库中检索到的字段进行预处理,所以我想知道哪个地方是最好的预处理位置。例如(简化):
class UserFactory {
function getUserByID($id) {
$q = $this->DB->query("SELECT id, name, email FROM user WHERE id = ?", $id);
if(!$q)
return FALSE;
return new User($q);
}
}
class User {
function __construct($obj) {
if(!empty($obj->id)) $this->ID = (int) $obj->id;
if(!empty($obj->name)) $this->name = $obj->name;
if(!empty($obj->email)) $this->email = $this->verifyEmail($obj->email);
}
}
在这个例子中,
User
对象做实际的处理,但是我不喜欢当我把这个User
设计成SQL和PHP之间的一层时,我仍然被迫在UserFactory
对象中使用实际的SQL字段名。所以我可以将处理移到
UserFactory
中,如下所示:class UserFactory {
function getUserByID($id) {
$q = $this->DB->query("SELECT id, name, email FROM user WHERE id = ?", $id);
if(!$q)
return FALSE;
$user = new User($q->id);
$user->setName($q->name);
$user->setEmail($q->email);
return $user;
}
}
class User {
function __construct($id) {
$this->ID = (int) $id;
}
function setName($name) {
$this->name = $name;
}
function setEmail($email) {
$this->email = $this->verifyEmail($email);
}
}
我想这是一个很好的方法,但是现在我对每个属性进行额外的函数调用,这似乎是不必要的,而且我必须用我创建的每个
UserFactory
函数手动设置一个属性列表。理想情况下,我应该在哪里处理这些字段并将它们分配给对象?什么是“公认的方式”?我是为每个属性创建一个setter,还是向
User
类构造函数添加多个参数。。。我想听听你的想法。(我知道这些“理想的代码风格”问题可能是主观的,希望我没有违反任何社区准则。)
最佳答案
UserFactory
实际上不是一个工厂级,而是一个Data Mapper。
所以您的第二个例子是正确的,因为域模型不应该知道任何关于数据库的信息。你也可以把它和Table Data Gateway结合起来。
有关此主题的详细信息:http://richard.jp.leguen.ca/not-blog/why-use-table-data-gateways/
关于php - 哪个类理想地分配属性:User或UserFactory?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20730330/