封装实例化参数还是使它们显式化?

时间:2015-07-23 12:27:22

标签: php oop instantiation

我的问题是关于实例化选项......

(我用PHP编写,但问题适用于一般OOP)

举一个示例域对象:

class User{

    private $id;
    private $name;
    private $email;
    ...
    etc
}

目前已在2个地方实例化。

  1. 控制器: 来自客户端的请求。控制器提取POST变量,实例化User对象并将其传递给堆栈。

  2. 数据访问层: 某些服务调用了一些getUser()方法。用户数据从数据库中提取,DAL实例化User对象并将其传递给堆栈。

  3. 我们有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表,我们只需要更新域对象。

    问题

    • 每个构造函数选项的优点是什么?
    • 这样做有最好的做法吗?

0 个答案:

没有答案