哪个类理想地分配属性:User或UserFactory?

时间:2013-12-22 14:16:45

标签: php mysql oop factory-pattern

我有一个班级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类构造函数添加多个参数...我想听听你的想法。

(我知道这些'理想的代码风格'问题可能是主观的,希望我没有违反任何社区准则。)

1 个答案:

答案 0 :(得分:1)

UserFactory实际上不是工厂类,而是Data Mapper

所以你的第二个例子是正确的,因为域模型不应该对数据库有任何了解。您也可以将其与Table Data Gateway结合使用。

有关此主题的更多信息:http://richard.jp.leguen.ca/not-blog/why-use-table-data-gateways/