Лекция: Диаграмма классов

 

Основными элементами, отображаемыми на диаграмме классов, являются классы, интерфейсы и отношения между ними.

Графическое изображение класса представлено на рис. 6.1.

Каждый класс должен иметь имя. На некоторых значках классов полезно перечислять несколько атрибутов и опе­раций класса. «На некоторых», потому что для большинства тривиальных классов это не нужно. Если мы не хотим видеть на диаграмме атрибуты и опе­рации класса, мы удаляем разделяющие черты и пишем только имя класса.

 

 

Рис. 6.1. Значок Рис. 6.2. Статические Рис. 6.3. Утилита

класса члены класса

 

Атрибут может обозначаться именем, также могут быть указаны тип (класс), видимость, кратность и значение по умолчанию в соответствии со следующим синтаксисом:

видимость имя [кратность]: тип = значение_по_умолчанию.

Видимость обозначается путем добавления в качестве префик­са к имени следующих символов: открытый(+), защищенный (#), закрытый(–).

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

1 в точности один;

* ноль или больше;

0… * ноль или больше;

1… * один или больше;

3… 7 указанный интервал;

1… 3, 7 указанный интервал или точное число.

Приведем примеры описания атрибутов:

А только имя;

+А: С видимость, имя и тип;

А[10]: С имя, кратность и тип;

А: С = Е имя, тип и значение по умолчанию.

Операции обычно изображаются внутри значка класса только своим именем. Возможно также указывать дополнительные элементы в формате: видимость имя (формальные_параметры): тип_возвращаемого_значения.

Формальные параметры записываются в формате:

вид имя: тип = значение_по_умолчанию,

где вид принимает одно из следующих значений:

in – входной параметр (значение по умолчанию);

out – выходной параметр;

inout – смешанный, т.е. и входной, и выходной.

Если параметр помечен как входной, то функция не может изменять его значения, но может его использовать (передача параметров по значению); если параметр помечен как выходной, то функция не может использовать его значение, но может присвоить ему некоторое значение; наконец, если параметр помечен как смешанный, то функция может и читать его значение, и изменять (передача параметров по ссылке).

Приведем примеры описания операций:

display ( ) – только имя;

display ( ): bool – имя и тип возвращаемого значения;

+set (n: Name, s: String) – видимость, имя и формальные параметры.

Атрибуты и операции класса (статические члены) изображаются подчеркнутыми. Пример на рис. 6.2 показывает изображение класса Data (см. п. 4.6).

Утилита изображается обычным значком класса со стереотипом «utility» (рис. 6.3). Добавление к стандартному элементу языка стереотипа позволяет приспособить данный элемента для решения специальной проблемы.

Интерфейс на диаграмме классов можно изобразить двумя способами: развернутым и сокращенным. В случае развернутого способа интерфейс изображается на диаграмме как класс со стереотипом «interface» и без секции атрибутов (рис. 6.4). Сокращенное изображение интерфейса представляет небольшой кружок с именем интерфейса возле него (рис. 6.5).

 

 

Рис. 6.4. Развернутое Рис. 6.5. Сокращенное

изображение интерфейса изображение интерфейса

 

Классы редко бывают изолированными; они вступают в отношения друг с другом.

Значок ассоциации изображается в виде линии, соединяющей два класса (рис. 6.6). При изображении ассоциации ей можно сопоставить текстовую пометку, документирующую имя этой связи или подсказывающую ее роль. Ассоциации часто отмечаются существительными, например «Место работы», описывающими природу связи. К значку также можно добавить роли, которые классы играют в ассоциации. Одна пара классов может иметь более одной ассоциативной связи. Возле значка ассоциации можно указать ее кратность.

 

 

Рис. 6.6. Ассоциация Рис. 6.7. Зависимость

 

Указывая кратность на одном конце, показывают, что на этом конце именно столько объектов должно соответствовать каждому объекту на другом конце. Если кратность явно не указана, то подразумевается, что она не определена.

На рис. 6.6 изображена ассоциация «Компания» – «Человек», которой дано имя «Место работы». Классы, участвующие в ней, играют роли «Работодатель» и «Работник» соответственно.

Отношение зависимости изображается пунктирной линией со стрелкой, направленной от клиента к серверу (рис. 6.7). Стереотип «friend» на линии зависимости указывает, что клиент является дружественным классом для сервера.

Значок обобщения (наследования) включает большую незакрашенную стрелку, которая указывает от подкласса к супер­классу (рис. 6.8). Место классов в наследственной иерархии можно уточнить следующим образом. Имена абстрактных классов указываются курсивом. К имени базового класса добавляется свойство root, а к имени листового класса – свойство leaf. Аналогично, имена чисто виртуальных функций-членов указываются курсивом, а к имени операции, которая не может быть виртуальной, добавляется свойство leaf.

Пример. На рис. 6.8 показана наследственная иерархия, связанная с геометрическими фигурами (см. п. 4.3.1). Абстрактный класс Shape отмечен как базовый класс, имеющий чисто виртуальные функции draw, rotate и листовую функцию get_center. Функция draw в протоколе класса Circle является полиморфной. Класс SolidCircle объявлен как листовой.

Значок агрегации – линия с добавлением незакрашенного ромба на конце, обозна­чающем агрегат (рис. 6.9). Экземпляры класса на другом конце стрелки будут частями экземпляров класса-агрегата. Отношение композиции обозначается линией с закрашенным ромбом на конце (рис. 6.10).

 

 

Рис. 6.8. Обобщение

 

 

Рис. 6.9. Агрегация Рис. 6.10. Композиция

 

Параметризованный класс изображается значком обычного класса с пунк­тирным прямоугольником в правом верхнем углу, в котором указаны параметры (рис. 6.11). Моделировать инстанцирование можно двумя способами. Во-первых, можно явным образом определить зависимость со стереотипом «bind», показывающую, что источник инстанцирует целевой шаблон с заданными фактическими параметрами. Во-вторых моделировать можно неявно, для чего требуется объявить класс, имя которого обеспечивает инстанцирование. Пример использования данных способов представлен на рис. 6.11–6.12 для стека контроллеров, рассмотренного в п. 4.5.

 

 

Рис. 6.11. Явное связывание Рис. 6.12. Неявное связывание

Пример. На рис. 6.13 представлена система классов, служащая для моделирования процесса обслуживания системы управления климатом в теплице. Класс Plan включает правила управления климатом и имеет операцию execute (выполнить). Имеется ассоциация между этим классом и классом Controller (контроллер, управляющий климатом): экземпляры класса Plan задают климат, который дол­жны поддерживать экземпляры класса Controller.

Эта диаграмма также показывает, что класс Controller явля­ется агрегатом: его экземпляры содержат в точности по одному экземпляру клас­сов Heater (нагреватель) и Cooler (охлаждающее устройство), и любое число экземпляров класса Light (лампочка). Оба класса Heater и Cooler являются под­классами абстрактного запускающего процесс класса Actuator, который предос­тавляет протоколы startUp и shutDown (начать и прекратить соответственно) и использует класс Temperature.

 

 

Рис. 6.13. Классы для описания процесса обслуживания системы управления климатом

 

Связь интерфейса с реализующим его элементом можно графически представить двумя способами. Простая форма позволяет изобразить отношения между интерфейсом и реализующим его классом в виде кружка с одной стороны класса (рис. 4.3–4.4). Если интерфейс представлен в расширенной форме, то отношение реализации изображают в виде пунктирной линии с большой незакрашенной стрелкой, направленной в сторону интерфейса (рис. 6.14). Зависимость между классом и интерфейсом показывается аналогично зависимости между классами.

 

 

Рис. 6.14. Отношения между классами и интерфейсом

еще рефераты
Еще работы по информатике