nepster-web
@nepster-web

Создание сущности или в каких случаях оправданы сеттеры?

Как правило при работе с сущностями есть 2 подхода.
- вносить данные через конструктор
- вносить данные через сеттеры

Я выбрал подход с вводом данных через конструкторы, так как в нем нет нарушений целостности данных и он гарантирует имутабельность сущности.

Пример сущности:
<?php

class System
{
    private $id;
    private $alias;
    private $status;
    private $date;

    public function __construct
    (
        int $id,
        string $alias,
        Currencies $supportedCurrencies,
        SystemStatus $status,
        SystemServiceInfo $serviceInfo,
        Date $date
    )
    {
        $this->id = $id;
        $this->alias = $alias;
        $this->supportedCurrencies = $supportedCurrencies;
        $this->status = $status;
        $this->serviceInfo = $serviceInfo;
        $this->date = $date;
    }

    public function getId(): int
    {
        return $this->id;
    }

    public function getAlias(): string
    {
        return $this->alias;
    }

    public function getStatus(): SystemStatus
    {
        return $this->status;
    }

    public function getDate(): Date
    {
        return $this->date;
    }
}


в ходе этого я с толкнулся с такой проблемой, что когда нужно обновить 1 поле, нужно пересобрать сущность (да, тут конечно сеттер был бы к стати). На ум приходит только одно фабрика + полное создание новой сущности.

Однако запутанность ситуации в том, что если я получаю сущность и мне нужно изменить в ней одно поле, для этого нужно создать новую сущность, а чтобы это сделать ее необходимо собрать из существующих данных, то появляется куча хелперов для перегонки сущности в массив и обратно.

Как в таких случаях (собирать сущность) лучше всего поступать ?
  • Вопрос задан
  • 190 просмотров
Решения вопроса 1
@Fortop
Tech/Team lead
Если вам нужно менять сущность, то не делайте её иммутабельной, т.е спокойно используйте сеттеры.

Если вы все таки желаете работать с иммутабельной сущностью, то нужно смириться с гидрацией её в массив и обратно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@novrm
Смотри на контроллер и понимай, что если внедрений нужно сделать тысяча - контроллер раздуешь до беспредела.
Сеттеры - лучшее решение.
Кроме того сеттеры и геттеры можно легко засунуть в трейт - кода станет меньше.
А внедрение сделать не через фабрику - а через общий делегатор с общим ServiceManager.
Ответ написан
dmitriylanets
@dmitriylanets
веб-разработчик
- в конструктор пихаешь то что является обязательным при создании модели
- я всегда использую сеттеры с возвращением текущего объекта, тем удобно формировать модель извне,
$system 
   = (new System(1))
        ->setStatus(5)
        ->setAlias(1)
        ->setServiceInfo($serviceInfo)
;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы