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