2. Язык UML. Руководство пользователя. Буч_ Рамбо_ Якобсон (2-е издание) (2006) (1185732), страница 35
Текст из файла (страница 35)
Разумеется, они не имеют ничего общего с самим зданием, а являются лишь артефактами, которые применяли при планировании небоскреба.Каждая большая система состоит из нескольких подобных слоев. ПоFнастоящему понять ее можно, только объединив абстракции, которые в нее входят, в крупные группы. Большинство блоковсреднего размера (например, комнаты) сами по себе не являютсяабстракциями, похожими на классы, и у них бывает много экземпляров. Крупные блоки достаточно часто умозрительны (например,«часть здания для продажи»), и у них не бывает экземпляров. Они нереализуются на физическом уровне; единственная их цель – облегчить понимание системы. Блоки такого рода не будут представленыв развернутой системе – они существуют лишь на уровне модели.В языке UML организующие модель блоки называют пакетами.
Пакет является универсальным механизмом организации элементов в группы, упрощающим понимание модели. Кроме того, пакеты позволяют контролировать доступ к своему содержимому, чтооблегчает работу с соединениями в архитектуре системы.Графически пакеты в языке UML представлены так, как показано на рис. 12.1. Такая нотация позволяет визуализировать группы элементов, с которыми можно обращаться как с единым целым,контролируя при этом видимость и возможность доступа к отдельным элементам.ВведениеРазницав принципахпостройкисобачьейбудкии небоскребарассматриваетсяв главе 1.Устройство собачьей будки не представляет собой ничего сложного: четыре стены, лаз для собаки в одной из них и крыша.
Для изготовления будки понадобится всего лишь несколько досок – конструкция не требует большего.Жилые дома устроены сложнее. Стены, потолки и полы соединяются друг с другом, образуя более крупные сущности, которыемы называем комнатами. Комнаты организованы в еще более крупные блоки – жилая зона, зона досуга и т.д. Такие блоки могут представлять собой всего лишь абстракцию. Мы просто объединяемпод общим названием ряд комнат, функционально связанных другРис.
12.1. ПакетыБазовые понятияПакет (package) представляет собой общий механизм организации элементов в группы. Изображается в виде папки с закладкой.Имя пакета указано на папке, если содержимое последней не показано, а в противном случае – на закладке.Пакеты180Базовые понятия(ownership) – это связь композиции, означающая, что элементобъявлен внутри пакета. Если пакет удаляется, то уничтожается ипринадлежащий ему элемент. Каждый элемент может принадлежать только одному пакету.ИменаУ каждого пакета должно быть имя, отличающее его от другихпакетов. Имя представляет собой текстовую строку.
Само по себеоно называется простым. Квалифицированное имя предваряетсяименем пакета, включающего данный, если такое вложение имеетместо. Двойное двоеточие (::) используется в качестве разделителяимен пакетов. Обычно, изображая пакет, указывают только его имя(см. рис. 12.2).
Но, как и в случае с классами, вы можете дополнятьпакеты помеченными значениями или дополнительными разделами, чтобы прояснить детали.Имя пакета должно быть уникальным внутри включающего егопакета.На заметку. Пакет владеет элементами модели, объявленными внутри него. Это могут быть, в частности, классы, ассоциации, обобщения, зависимости и примечания. Пакет не владеет элементами, на которые осуществляется лишь ссылкаиз него.Пакет определяет свое пространство имен, то есть элементыодного вида должны иметь имена, уникальные в контексте включающего пакета.
Например, в одном пакете не может быть двухклассов Queue (Очередь), но может быть один класс Queue в пакете P1,а другой – в пакете P2. P1::Queue и P2::Queue имеют разные квалифицированные имена и поэтому являются различными классами.На заметку. Во избежание недоразумений лучше не использовать одинаковые имена в различных пакетах.имя включающего пакетаквалифицированное имя{version = 2.24}Рис.
12.2. Простые и квалифицированные имена пакетовНа заметку. Имя пакета может состоять из любых букв латинского алфавита и цифр, а также некоторых знаков препинания(за исключением таких, как двоеточие, которое применяетсядля разделения имен пакетов, один из которых входит в другой). Имя может занимать несколько строк (количество символов не ограничено). Обычно для именования пакета используют одно или несколько коротких существительных, взятыхиз словаря модели.Элементы, принадлежащие пакетуКомпозицияобсуждается в главе 10.Пакет может владеть другими элементами, в том числе классами,интерфейсами, компонентами, узлами, кооперациями, вариантамииспользования, диаграммами и даже прочими пакетами.
Владение181Процессимпортаобсуждается нижев даннойглаве.Элементам различного вида можно присваивать одинаковые имена в пределах пакета. Так, допустимо наличие класса Timer (Таймер)и компонента Timer в одном и том пакете. Однако, чтобы предотвратить путаницу, лучше назначать всем элементам пакета уникальныеимена.Один пакет может содержать другие, а следовательно, допускается иерархическая декомпозиция модели. Например, может существовать класс Camera (Камера), принадлежащий пакету Vision (Оптическое Устройство), который, в свою очередь, содержится в пакетеSensors (Датчики). Полное имя этого класса – Sensors::Vision::Camera.Лучше, однако, избегать слишком глубокой вложенности пакетов:дваFтри уровня – предел управляемости.
При необходимости дляорганизации пакетов стоит использовать импорт, а не вложения.Описанная семантика владения делает пакеты важным механизмом масштабирования системы. Без них пришлось бы создаватьбольшие плоские модели, все элементы которой должны иметь уникальные имена. Такие конструкции были бы совершенно неуправляемы, особенно если входящие в модель классы и другие элементысозданы различными коллективами. Пакеты позволяют контролировать элементы, образующие систему, в процессе ее эволюции.Как показывает рис. 12.3, содержание пакета можно представитьграфически или в текстовом виде. Обратите внимание, что еслиПакеты182вы изображаете принадлежащие пакету элементы, то имя пакета пишется внутри закладки.
Впрочем, содержимое пакета не показываюттаким образом, а применяют имеющиеся инструментальные средства, позволяющие раскрыть пакет и просмотреть его содержимое.Базовые понятия183видимы только для пакетов, наследующих данному, а закрытые вообще невидимы вне пакета, в котором объявлены.Пакетная видимость показывает, что класс видим только длядругих классов, объявленных в том же самом пакете, но скрыт дляклассов, объявленных в других пакетах. Пакетная видимость изображается с помощью символа ~ (тильда) перед именем класса.Импорт и экспортРис. 12.3.
Элементы, принадлежащие пакетуНа заметку. Язык UML подразумевает наличие в любой моделианонимного корневого пакета, а значит, все элементы одногои того же вида на верхнем уровне модели должны иметь уникальные имена.ВидимостьВидимостьВидимость принадлежащих пакету элементов можно контролиописывается ровать так же, как видимость атрибутов и операций класса. По умолв главе 9.чанию такие элементы являются открытыми, то есть видимы длявсех элементов, содержащихся в любом пакете, импортирующемданный. Защищенные элементы видимы только для потомков, а закрытые вообще невидимы вне своего пакета.
Например, на рис. 12.3OrderForm (БланкЗаказа) – это открытая часть пакета Client (Клиент),а Order (Заказ) – закрытая. Любой пакет, импортирующий данный,может «видеть» объект OrderForm, но «не видит» Order. При этом полное квалифицированное имя для OrderForm будет Client::OrderForm.Видимость принадлежащего пакету элемента обозначается соответствующим символом перед его именем. Для открытых элементов используется знак + (плюс), как в случае с OrderForm на рис. 12.3.Все открытые части пакета в совокупности составляют его интерфейс.Так же, как и в отношении классов, для имен защищенных элементов используют символ # (решетка), а для закрытых добавляют символ – (минус). Напомним, что защищенные элементы будутПредположим, в вашей модели есть два класса одного уровня,расположенных рядом друг с другом: А и В. Класс А «видит» В и наоборот, то есть любой из них может зависеть от другого. Оба ониобразуют тривиальную систему, и для них не надо создавать никаких пакетов.Допустим теперь, что у вас имеется несколько сотен равноправных классов.
Размер сети связей, которую вы можете «соткать» между ними, не поддается воображению. Более того, столь огромнуюгруппу неорганизованных классов просто невозможно воспринятьв ее целостности. Это реальная проблема больших систем: простойнеограниченный доступ не позволяет осуществить масштабирование. В таких случаях для организации абстракций приходится применять пакеты.СвязиИтак, допустим, что класс А расположен в одном пакете, а классзависимости В – в другом, причем оба пакета равноправны.