Перетворення UML-C + + в IBM Rational Systems Developer і Rational Software Architect

Вчимося використовувати UML-моделювання в IBM Rational Software Architect і IBM Rational Systems Developer для розробки додатків на C + +. У цій статті описуються функції, що з'явилися у версії 7.0 і підтримують створення моделей, специфічних для предметної області C + +. При написанні програмних кодів, наведених у цій статті, автори виходили з того, що ви працюєте над поліпшенням моделі і коду і хочете зберегти зміни до них після повторних застосувань перетворень UML-C + +. Щоб отримати користь з читання цієї статті, достатньо мати базові знання UML і описаних програмних продуктів Rational, однак автори припускають, що ви вмієте виконувати перетворення і застосовувати профілі та стереотипи.

Необхідні умови та загальна інформація про процес


У цій статті розповідається про те, як програміст в C + + може використовувати структури даних C + + при розробці додатків навіть в тому випадку, якщо він створює моделі за допомогою Unified Modeling Language (UML). Щоб отримати користь з читання цієї статті, достатньо мати базові знання UML і програмних продуктів IBM Rational Software Architect і IBM Rational Systems Developer, однак автори припускають, що ви вмієте виконувати перетворення і застосовувати профілі та стереотипи. Процес можна розділити на наступні етапи:



  1. Починаємо з створення простої UML-моделі в IBM Rational Systems Developer;
  2. Застосовуємо до цієї моделі профіль C + +, щоб можна було використовувати при моделюванні структури даних, специфічні для C + +;
  3. Імпортуємо в модель бібліотеку типів C + +, щоб можна було використовувати примітивні типи C + +;
  4. Генеруємо код і побіжно переглядаємо його;
  5. Потім додаємо тіло в метод в якому-небудь класі;
  6. Додаємо в модель кілька незначних деталей, щоб поспостерігати за тим, як при повторному застосуванні перетворення UML – C + + зберігаються зроблені вами зміни в коді і моделі.

Створення простої UML-моделі


Профіль UML – це механізм, який розширює UML стандартизованим способом, що дозволяє моделювати в UML певні специфічні для даної предметної області функції, не обтяжуючи UML додатковими відомостями про наявні та можливі в майбутньому мовах і технологіях. Автори UML не могли передбачити всіх областей, для моделювання яких буде використовуватися UML, тому для таких випадків вони передбачили механізм розширення, що дозволяє UML не розростається до дуже великих розмірів.


Застосування профілю C + +


Для моделювання, наприклад, таких специфічних для С + + елементів, як структури, об'єднання, Що визначаються типи typedef і т. п., необхідно застосувати до UML-моделі профіль С + +. Профіль С + + поставляється разом з інструментом перетворення UML-C + +. Щоб застосувати профіль, виконайте наступні кроки:



  1. Переконайтеся, що перебуваєте у поданні Modeling;
  2. Виберіть модель, а потім перейдіть до подання Properties;
  3. Виберіть категорію Profiles зі списку в лівій частині подання Properties;
  4. Натисніть кнопку Add Profileі виберіть профіль C++ Transformation в списку Deployed Profile в діалоговому вікні Select Profile. (Див. рисунки 1 і 2.)

Малюнок 1. Застосування профілю C + + (CPP)


Малюнок 2. Вибір профілю C + +


Імпорт бібліотеки типів C + +


UML надає дуже обмежений набір вбудованих типів. Це, як правило, такі типи, як Boolean, Integer, String і UnlimitedNatural. Більшість мов програмування, зокрема C + +, пропонують набагато багатший набір примітивів. При створенні моделей для C + + вам часто будуть потрібні вбудовані примітивні типи мови З + + при присвоєнні типу атрибутам, параметрам, типами повернення операції і так далі. Щоб імпортувати бібліотеку моделювання C + +, яка поставляється разом з інструментом перетворення C + +, виконайте наступні дії:



  1. Клацніть правою кнопкою миші на UML-моделі в панелі браузера проектів Project Explorer;
  2. Виберіть з контекстного меню команду Import Model Library, Як показано на малюнку 3;

Малюнок 3. Імпорт бібліотеки типів C + +




  1. У вікні Import Model Library виберіть опцію Deployed Library, А потім виберіть зі списку пункт C++ Types , Як показано на малюнку 4.

Малюнок 4. Вибір імпортованої бібліотеки типів C + +



Тепер ви готові до моделювання специфічних для С + + елементів, які не мають еквівалентів в UML. Приклад.


Створення простої моделі заводу, що виробляє автомобілі


Приступимо до створення простий UML-моделі, показаної на малюнку 5. Існують різні способи створення цієї моделі, але вам пропонується слідувати показаної на малюнку схемі. Наприклад:



  • Ця проста модель містить клас Vehicle (Транспортний засіб), Базовий для класів Bus (Автобус) і Car (Автомобіль);
  • Класи Bus (Автобус), Car (Автомобіль) і Vehicle (Транспортний засіб) створюються в UML-пакеті з ім'ям Vehicles (Транспортні засоби), Це на схемі не показано;
  • Аналогічно, класи Engine (Двигун) і Wheels (Колеса) створюються в UML-пакеті з ім'ям Parts (Компоненти), Що також не відображена на схемі;
  • Клас Car (Автомобіль) пов'язаний асоціацією "містить" з класом Engine (Двигун);
  • На цьому уявному заводі класи Car (Автомобіль) і Engine (Двигун) є нероздільними, оскільки жоден автомобіль не може обійтися без двигуна;
  • Класи Car (Автомобіль) і Bus (Автобус) пов'язані асоціацією "збираються в одне ціле" з класом Wheels (Колеса);
  • У цьому прикладі колеса можуть існувати без автомобіля, а автомобіль може існувати без коліс – принаймні, поки не буде закінчена збірка.

Малюнок 5. Приклад – проста UML-модель заводу з виробництва автомобілів



Створення елементів С + + в моделі



  1. Потім ми створюємо UML-пакет з ім'ям Strategy на рівні моделі;
  2. У пакеті Strategy визначимо маршрути і вихідні точки для автобусів;

    1. Створіть клас з ім'ям Route, Який буде представляти маршрут, і клас Address, який буде представляти якусь з адрес, відповідний точці відправлення автобусного маршруту;
    2. Address повинен бути елементом C + + "структура ", а не звичайним класом.

  3. Давайте тепер уточнимо UML-модель, вказавши, що маршрут призначається для кожного автобуса. Це можна зробити, додавши асоціацію "додається" від класу Bus в пакеті Vehicles до класу Route, Як показано на малюнку 6;
  4. Одним з основних властивостей маршруту є пункт відправлення. Значить, потрібно додати атрибут з ім'ям startingPoint і типом Address класу Route.

Малюнок 6. Вміст нового UML-пакета Strategy



Зверніть увагу, що на малюнку 6 Address являє собою клас <<cpp_struct>>. Для створення стереотипного елемента з ім'ям Address і типом <<cpp_struct>> виконайте наступні кроки:



  1. Створіть UML-клас і надайте йому ім'я Address;
  2. Застосуйте до щойно створеного класу стереотип cpp_struct;

    1. Щоб застосувати стереотип до якого-небудь елементу UML, необхідно перемкнутися на подання Properties для цього елемента;
    2. Виберіть пункт Stereotypes зі списку категорій у лівій частині вікна подання, а потім натисніть кнопку Apply Stereotypes, Як показано на малюнку 7.

Малюнок 7. Застосування стереотипу




  1. Виберіть зі списку стереотипів, які можна застосувати для цього елемента, стереотип cpp_struct . Крім того, перегляньте та інші елементи списку, просто для довідки, на майбутнє.

Дуже скоро ви побачите, що при перетворенні цієї моделі в код UML-клас Address зі стереотипом <<cpp_struct>> Буде згенерувати як елемент структура, а не як клас.


Налаштування перетворення та генерація коду


Перш ніж ви зможете згенерувати код C + + з своєї моделі, необхідно визначити параметри для перетворення UML – C + + шляхом створення конфігураційного файлу перетворення.


Створення конфігураційного файлу перетворення


Ось один із способів, який можна використовувати для виконання цього завдання:



  1. Виберіть у меню команди File > New > Others, А потім виберіть елемент transformation configuration в папці Transformations;
  2. У діалоговому вікні майстра створення конфігурації перетворення New Transform Configuration wizard вкажіть ім'я для нового конфігураційного файлу. Для цієї вправи вкажіть ім'я tc1;
  3. Виберіть тип перетворення і проект, в якому буде збережений конфігураційний файл;

    1. Для вибору типу перетворення розгорніть список IBM Rational Transformations , А потім виберіть зі списку UML to C++;
    2. Щоб зберегти конфігураційний файл для цієї вправи, використовуйте вже існуючий проект UML-моделі.

  4. Потім перейдіть до наступній сторінці майстра, натиснувши кнопку Next;
  5. На вкладці Source and Target:

    1. Виберіть UML-модель в якості джерела;
    2. Створіть новий керований проект C + + в якості призначення.

  6. Переконайтеся, що джерело і призначення обрані, після чого натисніть кнопку Finish.

Примітка:
Якщо потрібно, конфігураційний файл можна згодом змінити.


Генерація коду


Це не повинно викликати труднощів



  1. Ви вже зробили саму важку роботу, тому можете приступити до створення коду; для цього просто натисніть правою кнопкою миші на tc1.tc і виберіть команди Transform > UML to C++ з контекстного меню. Після цього в проекті, який був обраний як призначення при створенні конфігураційного файлу перетворення, буде згенерований потрібний код;
  2. Перегляньте код, який був згенерований для класу Route. Він містить атрибути startingPoint і endingPoint, А також метод getFare() (Див. код лістингу 1).

Лістинг 1. Route.h – код, що згенерував для класу Route




                

#ifndef ROUTE_H
#define ROUTE_H
/ / Початок секції для файлу Route.h
/ / TODO: Додайте визначення, які повинні бути збережені
/ / Завершення секції для файлу Route.h

struct Address;

/ / @ Generated "UML to C + + (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
class Route
{

private:
/ / @ Uml.annotationsderived_abstraction = "platform: / resource/UML-1 /
DWArticle-1.emx#_Hk7qMACuEdy9t-_gdCbefQ”
/ / @ Generated "UML to C + + (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
float runningCost;

/ / @ Uml.annotationsderived_abstraction = "platform: / resource/UML-1 /
DWArticle-1.emx#_hKd58ACuEdy9t-_gdCbefQ”
/ / @ Generated "UML to C + + (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
float expectedProfit;

/ / @ Uml.annotationsderived_abstraction = "platform: / resource/UML-1 /
DWArticle-1.emx#_ieiw8ACuEdy9t-_gdCbefQ”
/ / @ Generated "UML to C + + (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
Address * startingPoint;

/ / @ Uml.annotationsderived_abstraction = "platform: / resource/UML-1 /
DWArticle-1.emx#_jkEOkACuEdy9t-_gdCbefQ”
/ / @ Generated "UML to C + + (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
Address * endingPoint;
public:

/ / @ Uml.annotationsderived_abstraction = "platform: / resource/UML-1 /
DWArticle-1.emx#_kawmAACuEdy9t-_gdCbefQ”
/ / @ Generated "UML to C + + (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"

float getFare()const ;

}; / / Завершення опису класу Route

#endif


Тіло методу getFare за замовчуванням було створене у відповідності з лістингом 2.


Лістинг 2. Route.cpp





#include “Route.h”
/ / Початок секції для класу Route.cpp
/ / TODO: Додайте визначення, які повинні бути збережені
/ / Завершення секції для файлу Route.cpp

float Route::getFare() const
{
/ / TODO Автоматично сгенеренний метод заглушок
return 0;
}


Зміна коду


Ви повинні були помітити, що тіло за замовчуванням навряд чи використовується часто, тому що тариф завжди дорівнює 0 (Нулю). Навряд чи це зробить підприємство вигідним! Тому нам доведеться замінити тіло методу getFare кодом, представленим в лістингу 3.

Лістинг 3. Route.cpp





float Route::getFare() const
{
/ / Розрахунок тарифу
return runningCost * expectedProfit;
}


Розробка моделі та повторне застосування перетворення


Далі, додамо ще один метод з ім'ям print_disclaimer() в клас Route UML-моделі.



  1. Вкажіть тип повернення для методу – String;
  2. Зверніть увагу на те, що ми змінили також файл Route.cpp, додавши тіло для методу getFare;
  3. Виконайте перетворення, скориставшись тією ж конфігурацією перетворення (tc1.tc > Transformation > UML to C++);
  4. Погодьтеся з налаштуваннями за замовчуванням, які ви побачите в діалоговому вікні; вони попереджають про те, що будуть оновлені файли призначення.

Після цього вивчите оновлений код (Лістинг 4).

Лістинг 4. Оновлений файл Route.cpp





#include “Route.h”
/ / Початок секції для файлу Route.cpp
/ / TODO: Додайте визначення, які повинні бути збережені
/ / Завершення секції для файлу Route.cpp

float Route::getFare() const
{
/ / Розрахунок тарифу
return runningCost * expectedProfit;
}

/ / @ Generated "UML to C + + (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
const char * Route::print_disclaimer()
{
/ / TODO Автоматично сгенеренний метод заглушок
return 0;
}


Зверніть увагу, що змінений тіло для методу getFare() збережено. У той же час новий метод print_disclaimer, доданий в модель, викликав генерацію нового коду у файлах Route.h і Route.cpp files. Так ви можете продовжувати реалізувати свої методи в коді і, одночасно, вносити поетапні зміни в модель. Завдяки цього у вас з'являється можливість вести керовану моделями ітеративну розробку.


Тег @ generated


У коментарях до методу ви напевно звернули увагу на тег <<@generated>>. Тіло методу зберігається автоматично. Однак якщо ви видалите метод з моделі і знову виконайте перетворення С + +, то метод буде видалено разом з тілом коду. Це гарантує, що ваш код не буде засмічуватися всілякими методами, які ви коли-небудь розробили в моделі і які інакше довелося б видаляти з нього вручну.


Якщо ви не хочете, щоб це сталося, і, навпаки, хочете зберегти цей метод в коді, то вам доведеться видалити тег <<@generated>> з коментаря до методу. Таким чином, ви збережете контроль над цим методом, і він залишиться в коді після повторного виконання перетворення.


Додавання користувача пропозицій include в секцію зберігається коду


У лістингу 5 ми написали код для методу print_disclaimer. Зверніть увагу на використання оператора cout. Перетворенню С + + про це нічого не відомо. Однак, щоб повторне виконання пройшло коректно, важливо, щоб код можна було піддати синтаксичному розбору для збереження структури коду і тіла методів при повторному виконанні перетворення. Щоб зробити код компільованих, необхідно додати у файл з розширенням cpp пропозиції #include <iostream> і using namespace std. Ці пропозиції обов'язково будуть збережені при повторних виконаннях перетворення UML – C + +. Для цього необхідно вставити зазначені пропозиції між коментарями:






 / / Початок секції для файлу Route.cpp
/ / Завершення секції для файлу Route.cpp


Все, що ви додасте в цю секцію, буде збережено дослівно і не буде інтерпретуватися перетворенням С + +.


Лістинг 5. Route.cpp





#include “Route.h”
/ / Початок секції для файлу Route.cpp
#include <iostream>
using namespace std;
/ / Завершення секції для файлу Route.cpp

float Route::getFare() const
{
/ / Розрахунок тарифу
return runningCost * expectedProfit;
}

/ / @ Generated "UML to C + + (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
const char * Route::print_disclaimer()
{
const char *s = “No Refund once the ticket is purchased
“;
cout << s;
return s;
}


Примітка про завантажуваних файлів:


  • Приклади UML-моделі і проектів C + +: дані проекти у вигляді. Zip-архівів можна імпортувати в робочу область Eclipse; для цього необхідно вибрати з меню команди File > Import, А потім викликати майстер імпорту існуючих проектів в робочу область Import Existing Projects into Workspace wizard.

Висновок


У цій статті були продемонстровані основи використання Rational Systems Developer для створення UML-моделі для генерації коду C + + і способи паралельної роботи над кодом і моделлю.


Завантаження




















Опис


Ім'я


Розмір


Метод завантаження


Sample UML Model project.


MyAutomobileFleet.zip


7KB


HTTP 


Final CPP Project


AutomobileFleetCode.zip


33KB


HTTP 

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*