BonBonSlick
@BonBonSlick
Junior Web Developer Trainee

Entity vs Object Value?

Не совсем пойму что и когда применять.
Я так понимаю что то одно? Или можно то и другое? И как правильно? Когда надо? Почему?
  • Вопрос задан
  • 449 просмотров
Решения вопроса 2
@vova07
Приветную!

Попробую быть краток.

Сущность - это объект содержащий набор данных с уникальным идентификатором. По мимо этого простого правила, есть еще одно немаловажное: данный объект имеет цикл жизни, который может быть описан поведенческими методами.

Value Object - это объект содержащий набор данных (immutable). Ничего не гарантирует уникальность, они не имеют цикла жизни и не содержат поведенческие методы, а самое главное что они неизменны (immutable).

А теперь попробуем ответить на ваши вопросы (я извиняюсь за грубость но они чуток некорректны по этому и ответы не очевидны):

Я так понимаю что то одно?

Тут все зависит от вашего контекста, домена и агрегата. Есть простые агрегаты которые могут содержать только сущности, если сложные где используются и те и другие. Тут нет очевидного ответа как и ограничения.

Или можно то и другое?

Можно использовать оба или не использовать, главное держать агрегат как можно проще и понятнее.

И как правильно?

Правильно, понятие растяжимое и как я сказал все зависит от агрегата который вы пишите, от контекста который вы моделируете,и от бизнес логики которая есть в вашем домене. Используйте то что решает ваши нужды.

Когда надо?

Тоже самое, тут нет правильного ответа. Надо тогда когда ваша бизнес логика начинает работать.
Ответ написан
@ddd329
Вот например вы пишите программу для СТО, которая обслуживает автомобили. У вас есть понятие "Автомобиль", которое в коде Вы выражаете через доменный объект Car. Car это сущность или объект-значение? Начинаем рассуждать, если СТО обслуживает два полностью одинаковых автомобиля, т.е. марка, цвет, параметры двигателя полностью совпадают, несмотря на это мы должны их различать в программе, потому что на одном мы меняли колодки, а на втором замена масла, и это должно учитываться для каждого конкретного автомобиля, чтобы как минимум сохранить всю историю обслуживания. Как мы будем различать их в программе? Мы должны определить идентификационное свойство, возьмем грубо гос. номер, я конечно понимаю что номер со временем может поменяться на машине, например при продаже, но тем не менее он является уникальным атрибутом сущности и не может быть одинаковым на разных автомобилях одновременно. И Car - это именно СУЩНОСТЬ, так как имеет свой идентификатор представленным в виде гос. номера.
Хорошо. Выше мы упоминали о двигателе. Выразим понятие "Двигатель" через доменный класс Engine. Чем является доменный класс Engine объектом-сущности или объектом-значением? Что выбрать? Это зависит от потребностей данного бизнеса к вашей программе. Можно сделать Engine объектом-значением, который имеет свои параметры, и два двигателя считаются одинаковыми, если значения всех параметров у них совпадают.
Но Engine можно сделать и объектом-сущностью, например СТО ремонтирует двигатели и для них важно не только для какого именно автомобиля, но и для какого конкретного двигателя, чтобы сохранить всю историю его ремонта. Со временем на автомобиле двигатель может быть заменен на новый, и вся история его ремонта начнется с "чистого листа". Будем считать что это нам подходит, и делаем Engine сущностью.
В нашем коде уже есть два понятия Car и Engine, которые оба являются сущностями. Теперь надо выбрать АГРЕГАТ(Ы). Вопрос: Car и Engine это и есть АГРЕГАТЫ, где Car просто ссылается на Engine, или нет? АГРЕГАТ определяет границы изменения, поэтому если СТО ремонтирует двигатель, то следовательно и ремонтирует автомобиль. Значит эти две сущности входят в один АГРЕГАТ, где корнем будет скорее всего будет сущность Car.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы