Диаграмма объектов

Диаграмма классов

 

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

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

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

 

 

Рис. 5.1. Значок Рис. 5.2. Статические Рис. 5.3. Утилита

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

 

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

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

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

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

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

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

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

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

0 .. 1 ноль или один;

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

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

А только имя;

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

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

Строка свойств, указанная в фигурных скобках, описывает дополнительные свойства атрибута (примеры свойств приведены ниже).

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

видимость имя (формальные_параметры) : тип_возвращаемого_значения {строка свойств}

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

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

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

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

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

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

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

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

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

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

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

Статические члены класса (атрибуты и операции) изображаются подчеркнутыми (см. рис. 5.2, соответствующий примеру в разд. 4.6).

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

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

 

 

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

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

 

Рассмотрим обозначения отношений между классами.

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

 

 

Рис. 5.6. Ассоциация Рис. 5.7. Зависимость

 

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

На рис. 5.6 изображена ассоциация из примера в разд. 4.1 .

Отношение зависимости изображается пунктирной линией со стрелкой, направленной от клиента к серверу (рис. 5.7).

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

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

 

 

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

 

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

 

 

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

 

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

<Формальный параметр1 –> Фактический параметр1, . . .>

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

Пример использования данных способов показан на рис. 5.11, 5.12 для стека целых значений, рассмотренного в разд. 4.5.

 

 

Рис. 5.11. Явный способ Рис. 5.12. Неявный способ

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

 

 

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

 

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

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

 

 

Рис. 5.14. Отношения между классами Рис. 5.15. Вложение

и интерфейсом классов

 

Если некоторый класс описан внутри другого класса, то он называется вложенным и недоступен вне объемлющего его класса. Обозначение вложения классов приведено на рис. 5.15.

Пример.Список состоит из узлов, связанных между собой с помощью указателей. Если класс «Узел» используется только для определения класса «Список», то его описание целесообразно скрыть путем вложения.

 

 

class List{

class Node{ . . .};

Node *pbeg, *pend; // указатели на начало и конец списка

. . .

};

 

 

Диаграмма объектов показывает существующие объекты и связи между ними в некоторый момент времени.

Диаграмма объектов может рассматриваться как прототип: она представляет отношения, которые могут возникнуть среди элементов данного множества экземпляров классов.

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

 

 

Рис. 5.16. Значок объекта Рис. 5.17. Значок связи

 

Имя объекта может быть записано в одной из следующих форм:

А – только имя объекта;

: С – только класс объектов (анонимный экземпляр);

А : С – имя объекта и класса.

Если класс объекта никогда не указывается, то класс считается безымянным. Если указывается только имя класса, то объект считается безымянным. Каждый значок, не содержащий имени объекта, обозначает отдельный безымянный объект.

Объекты взаимодейству­ют с другими объектами через связи, которые изображаются на диаграмме прямыми линиями (см. рис 5.17).

На значках объектов бывает полезно указать несколько их атрибутов. Синтаксис атрибутов совпадает с синтаксисом атри­бутов класса и позволяет указать их текущее значение (см. рис 5.18). Имена атрибутов объектов должны соответствовать атрибутам, определенным в классе объекта, или в любом из его суперклассов.

На рис. 5.18 приведен пример диаграммы объектов, соответствующий диаграмме классов на рис. 5.6.

 

 

Рис. 5.18. Диаграмма объектов