На стр.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».