Инкапсулировать аргументы инстанцирования или сделать их явными?

Мой вопрос касается вариантов реализации …

(Я написал на PHP, но вопрос применим к общему ООП)

Возьмите пример доменного объекта:

class User{

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

В настоящее время он создан в 2 местах.

  1. контроллер:
    Запрос приходит со стороны клиента. Контроллер извлекает переменные POST, создает экземпляр объекта User и передает его в стек.

  2. Уровень доступа к данным:
    Некоторый метод getUser () вызывается из некоторого сервиса. Пользовательские данные извлекаются из БД, и DAL создает экземпляр объекта User и передает его в стек.

У нас есть 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

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]