Read-Only и Frozen

На стр.64 я описал ключевое слово {readonly} (только для чтения). Этим ключевым словом обозначается свойство, которое клиенты могут только читать, но не могут обновлять. Подобное, но несколько отлича­ющееся ключевое слово {frozen} (замороженный) было в UML 1. Свой­ство находится в состоянии frozen, если оно не может быть изменено в течение жизни объекта; такие свойства часто называются неизмен­ными (immutable). Оно было исключено из UML 2, но понятие frozen очень полезное, поэтому я буду применять его по-прежнему. Наряду с обозначением отдельных свойств, ключевое слово frozen можно приме­нять к классу для указания того, что все свойства всех экземпляров класса находятся в состоянии frozen. (До меня дошли слухи, что клю­чевое слово frozen скоро будет восстановлено.)

Объекты-ссылки и объекты-значения

Одна из наиболее общих черт объектов заключается в том, что они об­ладают индивидуальностью (identity). Это правда, но все обстоит не столь просто, как может показаться. На практике оказывается, что индивидуальность важна для объектов-ссылок, но она не так важна для объектов-значений.

Объекты-ссылки (reference objects) - это такие объекты, как Customer (Клиент). В данном случае индивидуальность очень важна, поскольку в реальном мире конкретному классу обычно должен соответствовать только один программный объект. Любой объект, который обращает­ся к объекту Customer, может воспользоваться соответствующей ссыл­кой или указателем. В результате все объекты, обращающиеся к дан­ному объекту Customer, получат доступ к одному и тому же программ­ному объекту. Таким образом, изменения, вносимые в объект Customer, будут доступны всем пользователям данного объекта.

Если имеются две ссылки на объект Customer и требуется установить их тождественность, то обычно сравниваются индивидуальности тех объ­ектов, на которые указывают эти ссылки. Создание копий может быть запрещено; если же оно разрешено, то, как правило, применяется ред­ко - возможно, для архивирования или репликации через компьютер­ную сеть. Если копии созданы, то необходимо обеспечить синхрониза­цию вносимых в них изменений.

Объекты-значения (value objects) - это такие объекты, как Date (Дата). Как правило, один и тот же объект в реальном мире может быть пред­ставлен целым множеством объектов значений. Например, вполне нормально, когда имеются сотни объектов со значением «1 января 2004 года». Все эти объекты являются взаимозаменяемыми копиями. При этом новые даты создаются и уничтожаются достаточно часто


Если имеются две даты и надо установить, тождественны ли они, то вполне достаточно просто посмотреть на их значения, а не устанавли­вать их индивидуальность. Обычно это означает, что в программе не­обходимо определить оператор проверки равенства, который бы прове­рял в датах год, месяц и день (каким бы ни было их внутреннее пред­ставление). Обычно каждый объект, ссылающийся на 1 января 2004 года, имеет собственный специальный объект, однако иногда даты мо­гут быть объектами общего пользования.

Объекты-значения должны быть постоянными. Другими словами, не должно допускаться изменение значения объекта-даты «1 января 2004 года» на «2 января 2004 года». Вместо этого следует создать но­вый объект «2 января 2004 года» и использовать его вместо первого объекта. Причина запрета подобного изменения заключается в сле­дующем: если бы эта дата была объектом общего пользования, то ее об­новление могло бы повлиять на другие объекты непредсказуемым об­разом. Данная проблема известна как совмещение имен (aliasing).

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

В языке UML используется концепция типа данных, который пред­ставляется ключевым словом на символе класса. Строго говоря, тип данных не идентичен объекту-значению, поскольку типы данных не могут иметь индивидуальности. Объекты-значения могут иметь инди­видуальность, но она не используется для проверки равенства. В язы­ке Java примитивы могут быть типами данных, но не даты, хотя они могут быть объектами-значениями. Если требуется их выделить, то при создании взаимосвязи с объектом-значением я использую компо­зицию. Можно также применить ключевое слово для типа значения; на мой взгляд, стандартными являются слова «value» и «struct».


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: