Задать вопрос
Twitt
@Twitt

ValueObject — зачем?

Узнал про ValueObject, и "запах" - Одержимость примитивами. Вот выдержка по причинам появления:
Программисту понадобилось поле для хранения каких-то данных. Он подумал, что создать поле элементарного типа куда проще, чем заводить новый класс. Это и было сделано. Потом понадобилось другое поле, и оно было добавлено схожим образом.

Допустим в классе User, будет поле orderBy, я сделал поле, сделал setters, getters, в которых я напрямую указал тайпхинтингом, что setOrderBy(int $orderBy) будет принимать параметром и возвращать целочисленное число, в чем я тут проигрываю по сравнению с тем, что я должен был бы сделать класс OrderBy в котором value бы валидировалось на int в конструкторе? Таких примеров масса, как по мне это именно лишние классы, которые не нужны. Может кто то сможет дать пример, почему именно ValueObject а не то как я описал выше?

Заодно, может подскажете, зачем тогда нужны примитивы если можем сделать ValueObject?
  • Вопрос задан
  • 313 просмотров
Подписаться 2 Простой 1 комментарий
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 1
Maksclub
@Maksclub Куратор тега PHP
Такой Value Object ВИДИМО создали, чтобы логику например его создания не городить в самих сущностях, например у этого VO может быть свой специфичный конструктор. Также у этого объекта возможны методы направления сортировки, вплоть до самых интересных -- эти знания тоже могут быть лишними для нашей сущности... Много чего может быть, вплоть до того, что нужно смотреть на некие другие данные и строить стратегию сортировки. И чтобы не нарушать SRP -- эту всю логику вынесли в самостоятельный объект, который не является сущность, значит в общепринятых терминах -- это VO.

Такое может быть с чем угодно -- с датами, с метатегами (объект Meta для разных сущностей будет как правило с одной сиггатурой), для Id и даже может быть объект Name (в нем могут быть формирования коротких, длинных, сокращённый и всевозможных других состояний)

Если у вас есть вопрос, замечу -- резонный, то вам такая абстракция просто напросто не нужна в силу простоты этого узла системы. Используйте int, но назовите тогда понятным свойством, например position или priority
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@EvgeniiR
https://github.com/EvgeniiR
Value Object`ы всегда валидны. Не получится создать VO "дата", например VO DateTimeImmutable и записать в него 35 апреля 2019 года.
Они могут состоять из несколких примитивов, например Point из {x,y} или {x,y,z}
Можно удобненько напихать в него статических конструкторов.
Можно на уровне типов требовать сразу валидную дату.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽