我有一个班级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字段名称{{I} 1}}设计为SQL和PHP之间的一层。
所以我可以将处理移动到UserFactory
,如此:
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);
}
}
的属性列表我创造的功能。
理想情况下,我会在哪里处理这些字段并将它们分配给对象?接受的方式是什么'?我会为每个属性创建一个setter,还是为UserFactory
类构造函数添加多个参数...我想听听你的想法。
(我知道这些'理想的代码风格'问题可能是主观的,希望我没有违反任何社区准则。)
答案 0 :(得分:1)
UserFactory
实际上不是工厂类,而是Data Mapper。
所以你的第二个例子是正确的,因为域模型不应该对数据库有任何了解。您也可以将其与Table Data Gateway结合使用。
有关此主题的更多信息:http://richard.jp.leguen.ca/not-blog/why-use-table-data-gateways/