我有一个类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/

10-09 00:50