Книга: Приемы объектно-ориентированного проектирования
Назад: Приложение A. Глоссарий
Дальше: Приложение C. Базовые классы

Приложение B. Объяснение нотации

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

Мы пользуемся тремя видами диаграмм:

 на диаграмме классов отображены классы, их структура и статические отношения между ними;

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

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

В описании каждого паттерна проектирования есть хотя бы одна диаграмма классов. Остальные используются, если в них возникает необходимость. Диаграммы классов и объектов основаны на методологии OMT (Object Modeling Tech­nique – методика моделирования объектов) [RBP+91, Rum94].1 Диаграммы взаимодействий заимствованы из методологии Objectory [JCJO92] и метода Буча [Boo94].

B.1. Диаграмма классов

На рисунке B.1a представлена нотация OMT для абстрактных и конкретных классов. Класс обозначается прямоугольником, в верхней части которого жирным шрифтом напечатано имя класса. Основные операции класса перечисляются под именем класса. Все переменные экземпляра находятся ниже операций. Информация о типе необязательна; мы пользуемся синтаксисом С++, ставя имя типа перед именем операции (для обозначения типа возвращаемого значения), переменной экземпляра или фактического параметра. Курсив служит указанием на то, что класс или операция абстрактны.

При использовании некоторых паттернов проектирования полезно видеть, где классы клиентов ссылаются на классы-участники. Если паттерн включает класс клиента в качестве одного из участников (это означает, что на клиента возлагаются определенные функции), то клиент изображается как обычный класс. Так,
например, обстоит дело в паттерне приспособленец. Если же клиент не входит
в состав участников паттерна (то есть не несет никаких обязанностей), то его изо­бражение все равно полезно, поскольку проясняет способ взаимодействия участников с клиентами. В этом случае классы клиентов изображаются бледным шрифтом, как показано на рисунке B.1b. Примером может служить паттерн заместитель. Бледный шрифт клиента напоминает также о том, что мы специально не включили клиента в состав участников.

На рисунке B.1c показаны отношения между классами. В нотации OMT для обозначения наследования классов используется треугольник, направленный от подкласса (на рисунке – LineShape) к родительскому классу (Shape). Ссылка на объект, представляющая отношение агрегирования «является частью», обозначается линией со стрелкой с ромбиком на конце. Стрелка указывает на агрегируемый класс (например, Shape). Линия со стрелкой без ромбика обозначает отношение осведомленности (так, LineShape содержит ссылку на объект Color, который может использоваться также и другими фигурами). Рядом с началом стрелки может находиться еще и имя ссылки, позволяющее отличить ее от других ссылок.1

Еще одно полезное свойство, которое следует визуализировать, – то, какие классы создают экземпляры других классов. Для этого используется пунктирная линия, поскольку OMT такого отношения не поддерживает. Мы называем такое отношение «создает». Стрелка направлена в сторону класса, экземпляр которого инстанцируется. На рисунке B.1c класс CreationTool создает объекты класса LineShape.

В OMT определен также символ залитого круга, обозначающий «более одного». Если такой кружок появляется рядом со стрелкой, то он говорит о том, что она ссылается на несколько объектов или что несколько объектов агрегируются. На рисунке B.1c показано, что класс Drawing агрегирует несколько объектов типа Shape.

Наконец, мы дополнили OMT аннотациями на псевдокоде, которые позволяют коротко описать реализацию операций. На рисунке B.1d приведена такая аннотация для операции Draw в классе Drawing.

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

На диаграмме объектов представлены только экземпляры. На ней показан мгновенный снимок объектов в паттерне проектирования. Объекты именуются «aSomething», где Something – это класс объекта. Для обозначения объекта
используется прямоугольник с закругленными углами (что несколько отличается от стандарта OMT), в котором имя объекта отделено от ссылок на другие объекты горизонтальной линией. Стрелки ведут к объектам, на которые ссылается данный. На рисунке B.2 приведен соответствующий пример.

8115.png 

а

8106.png 

б

8096.png 

в

8086.png 

г

Рис. B.1. Нотация диаграмм классов: a) абстрактные и конкретные классы;
б) класс клиента участника (слева) и класс неявного клиента (справа);
в) отношения между классами; г) аннотация на псевдокоде.

8075.png 

Рис. B.2. Нотация диаграмм объектов

B.3. Диаграмма взаимодействий

Порядок исполнения запросов, которые объекты посылают друг другу, показан на диаграмме взаимодействий. Так, на рисунке B.3 представлено, как фигура добавляется к рисунку.

8065.png 

 

Рис. B.3. Нотация диаграмм взаимодействия

На диаграмме взаимодействий время откладывается сверху вниз. Сплошная вертикальная линия обозначает время жизни объекта. Соглашение об именовании объектов такое же, как на диаграммах объектов: имени класса предшествует буква «a» (например, aShape). Если объект еще не создан к начальному моменту времени, представленному на диаграмме, то его вертикальная линия идет пунктиром вплоть до момента создания.

Вертикальный прямоугольник говорит о том, что объект активен, то есть обрабатывает некоторый запрос. Операция может посылать запросы другим объектам, они изображаются горизонтальной линией, указывающей на объект-получатель. Имя запроса показывается над стрелкой. Запрос на создание объекта представлен пунктирной линией со стрелкой. Запрос объекта-отправителя самому себе изображается стрелкой, указывающей на сам этот объект.

На рисунке B.3 видно, что первый запрос, исходящий от aCreationTool, преследует целью создание объекта aLineShape. Затем aLineShape добавляется к объекту aDrawing с помощью операции Add, после чего aDrawing посылает самому себе запрос на обновление Refresh. Отметим, что частью операции Refresh является посылка объектом aDrawing запроса к aLineShape.

Назад: Приложение A. Глоссарий
Дальше: Приложение C. Базовые классы

Денис
Перезвоните мне пожалуйста 8(999) 529-09-18 Денис.