
- •Основные сведения
- •1. Назначение диаграммы классов
- •Создание диаграммы классов
- •3. Инструменты, предназначенные для построения диаграмм классов
- •4. Создание нового класса
- •5. Стереотип класса
- •6. Контекстное меню класса
- •7. Установка режимов отображения класса на экране
- •8. Моделирование отношений между классами
- •Определение свойств однонаправленной ассоциативной связи
- •Генерация кода
- •Просмотр полученного кода
- •Задание
- •2. Создать диаграмму классов для автоматизированной системы, предназначенной для тестирования программных реализаций базовых алгоритмов сортировки и поиска данных.
- •3. Выполнить генерацию кода для указанной выше диаграммы классов, соответствующей уровню реализации.
- •4. Для системы, разрабатываемой по индивидуальному заданию, создать два варианта диаграммы классов.
- •6. Составить отчет.
Определение свойств однонаправленной ассоциативной связи
Rational Rose создает код класса в зависимости от установленных свойств его связи с другими классами. Свойства связи устанавливаются при помощи диалогового окна “Association Specification for …”, которое появляется на экране после выбора команды открыть спецификацию (Open Specification) в контекстном меню данной связи или после совмещения указателя мыши со стрелкой связи и двойного щелчка левой кнопкой мыши. Это окно состоит из вкладок: главная вкладка (General), детальное описание (Detail), главная вкладка для роли А (Role A General), главная вкладка для роли Б (Role B General), детальное описание роли А (Role A Detail), детальное описание роли Б (Role B Detail).
На главной вкладке отображаются следующие параметры связи: имя связи, стереотип, и другая основная информацию о связи. Эта информация размещается следующих полях:
• имя (Name) - для отображения имени связи, которое может быть одним словом или целой фразой, определяющей цель или семантику связи;
• стереотип (Stereotype) - для указания стереотипа;
• роль А (Role A), роль Б (Role В) - для указания имён ролей, с которыми ассоциируются соответственно элемент А (Element A), элемент Б (Element В);
• элемент А (Element A), элемент Б (Element В) - для отображения имён классов, которые ассоциируются с соответствующими ролями в зависимости от направления связи; так для связи, изображенной на рис. 3, Element A представляет собой Class2, а Element В - Class1.
Рис. 3. Изображение связи на диаграмм классов, вид которого определяется параметрами главной вкладки, приведённой на рис. 28.
Вкладка детального описания связей служит для определения дополнительных свойств связей с помощью следующих полей:
• элемент связи (Link Element) - указывает ассоциированный класс, если связь является однонаправленной ассоциативной связью, как показано на рис. 3;
• имя направления (Name direction) указывает имя связанного класса;
• условие (Constraints) - отображает некоторое условие, которое должно быть выполнено, когда система находится в устойчивом состоянии.
Главные вкладки описания роли А (Role A Detail), роли Б (Role B Detail) обеспечивают определение свойств переменных, которые создаются для классов, между которыми устанавливается связь. При этом главная вкладка роли А предназначается для определения свойств переменной, соответствующей классу, обозначенному как элемент А, а главная вкладка роли - для определения свойств переменной, соответствующей классу, обозначенному как элемент Б. На рассматриваемых вкладках имеются поля: роль (Role) - для определения имени переменной класса; элемент (Element) - для отображения имени класса, соответствующего переменной класса. Кроме того, каждая из этих вкладок содержит переключатель управления экспортом (Export Control), который определяет режим доступа к соответствующей переменной класса: Public, Protected», Private, implementation». По умолчанию этот указатель устанавливается в состояние Public.
позволяют детализировать определяемые свойства переменной класса, с помощью пяти полей, четырёх флагов и одного переключателя. На рассматриваемых вкладках размещаются поля, флаги переключатель, предназначенные для следующих целей: 1) роль (Role) – для определения имени переменной класса; 2) элемент (Element) – для отображения имени класса, для которого создается переменная; 3) условие (Constraints) – для ввода некоторого условия, которое должно быть выполнено, если система находится в устойчивом состоянии; 4) число объектов (Multiplicity) – для ввода числа создаваемых объектов данного класса, 5) ключи идентификации (Key/Qualifiers) для размещения список атрибутов, 6) флаг направления (Navigable) – для определения направления связи, 7) флаг агрегации (Aggregate), 8) флаг дружественного класса (Friend), 9) альтернативный переключатель режима доступа к элементам класса. (Containment of “имя класса”).
Информация, введенная в поле условия (Constraints), будет показано на диаграмме в фигурных скобках. Причем, на генерируемом коде данное условие не отражается. Следует отметить, что условие, заданное в поле условия «Constraints» вкладки детального описания связи, применяется к связи в целом, а ограничение, указанное в одноименном поле вкладки А или детального описания роли, применяется соответственно только к роли A или только к B.
Количество создаваемых объектов данного класса в поле “число объектов” (Multiplicity) может быть задано целым числом, буквой n или диапазоном целых чисел. Буква n обозначает любое число. Количество создаваемых объектов данного класса можно ввести или выбрать из списка. Содержимое поля “число объектов” отображается на диаграмме рядом со стрелкой связи.
В поле “ключи идентификации” (Key/Qualifiers) размещается список атрибутов, которые идентифицирует уникальным образом объекты. На генерацию кода этот список влияния не оказывает.
Флаг “направленная” (Navigable) определяет направление, в котором действует связь. При установке этого флага связь приобретает на диаграмме вид стрелки, указывающей направление связи. Направление связи влияет на создаваемый код класса, так как класс, на знак которого направлена стрелка связи, будет включен в класс, из знака которого стрелка связи выходит. Для того, чтобы изменить направление связи, надо снять флаг “направленная” на вкладке детального описания роли А и установить одноимённый флаг на вкладке детального описания роли Б. В случае, кода сняты флаги “направленная” на обеих вкладках, ни один класс не будет включен в другой. При этом на диаграмме связь будет изображаться линией без стрелок (рис. 4).
Рис. 4. Пример ненаправленной связи
Установка флага “агрегация” (Aggregate) на вкладке, определяющей свойства переменной, созданной для класса, включающего в себя другой класс, приводит к тому, что включаемый класс становится вложенным классом. Например, чтобы класс Class2 (см. рис. 5) стал вложенным классом по отношению к классу Class1, необходимо установить флаг Aggregate на вкладке детального описания роли Б. При этом на диаграмме в начале стрелки связи появляется ромб (см. рис. 5). Флаг “агрегация” может быть установлен только на одной вкладке – либо на вкладке детального описания роли А, либо на вкладке детального описания роли Б.
Рис. 5. Пример агрегирования классов: класс Class2 вложен в класс Class1.
Ниже приводится код C++, созданный для случая, когда Class2 является вложенным классом по отношению к классу Class1 (см. рис. 5):
class Class2;
class Class1
{ public:
Class2 relClass1_2;
};
Установленный флаг статической памяти (Static) указывает, что данная переменная является общей для всех объектов данного класса. Причем, после инициализации к ней можно обращаться, даже если еще не было создано ни одного объекта класса. Тип Static применяется для того, чтобы переменные не тиражировались при создании нового объекта класса. Например, если необходимо точно знать, сколько объектов класса создано, то можно поручить самому классу следить за этим числом, создав в нем переменную типа static int iCnt», видимую во всех объектах класса.
Установка флага дружественного класса (Friend) определяет, что данный класс, роль которого определяется, является дружественным классом, то есть имеет доступ к защищенным методам и атрибутам класса, с которым устанавливается связь. Необходимо отметить, что снятие флага дружественного класса не обеспечивает автоматического удаления соответствующего описателя из кода, полученного ранее при установленном флаге дружественного класса.
Наконец, альтернативный переключатель доступа (Containment of “имя класса”), обеспечивает установку одного из режимов доступа к элементам класса, с которым для данного класса устанавливается связь.
Класс ассоциаций «Association Class»
Данный тип связи для отображения свойства ассоциативной связи. Эти свойства сохраняются в специальном классе, который соединяется связью, рассматриваемого типа, с ассоциативной связи (рис. 6). Этот тип связи не имеет своих спецификаций, поэтому контекстное меню этой связи содержит только подменю Format и подменю Edit.
Рис. 6. Пример класса ассоциаций, который определяет свойства ассоциативной связи
Связь, моделирующая функциональную зависимость (Dependency of instanties)
Этот тип связи моделирует использование одним классом объектов другого класса. Такое использование может осуществляться при передаче параметров или при вызове операций класса. В этом случае генератор кода C++ пакета Rational Rose включает заголовочный файл в код класса, который использует операторы или объекты другого класса. Графически этот вид связи отражается пунктирной стрелкой (рис. 7).
Рис. 7. Пример функциональной зависимости на диаграмме классов
Связь, моделирующая наследование свойств (Generalization)
Данный тип связи позволяет указать, что один класс является родительским по отношению к другому, при этом будет создан код наследования класса. Пример такой связи показан на рис. 8.
Рис. 8. Пример связи наследования.
Ниже приводится листинг, полученный при генерации кода для показанного примера, приведенного на рис. 8.
#inс1ude "Class1.h"
class Class2 : public Class1
{
};
Практически, в основном, используются два вида связей: однонаправленная ассоциация (Unidirectional Association), для агрегирования включения ссылок на классы, и обобщение (Generalization), для создания иерархии наследования.
8. Создание кода на С++
На основе диаграммы классов Rational Rose реализует создание кода объявлений классов на выбранном языке программирования. Для того чтобы воспользоваться данной возможностью, необходимо убедиться, что выбранный язык программирования установлен при помощи Add-Ins - менеджера.
Необходимо отметить, что действия, которые требуются для создания кода на некотором языке программирования, скорее всего не подойдут для работы с другими языками программирования. Поэтому сначала рассматривается более универсальный вариант создания кода на языке C++, который не зависит от используемого компилятора. Создание кода на Visual C++ рассматривается в описании следующей лабораторной работы.