pro-dev
@pro-dev

Должны ли Value Object быть Final?

Привет. Есть Value Objects разного типа. Замечал, что кто-то эти VO делает финальными. Соотвественно теряется возможность их наследования и изменения.

У меня есть VO: Status и Role. Их я Использую с Doctrine. Мне не достаточно передавать просто названия статуса. Хочу использовать расширенно и поместить проверку в конструктор на определенные Типы статусов: активный, неактивный, опубликованный.

Если статус не является одним из них - выбрасываем исключение. Так же было бы удобно в самом статусе создавать объект через методы фабрики: Status::active(), Status::publish().

В стандартном VO такого нет. Поэтому, хочу наследоваться, добавить свой функционал и использовать его.

Но сейчас пошли некоторые сомнения. Статус используется много где, как и роли. Так же он является не изменяемым. Тогда логично считать, что это VO. Но тут получается, что иногда его нужно наследовать и использовать со своими дополнительными проверками.

Возникло два вопроса:
1. Нужно ли создавать финальные классы для VO?
2. Является ли статус и роль VO?
  • Вопрос задан
  • 123 просмотра
Решения вопроса 1
Maksclub
@Maksclub Куратор тега PHP
maksfedorov.ru
Если статус не является одним из них - выбрасываем исключение. Так же было бы удобно в самом статусе создавать объект через методы фабрики: Status::active(), Status::publish().

Такой тип с перечислением необходимых значений называетсяEnum, Enum можно считать VO
Абстрактный функционал вашего псевдотипа, понятное дело, не будет финальным, но конкретные VO конечно делайте final и будет все хорошо.

Единственное сложные VO трудновато будет тестировать с final модификатором, вам поможет например uopz расширение.

Для статусов/ролей/id делать VO — круто и хорошо, делать final — тоже

В догонку статья от Ocramius: When to declare classes final
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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