М. Фаулер, К. Скотт - UML. Основы - 2002 (1158629), страница 22
Текст из файла (страница 22)
б,11. Интерфейсы и абстрактный класс: пример на языке 3аиа Предположим, некоторому классу-клиенту, скажем ЗапросНаВвод, требуется воспользоваться функциональностью класса ВводДанных. Класс ВходнойПотокДанных реализует интерфейсы как класса Ввод- Данных, так и класса ВходнойПоток, являясь при этом подклассом последнего. Связь между классами ВходнойПотокДанных и ВводДанных представляет собой отношение реализации. Реализация сознательно изображается аналогично обобщению; она указывает, что один из классов реализует поведение„специфицированное в другом классе.
Допускается ситуация, когда секция реализации одного класса реализует другой класс; это означает, что реализующий класс должен согласовывать свой интерфейс, но вовсе не должен использовать наследование. В модели уровня спецификации отсутствует различие между реализацией и механизмом подтипов. Ссылочные объекты и объектънзначения Связь между классами ЗапроеНаВвод и ВводДанных представляет собой отношение зависимости (беренс)енсу). В данной ситуации она показывает, что если изменится интерфейс класса ВводДанных, то класс ЗапросНаВвод также может измениться.
Одна из целей разработки состоит в сведении к минимуму количества зависимостей, для того чтобы воздействие подобных изменений было минимальным. (Более подробно о зависимостях будет сказано в главе 7.) Альтернативная и более компактная нотация изображена на рис. 6.12.
Здесь интерфейсы представлены в форме маленьких кружков (называемых часто леденцами на палочках), которые соединены е реализующими их классами, Интерфейс "4к — — ЗапросНзйвод сависяиспь Вк Рис. 6.12. Графическая нотация для интерфейсов При использовании обозначения, похожего на леденцы на палочках, не существует различия между реализацией интерфейса и механизмом подклассов для некоторого абстрактного класса. Хотя эта нотация и является более компактной, в этом случае нельзя увидеть ни операций интерфейса, ни каких-либо отношений обобщения между интерфейсами. Абстрактные классы и интерфейсы похожи, однако между ними существует различие. Как те, так и другие позволяют определить интерфейс и отложить его реализацию на более позднее время.
Однако абстрактный класс позволяет дополнить реализацию некоторых методов, в то время как интерфейс вынуждает отложить определение всех методов. Ссылочные объекты и объекты-значения Одно из наиболее общих свойств объектов заключается в том, что они обладают индивидуальностью (ЫепсНу). Это так, но все обстоит не столь просто, как может показаться. На практике индивидуальность важна для сеылочных объектов н не столь важна для объектов-значений.
Ссылочные объекты (гетегепее оЪ)ее1э) — это такие объекты, как Клиент. В данном случае индивидуальность очень важна, поскольку в ре- 104 Глава 6. Диаграммы классов: дополнительные понятия альном мире конкретному клиенту обычно должен соответствовать только один программный объект. Любой объект, обратившийся к объекту Клиент, может воспользоваться соответствующей ссылкой или указателем; в результате все объекты, обратившиеся к данному Клиенту, получат доступ к одному и тому же программному объекту. Аналогично изменения, вносимые в объект Клиент, становятся доступными всем пользователям этого объекта. Если у вас имеются две ссылки на объект Клиент и вы хотите установить их тождественность, то обычно сравниваете индивидуальность тех объектов, на которые указывают эти ссылки.
Создание копий объектов может быть запрещено, но даже если оно разрешено, к нему стараются прибегать как можно реже, возможно, только с целью архивирования или репликации в сети. Если все же копии созданы, то необходимо обеспечить синхронизацию вносимых в них изменений. Объекты-значения (ча)пе оЬ)ес1в) — это такие объекты, как Дата.
Как правило, один и тот же объект в реальном мире может быть представлен целым множеством объектов-значений. Например, вполне нормально, когда имеются сотни объектов со значением «1 января 1999 года». Все эти объекты являются взаимозаменяемыми копиями. При этом новые даты создаются и уничтожаются достаточно часто. Если у вас имеются две даты и вы хотите установить, являются ли они тождественными, то вполне достаточно просто посмотреть на их значения, а не устанавливать их индивидуальность.
Обычно это означает, что в программе необходимо определить оператор проверки равенства, который бы проверял для дат год, месяц и день (каким бы ни было их внутреннее представление). Обычно каждый объект, который ссылается на 1 января 1999 года, имеет свой собственный специальный объект, однако иногда даты могут быть объектами общего пользования. Объекты-значения должны быть постоянными (неизменяемыми; см. раздел «Постоянство» далее в этой главе).
Другими словами, не должно допускаться изменение значения объекта-даты «1 января 1999 года» на «2 января 1999 года». Вместо этого следует создать новый объект «2 января 1999 года» и связать его с первым объектом. Причина запрета подобного изменения заключается в следующем: если бы эта дата была объектом общего пользования, то ее обновление могло повлиять на другие объекты-даты непредсказуемым образом. В прежнее время различие между ссылочными объектами и объектами-значениями было более четким. Объекты-значения являлись встроенными значениями системы типов.
В настоящее время системы типов можно расширять с помощью своих собственных классов, поэтому данный аспект требует более внимательного отношения. В рамках языка ()М1 для объектов-значений обычно используются атрибуты, а для ссылочных объектов — ассоциации.
Для объектов-значений можно также использовать композицию. 105 Постоянство Я не думаю, что различие между ссылочными объектами и объектами- значениями следует учитывать при концептуальном моделировании. Зто может привести к путанице с кратностями. Если я представляю связь с объектом-значением с помощью некоторой ассоциации, то обычно обозначаю кратность на конце такой ассоциации около пользователя данного значения символом «*». Зто происходит лишь в том случае, если для него не существует правила уникальности, такого как использование порядкового номера.
Совокупности многозначных концов ассоциаций Многозначный конец ассоциации — это такой конец ассоциации, верхняя граница кратности которого превышает 1 (например, «*»). Обычно принято рассматривать такие многозначные концы ассоциаций как обычные множества. При этом для соответствующих целевых объектов не существует никакой упорядоченности, и не существует объектов, которые могли бы присутствовать в данном множестве более одного раза.
Однако эти правила могут быть изменены с помощью введения дополнительного ограничения. Ограничение (упорядочено) ((огс(еге«1)) устанавливает некоторый порядок на множестве целевых объектов, т. е. целевые объекты образуют список. В этом списке каждый целевой объект может присутствовать только один раз. Я использую ограничение (комплект) ((Ьаз)), чтобы показать, что целевые объекты на данном конце ассоциации могут появляться более одного раза, но без какой-либо упорядоченности.
Я также использую ограничение (иерархия) ((Ь1егагсйу)), чтобы показать наличие некоторой иерархии в множестве целевых объектов, и ограничение (дау) (сокращение от б(гесаб асус11с атарЦ, характеризующее направленный ациклический граф. ПОСТОЯНСТВО Постоянство (Ггозеп) представляет собой ограничение, которое в языке 1)М1. может быть применено по отношению к атрибуту или концу ассоциации, но, по моему мнению, оно также оказывается полезным применительно к классам.
По отношению к атрибуту или концу ассоциации постоянство указывает на то, что значение этого атрибута или конца ассоциации не может быть изменено в течение всего жизненного цикла исходного объекта. Зто значение должно быть задано при создании объекта и после этого уже никогда не может изменяться. Начальное значение может быть неопределенным (пи11). Разумеется, если данное ограниче- 106 Глава 6.Диаграммы классов: дополнительные понятия ние справедливо при конструировании объекта, оно будет оставаться справедливым в течение всего времени существования объекта.
При этом подразумевается, что для данного значения должен присутствовать аргумент в конструкторе и не должно существовать операций, которые могли бы изменить это значение. По отношению к классу постоянство указывает, что все концы ассоциации и атрибуты, связанные с данным классом, являются постоянными.