Хотя Джон, безусловно, делает убедительные аргументы в пользу преимуществ неизменных объектов, я бы взял немного другую тактику.
Когда вы моделируете бизнес-процесс в коде, очевидно, что вы хотите использовать механизмы в коде для представления фактов о модели. Например, если клиент - это человек, то у вас, вероятно, будет базовый класс Person и класс, производный от клиента, и т. Д.
Неизменяемость - это еще один из этих механизмов. Так что в своем бизнес-процессе подумайте о том, что происходит один раз, а потом никогда не меняется, в отличие от того, что меняется со временем.
Например, рассмотрим «Клиент». У клиента есть имя. Меняется ли имя клиента? Конечно. Имена клиентов меняются все время, как правило, когда они вступают в брак. Так должен ли Customer быть неизменным классом? Возможно нет. Логично, что когда клиент меняет свое имя, вы не создаете нового клиента из старого; старый клиент и новый клиент - это один и тот же объект, но имя свойства изменилось.
Теперь рассмотрим «контракт». Контракт когда-нибудь меняется? Нет. Поправка к существующему договору создает новый, другой договор. Даты, стороны, пункты и т. Д. В конкретном контракте заморожены во времени. Контрактный объект может быть неизменным.
Теперь интересный вопрос , что делать, когда в контракте упоминается клиент, а клиент меняет свое имя . Именно взаимодействие между изменяемыми и неизменяемыми объектами делает эту задачу сложной при проектировании.