Объекты значений в DDD - Почему неизменяемые?

Я не понимаю, почему объекты значений в DDD должны быть неизменными, и я не понимаю, как это легко сделать. (Я сосредотачиваюсь на C # и Entity Framework, если это важно.)

Например, давайте рассмотрим классический объект значения Address. Если вам нужно было изменить «123 Main St» на «123 Main Street », почему мне нужно создавать совершенно новый объект вместо того, чтобы говорить myCustomer.Address.AddressLine1 = «123 Main Street»? (Даже если Entity Framework поддерживает структуры, это все равно будет проблемой, не так ли? t it?)

Я понимаю (я думаю) идею, что объекты-значения не имеют идентичности и являются частью объекта домена, но может ли кто-нибудь объяснить, почему неизменность - это хорошо?


EDIT : Мой последний вопрос здесь действительно должен быть следующим: «Может ли кто-нибудь объяснить, почему неизменность - это хорошо применительно к объектам-значениям ?» Извините за путаницу!


РЕДАКТИРОВАТЬ : Чтобы уточнить, я не спрашиваю о типах значений CLR (по сравнению с ссылочными типами). Я спрашиваю о концепции DDD более высокого уровня для объектов значений.

Например, вот хакерский способ реализации неизменяемых типов значений для Entity Framework: http://rogeralsing.com/2009/05 / 21 / entity-framework-4-неизменяемые объекты-значения . По сути, он просто закрывает всех сеттеров. пустота ошибка (сообщение, a1, a2, a3, a4, a5, a6, a7) char * message; char * a1, * a2, * a3, * a4, * a5, * a6, * a7; ...

Вот простая функция, выделенная и определенная с использованием синтаксиса старого стиля:

#include 
void
error(message,a1,a2,a3,a4,a5,a6,a7)
        char *message;
        char *a1,*a2,*a3,*a4,*a5,*a6,*a7;
{
  fprintf(stderr,message,a1,a2,a3,a4,a5,a6,a7);
}
int main ()
{
  error("[ERROR %d]: %s.\n",110,"Connection timed out");
  return 0;
}

Она может быть скомпилирована и работает правильно для печати:

[ОШИБКА 110]: Превышено время ожидания соединения.

Я читал, что этот стиль не имеет связанного прототипа, но как он может автоматически преобразовать int в char * во время выполнения, и даже предоставленных аргументов меньше, чем заявлено?

16
задан Zaheer Ahmed 23 September 2013 в 05:38
поделиться