c # Неизменные классы в бизнес-приложениях - PullRequest
1 голос
/ 03 декабря 2009

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

Может ли кто-нибудь дать мне реальный пример сценария?

Ответы [ 3 ]

12 голосов
/ 03 декабря 2009

Хотя Джон, безусловно, делает убедительные аргументы в пользу преимуществ неизменных объектов, я бы взял немного другую тактику.

Когда вы моделируете бизнес-процесс в коде, очевидно, что вы хотите использовать механизмы в коде для представления фактов о модели. Например, если клиент - это человек, то у вас, вероятно, будет базовый класс Person и класс, производный от клиента, и т. Д.

Неизменяемость - это еще один из этих механизмов. Так что в своем бизнес-процессе подумайте о том, что происходит один раз, а потом никогда не меняется, в отличие от того, что меняется со временем.

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

Теперь рассмотрим «контракт». Контракт когда-нибудь меняется? Нет. Поправка к существующему договору создает новый, другой договор. Даты, стороны, пункты и т. Д. В конкретном контракте заморожены во времени. Контрактный объект может быть неизменным.

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

5 голосов
/ 03 декабря 2009

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

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

Кроме того, неизменяемость полезна для многопоточности - неизменность позволяет избежать многих проблем, связанных с гонками данных и т. Д., Когда вы хотите использовать один объект в нескольких потоках.

Многие из этих преимуществ могут быть полезны для бизнес-объектов, но вам нужно подходить к проблемам с другим мышлением. В частности, если строки вашей базы данных не являются неизменяемыми (то есть вы будете изменять строки, а не всегда создавать новые "версии" строк), вам необходимо знать, что любое данное значение может больше не представлять состояние базы данных для этой строки.

4 голосов
/ 03 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...