Мой вопрос прост, что было бы лучше, чтобы ввести object
сам или object identifier
в среде DDD?
простой пример для уточнения вопроса
Опция 1 :
class Car{
public function addWheel(Wheel $wheel){}
}
Вариант 2:
class Car{
public function addWheel(WheelId $wheel_id){}
}
какой вариант лучше? потому что каждый раз, когда я решаю использовать wheel_id
я чувствую, что я иду PI
что это reference
или embed
а в DDD речь должна идти о взаимодействии объектов какой-либо помощи?
Это не простой вопрос. Если взглянуть на красную книгу, Вон Вернон призывает нас ссылаться на агрегаты по идентификаторам, но только по агрегатам! Если колесо — это сущность, то вы должны передать его как объект.
Самое сложное здесь — это отделить агрегаты от энтитов, для этого вам необходимо знать, какие инварианты вы получили в своем агрегате.
Вот несколько причин, почему следует ссылаться на агрегаты по идентификаторам:
когда вам нужно восстановить агрегат, вы также должны загрузить все ссылочные агрегаты, и если граф объектов большой, то каждая загрузка агрегата может быть очень медленной. Вы можете преодолеть это, используя ленивую загрузку, но с этим у вас возникают другие проблемы, которые я не буду здесь освещать.
когда вы сохраняете агрегат, вы также должны проверить, не были ли изменены ссылочные агрегаты, поэтому вы должны также сохранить их или просто сохранить каждый ссылочный агрегат по умолчанию, что на самом деле неэффективно.
сохраняя несколько агрегатов одновременно, вы можете столкнуться с проблемами параллелизма из-за совместной работы вашего домена. Таким образом, приложение может стать даже непригодным для использования
Однако иногда сложно сослаться на все агрегаты по идентификаторам, это зависит от вашего домена.
Мое предложение состояло бы в том, чтобы передать фактический объект колеса. Причина в том, что в будущем, если вы хотите, чтобы функция addWheel проверяла определенные атрибуты колеса перед добавлением его в автомобиль, вам нужно, чтобы колесо было доступно для этого. Кроме того, это позволит вам немедленно использовать объект Wheel в вашем классе Car. Если вы просто передадите идентификатор, вам придется искать его в базе данных (при условии, что идентификатор предназначен для базы данных), прежде чем вы сможете взаимодействовать с ним в классе Car. Само удостоверение личности не имеет отношения к вашему классу автомобилей, так как это просто для устойчивости колеса.