|
ЛАБОРАТОРНАЯ РАБОТА № 14-15 Тема: Работа с CASE – средствами кодирования программного обеспечения Цель работы: Подготовка модели к генерации программного кода; генерация программного кода
Теоретическая часть Одно из самых мощных свойств Rational Rose – возможность генерации программного кода, представляющего модель. Варианты генерации программ меняются в зависимости от установленной версии Rose. В настоящее время применяются следующие три различные версии:
- Rose Modeler – позволяет создавать модель системы, но не поддерживает генерацию программного кода и обратное проектирование.
- Rose Professional – позволяет генерировать программный код на одном языке.
- Rose Enterprise – позволяет генерировать программный код на Ada 83, Ada 95, ANSI C++, CORBA, Java, COM, Visual Basic, Visual C++, C++ и XML. Кроме того, поддерживается генерация кода и обратное проектирование баз данных.
Лабораторный практикум построен на изучении Case-средства Rational Rose версии - Enterprise Edition. Подготовка к генерации программного кода
Процесс генерации программного кода состоит из пяти основных этапов:
Проверка модели.
Создание компонентов.
Отображение классов на компоненты.
Установка свойств генерации программного кода.
Генерация программного кода.
В разных языках не все этапы обязательны. Так, программы, разработанные на языке С++, генерируются и без предварительного создания компонентов. Генерировать код программ на любом языке можно, не выполняя проверки модели, хотя во время генерации это порой приводит к различным ошибкам.
Хотя не все этапы обязательны, первые пять из них рекомендуется выполнять до начала процесса генерации. Проверка модели поможет выявить ее неточности и недостатки, нежелательные с точки зрения последующей генерации программ. Этапы, на которых рассматриваются компоненты, - это способ отобразить логическую схему системы на ее физическую реализацию, причем на этих этапах собирается большой объем полезной информации. Если пропустить эти этапы, то для создания компонентов Rose воспользуется пакетной структурой логического представления. 2.1.1 Проверка модели
В Rose существует не зависящее от языка средство проверки моделей, применяемое для обеспечения корректности модели перед генерацией программного кода. Такая проверка помогает выявить в модели неточности и ошибки, не позволяющие генерировать программы надлежащим образом.
В общем случае проверка модели может выполняться на любом этапе работы над проектом. Однако после завершения разработки графических диаграмм она является обязательной, поскольку позволяет выявить целый ряд ошибок разработчика. К числу таких ошибок и предупреждений относятся, например, не используемые ассоциации и классы, оставшиеся после удаления отдельных графических элементов с диаграмм, а также операции, не являющиеся именами сообщений на диаграммах взаимодействия.
Для проверки модели следует выполнить операцию главного меню: ToolsCheck Model (ИнструментыПроверить модель). Результаты проверки разработанной модели на наличие ошибок отображаются в окне журнала. Прежде чем приступить к генерации текста программного кода разработчику следует добиться устранения всех ошибок и предупреждений, о чем должно свидетельствовать чистое окно журнала (рис. 5.1). Рисунок 5.1- Вид журнала при отсутствии ошибок по результатам проверки модели
К наиболее распространенным ошибкам относятся, например, сообщения на диаграмме Последовательности или Кооперативной диаграмме, не отображенные на операцию, либо объекты этих диаграмм, не отображенные на класс. 2.1.2 Создание компонентов
Второй этап процесса генерации программного кода - создание компонентов для классов. Существуют компоненты самых разных типов: файлы исходного программного кода, исполняемые файлы, библиотеки исполнения в реальном времени, компоненты ActiveX, апплеты и т.д. Перед генерацией программ можно отобразить каждый из классов на соответствующий компонент исходного программного кода.
После создания компонентов можно добавить зависимости между ними на диаграмме Компонентов. Зависимости между компонентами - это зависимости во время компиляции системы.
При генерации программ на C++, Java или Visual Basic выполнять подобный шаг не обязательно. В Java и Visual Basic Rose создаст автоматически соответствующий компонент для каждого из классов.
Для создания компонента:
1. Откройте диаграмму Компонентов (Component).
2. С помощью значка Component панели инструментов Diagram введите новый компонент в диаграмму. 2.1.3 Отображение классов на компоненты
Каждый компонент исходного кода - это файл с исходным программным кодом для одного или нескольких классов. В C++ каждый класс отображается на два компонента с исходным кодом: файл заголовка и основной файл (тело). В PowerBuilder на один компонент отображается несколько классов. Компонентом с исходным программным кодом в PowerBuilder является файл библиотеки PowerBuilder (.pbl). В Java каждый компонент - это один файл .java. Компоненты также создаются для элементов управления ActiveX, апплетов, файлов DDL, исполняемых файлов, а также других исходных и скомпилированных файлов.
Третий этап процесса генерации программного кода - отображение каждого из классов на соответствующие компоненты. В PowerBuilder необходимо отобразить каждый класс на компонент перед генерацией программы, в то время как в C++, Java и Visual Basic этот шаг не является обязательным. Rose может генерировать программный код самостоятельно. При генерации в Rose программ Java и Visual Basic производится еще и генерация нужных компонентов и отображение классов. Однако для C++ компоненты не создаются автоматически, а кроме того, ни для одного из языков не генерируются зависимости. Поэтому рекомендуется выполнять этот шаг независимо от применяемого языка программирования. Для отображения класса на компонент: 1. Щелкните правой кнопкой мыши на компоненте, на диаграмме Компонентов или в браузере.
2. Выберите Open Specification в контекстном меню.
3. Выберите вкладку Realizes (Реализует).
4. Во вкладке Realizes щелкните правой кнопкой мыши на нужном классе (классах) и выберите Assign (Присвоить) в контекстном меню.
В браузере имя компонента будет показано в круглых скобках вслед за именем класса в Логическом представлении (Logical view).
ИЛИ
1. Найдите класс в окне Logical view браузера.
2. Перетащите класс на нужный компонент в окне Component view.
3. В окне Logical view имя компонента будет показано в круглых скобках за именем класса. 2.1.4 Установка свойств генерации программного кода
Для каждого языка в Rose предусмотрен ряд определенных свойств генерации программного кода. Можно установить несколько параметров генерации программного кода для классов, атрибутов, компонентов и других элементов модели. Этими свойствами определяется способ генерации программ. В Rose предлагаются общепринятые параметры по умолчанию.
2.1.4.1 Настройка свойств C++
Для того чтобы пользоваться возможностями C++, необходимо описать назначение этих свойств, список которых доступен во вкладке C++ спецификаций класса. (см. рис. 5.2)
Рисунок 5.2 – Окно свойств генерации кода на С++ Перед генерацией программного кода рекомендуется анализировать эти свойства и вносить необходимые изменения. Назначение свойств:
CodeName - устанавливает имя класса в создаваемом коде. Данное свойство необходимо устанавливать только в том случае, если имя класса должно быть отлично от имени заданного в модели Rational Rose. Данное свойство необходимо использовать для создания работоспособного кода C++, если для классов в модели используются русские имена.
ImplementationType - позволяет использовать простые типы вместо определения класса, устанавливаемого Rational Rose по умолчанию. При задании этого параметра создается директива typedef.
ClassKey - используется для задания типа класса, такого как class, struct, или union. Если тип не указан, то создается класс.
GenerateEmptyRegion - свойство указывает, как будет создаваться пустой раздел protected: None - пустой раздел не будут создан; Preserved - пустой раздел будет создан, если будет установлено свойство «preserve=yes»; Unpreserved — пустой раздел будет создан, если будет установлено свойство «preserve=no»; All — всегда будет создаваться.
PutBodiesInSpec - если установлено как true, то в заголовочный файл попадет и описание тела класса. Используется для компиляторов, которым необходимо определение шаблона класса в каждом компилируемом файле.
GenerateDefaultConstructor - позволяет установить, необходимо ли создавать конструктор для класса по умолчанию. Может принимать следующие значения: DeclareAndDefine - создается определение для конструктора и скелет конструктора в теле класса; Declare Only - создается только определение; DoNotDeclare - не создается ни определения, ни скелета конструктора.
DefaultConstructorVisibility - устанавливает раздел, в котором будет определен конструктор по умолчанию: public, protected, private, implementation.
InlineDefaultConstructor - устанавливает, будет ли конструктор по умолчанию создаваться как inline подстановка. Если конструктора по умолчанию нет, то данное свойство не оказывает на код никакого эффекта.
ExplicitDefaultConstructor - устанавливает конструктор по умолчанию как explicit (явно заданный).
InlineRelationalOperations - определяет, будут ли функции операторов сравнения создаваться как inline подстановка.
GenerateStorageMgmtOperations - определяет, будут ли переопределяться операторы new и delete в классе.
StorageMgmtVisibility - определяет раздел, в который будут помещены операторы new и delete.
InlineStorageMgmtOperations - определяет, будут ли операторы new и delete определены как inline подстановка.
GenerateSubscriptOperation - определяет, будет ли переопределен оператор [].
Subscript Visibility определяет - раздел, в который будет помещен оператор [].
SubscriptKind - определяет вид функций оператора []: Common - обычная, Virtual - виртуальная, Abstract - абстрактная.
SubscriptResultType - определяет тип возвращаемого выражения для
оператора [].
InlineSubscriptOperation - определяет, будет ли оператор [] определен как inline подстановка.
GenerateDereferenceOperation - определяет, будет ли переопределен оператор *.
Dereference Visibility - определяет раздел, в который будет помещен оператор *.
DereferenceKind - определяет вид функций оператора *: Common - обычная, Virtual - виртуальная, Abstract - абстрактная.
DereferenceResultType - определяет тип возвращаемого выражения для оператора *.
InlineDereferenceOperation - определяет, будет ли оператор * определен, как inline подстановка.
GeneratelndirectionOperation - определяет, будет ли переопределен оператор ->.
IndirectionVisibility - определяет раздел, в который будет помещен оператор ->.
IndirectionKind - определяет вид функций оператора ->: Common - обычная, Virtual - виртуальная, Abstract - абстрактная.
IndirectionResultType - определяет тип возвращаемого выражения для оператора ->.
InlinelndirectionOperation - определяет, будет ли оператор -> определен как inline подстановка.
GenerateStreamOperations - определяет, будут ли переопределены операторы потоков (« и »).
2.1.5 Выбор класса, компонента или пакета
При генерации программного кода за один раз можно создать класс, компонент или целый пакет. Программный код генерируется с помощью диаграммы или браузера. При генерации кода из пакета можно выбрать либо пакет Логического представления на диаграмме Классов, либо пакет представления Компонентов на диаграмме Компонентов. При выборе пакета Логического представления генерируются все его классы. При выборе пакета представления Компонентов генерируются все его компоненты.
Программный код можно генерировать одновременно для нескольких классов, компонентов или пакетов. На диаграмме с помощью клавиши Ctrl выберите классы, компоненты или пакеты, для которых нужно сгенерировать программный код, а затем - соответствующую команду генерации в меню. 2.1.6 Генерация программного кода
Если у вас установлены Rose Professional или Rose Enterprise, то в меню Tools предлагается несколько вариантов, специфичных для конкретного языка программирования (см. рис. 5.3).
Рисунок 5.3 - Пункты меню генерации кода Чтобы показать или скрыть эти пункты меню, выберите пункт Add-Ins → Add-Ins (Надстройки → Менеджер надстроек). В диалоговом окне Add-In Manager (см. рис. 5.4) с помощью флажков покажите или скройте нужные варианты для различных языков.
Рисунок 5.4 - Менеджер надстроек Add-Ins Генерация программного кода в среде IBM Rational Rose 2003 возможна для отдельного класса или компонента. Для этого нужный элемент модели предварительно следует выделить в браузере проекта и выполнить операцию контекстного меню: Tools→C++→Code Generation - (Язык C++→Генерировать код). В результате этого будет открыто диалоговое окно с предложением выбора классов для генерации программного кода на выбранном языке программирования (рис. 5.5). После выбора соответствующих классов и нажатия кнопки OK программа IBM Rational Rose 2003 выполняет кодогенерацию.
Рисунок 5.5 - Окно выбора классов для генерации программного кода Затем происходит компиляция и выдается окно статуса (Code Generation Status). Здесь можно увидеть информацию о том, какой класс был закодирован и количество ошибок и предупреждений (рис. 5.6). Если у вас произошла, какая-либо ошибка или же предупреждение, то их можно увидеть на рабочем поле в Rational Rose, для этого и существует самое нижнее окно, в нем передаются все ваши действия и ошибки, произошедшие в ходе кодогенерации.
Рисунок 5.6 – Окно статуса компиляции 2.1.7 Результаты генерации
В результате кодогенерации Rational Rose создает два файла с расширением “.h” и “.cpp”, названия у них те же, что и название класса. Итак, выполнив эти действия, нажимаем правой клавишей на класс, появляется окошко, в нем ищем “С++”, и видим два пункта Browse Header и Browse Body, и в зависимости от того какой из файлов нам нужен “.h” (заголовочный) или “.cpp” (непосредственно реализация), выбираем их. Эти файлы открываются с помощью блокнота и теперь легко можно увидеть скелет класса, с различными комментариями, которые писали вы на диаграммах, и комментарии которые вставляет сама Rose. Теперь можно открыть один из файлов в С++ и доработать класс, описать работу функций, добавить различные нововведения.
Следует заметить, что при установленной на компьютер разработчика интегрированной среды сгенерированные файлы с текстом программного кода автоматически открываются в этой среде после двойного щелчка на пиктограмме этих файлов. Тем не менее, лучше копировать содержимое этих файлов в предварительно созданные программные проекты для полного контроля в этих средах процесса программирования и отладки приложений.
Сгенерированные программой IBM Rational Rose 2003 файлы с текстом программного кода содержат минимум информации. Для включения дополнительных элементов в программный код следует изменить свойства генерации программного кода, установленные по умолчанию.
В заключение следует отметить, что эффект от использования средства IBM Rational Rose 2003 проявляется при разработке масштабных проектов в составе команды или проектной группы. Однако ситуация покажется не столь тривиальной, когда станет необходимо выполнить проект с несколькими десятками вариантов использования и сотней классов. Именно для подобных проектов явно выявляется преимущество использования средства IBM Rational Rose 2003 и нотации языка UML для документирования и реализации соответствующих моделей. Задание на лабораторное занятие
Изучить теоретический материал
Сгенерировать программный код на С++ для диаграммы классов, разработанной вами в предыдущей лабораторной работе.
Содержание отчета
- титульный лист;
- постановка задачи;
- листинг сгенерированного кода;
- вывод. Контрольные вопросы
1. Какие диаграммы необходимо предварительно разработать, чтобы выполнить кодогенерацию?
2. Как посмотреть исходный код?
3. Какие установки свойств доступны на вкладке C++?
4. Какова структура создаваемого кода?
5. Что необходимо добавить в шаблоны классов для получения работоспособного приложения?
6. Какие шаги нужно предпринять для обновления модели по исходному коду?
7. Какие основные этапы кодогенерации вы знаете? Расскажите кратко о каждом из них?
|
|
|