Нет, вы ничего не упускаете - в большинстве случаев лучшим вариантом будет число 2 (хотя я бы назвал этот метод changeAddress
, затем updateAdress
- обновление кажется не-DDD ) и это независимо от того, является ли адрес объектом или объектом значения. С Ubiquitous Language вы бы предпочли сказать, что Пользователь изменил свой адрес, так что именно так вы должны смоделировать его - это метод changeAddress
, который решает, будут ли обновляться свойства (если Address является сущностью) или назначить совершенно новый объект (когда это VO).
Следующий пример кода предполагает наиболее распространенный сценарий - Адрес как VO:
public void ChangeAddress(AddressParams addressParams)
{
// here we might include some validation
address = new Address(addressParams);
// here we might include additional actions related with changing address
// for example marking user as required to confirm address before
// next billing
}
Что важно в этом примере, так это то, что после создания адреса он считается действительным - в вашем агрегате не может быть недопустимого объекта Address. Имейте в виду, однако, что то, следует ли вам следовать этому примеру или нет, зависит от вашего фактического домена - нет единого пути для подражания. Это самый распространенный вариант.
И да, вы всегда должны выполнять операции со своими сущностями, проходя через сводный корень - причина этого была дана во многих ответах по SO (например, в этом Базовом совокупном вопросе ).
Вопрос о том, является ли объект субъектом или виртуальным обществом, зависит от требований и вашего домена. Большую часть времени адрес представляет собой просто объект значения, поскольку нет разницы между двумя адресами с одинаковыми значениями, и адреса, как правило, не меняются в течение срока их службы. Но опять же, это в большинстве случаев и зависит от моделируемой области.
Другой пример - для большинства доменов Money
будет объектом значения - 10 $ - 10 $, кроме суммы, у него нет идентификатора. Однако, если вы смоделируете домен, который имеет дело с деньгами на уровне счетов, каждый счет будет иметь свою собственную идентификацию (выраженную с помощью какого-то уникального числа), таким образом, это будет сущность.