Entity или Value-object

Обсуждаем, как правильно строить приложения
Ответить
Trent
Сообщения: 10
Зарегистрирован: 2019.04.25, 08:43

Entity или Value-object

Сообщение Trent » 2019.07.03, 15:16

Есть агрегат Company, который описывает организацию, в которой есть определенные специализации "Монтаж", "Электрика", "Проводка" и т.д.

Код: Выделить всё

 public function __construct(
            ID $id,
            Name $name,
            array $phones,
            array $addresses,           
            array $specializations
    ) {

        Assert::notEmpty($license, 'The company must contain at least one license');
        $this->id = $id;
        $this->name = $name;
        $this->phones = new Phones($phones);
        $this->addresses = new Addresses($addresses);      
        $this->specializations = new Specializations($specializations);      
        $this->companyRating = $this->getRatingBySpecialization();
       
    }
VO Specializations

Код: Выделить всё

 public function __construct(array $directions) {
        if (!$specializations) {
            throw new \DomainException('must contain at least one specialization');
        }
        foreach ($specializations as $specialization) {
            if ($this->getValid($specialization)) {
                $this->add($specialization);
            }
        }
    }
      public function getValid($specialization): bool {
        if (!in_array($specialization->getSpecializationName(), $this->allAvailableSpecialization, true)) {
            throw new \DomainException('specialization must be valid');
        }
        return true;
    }
    
    public allAvailableSpecialization = [
    'Электрика',
    'Монтаж'
    ...
    ]
        
Т.е вся валидация это сравнение входящих данных с массивом, захаркорденым в код. Естественно, я хотел бы получать его из базы. Делать тогда этот массив entity с уникальными идентификатором или просто заполнять его из агрегата Company и туда же его записывать (что не совсем, наверное, правильно)
Последний раз редактировалось Trent 2019.07.05, 12:51, всего редактировалось 1 раз.

anton_z
Сообщения: 440
Зарегистрирован: 2017.01.15, 15:01

Re: Entity или Value-object

Сообщение anton_z » 2019.07.04, 13:26

Trent писал(а):
2019.07.03, 15:16
Т.е вся валидация это сравнение входящих данных с массивом, захаркорденым в код. Естественно, я хотел бы получать его из базы. Делать тогда этот массив entity с уникальными идентификатором или просто заполнять его из агрегата Company и туда же его записывать (что не совсем, наверное, правильно)
Список специализаций прям так часто меняется? Я бы так это захардкоденным и оставил. Вынос таких вещей в таблицу ничего общего с нормализацией не имеет, а запросы может усложнить. Если меняется нечасто лучше это хардкодить.

Trent
Сообщения: 10
Зарегистрирован: 2019.04.25, 08:43

Re: Entity или Value-object

Сообщение Trent » 2019.07.04, 13:47

Меняется редко. Но это по феншую будет вообще?

anton_z
Сообщения: 440
Зарегистрирован: 2017.01.15, 15:01

Re: Entity или Value-object

Сообщение anton_z » 2019.07.04, 14:05

У меня в проекте тоже много чего было повынесено в отдельные таблицы, хотя не менялось годами. А запросы от этого стали сложнее. Страдает время отклика, нагрузка на сервер БД выше. К тому же сложные запросы хуже читаются и понимаются.

Что касается феншуя, то ничего общего с нормализацией выделение статусов (или таких как у вас специализаций) не имеет. Если нет требований по созданию/изменению специализаций со стороны пользователей системы - то я бы не стал выносить. Да и вообще я о феншуях стараюсь думать поменьше, а побольше о практической пользе для решаемой задачи.

Trent
Сообщения: 10
Зарегистрирован: 2019.04.25, 08:43

Re: Entity или Value-object

Сообщение Trent » 2019.07.05, 12:50

Спасибо. Пока оставлю тогда в коде

Ответить