Дизайн, основанный на домене - неизменяемый объект Value

Я пытаюсь понять концепцию ценностного объекта. Один аспект объекта значения неизменен. Я хотел бы знать, нужно ли нам реализовать что-то, что управляет объектом значения? Например, Person - это сущность, а Address - объект значения. У двух человек одинаковый адрес.

  1. + Можем ли мы назначить один и тот же адрес экземпляра для каждого человека?
  2. + Как мы узнаем, что адрес уже существует, чтобы не создавать новый?
  3. + Как мы управляем ценным объектом?

Я не понимаю, правильно ли я понимаю неизменный аспект. Не могли бы вы посоветовать мне по этому поводу?


person ck_forest    schedule 31.12.2014    source источник


Ответы (1)


Что касается книги Эрика Эванса Domain Driven Design: Tackling Complex In The Heart of Software, ключевым атрибутом объекта значения является то, что они часто являются временными (т. Е. Недолговечными) , созданный для конкретной операции, а затем отброшенный. Если вы используете языки программирования, которые не имеют встроенного механизма автоматической сборки мусора (например, C, C ++), вам придется вручную освобождать их память в конце их жизненного цикла. В противном случае вам не понадобится какая-либо сверхмощная реализация для управления ими. (Эрик Эван тоже говорил о сборке мусора, сравнивая Entities и Value Objects.)

Аспект неизменяемости объектов значений просто означает, что после создания ни один из их атрибутов не может быть изменен, кроме как путем полной замены всего объекта. Таким образом, если два Person объекта совместно используют один и тот же объект значения Address и один из них изменяет свой адрес, будет создан новый отдельный объект значения Address для представления нового адреса.

Конечно, это не твердое правило. Законные случаи для объектов изменяемых значений включают:

  1. Если объекты значений часто меняются,
  2. Процессы их создания и / или удаления требуют больших вычислительных ресурсов,
  3. Их замена (вместо модификации) нарушает стабильность системы,
  4. и Т. Д.

Другой аспект объектов-значений заключается в том, что они не имеют концептуальной идентичности. Но это не значит, что у них не может быть низкоуровневых идентификаторов, таких как столбец, помеченный как их первичный ключ в реляционной базе данных. Эрик Эванс также говорил об ассоциации между сущностями и объектами-ценностями. Итак, если вы решили разделить объект Address value между двумя Person сущностями, вы можете определить, существует ли уже адрес, запросив базу данных или любую другую общую структуру данных в памяти, доступную для сущностей.

person ivan.sim    schedule 31.12.2014