(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Советы по использованию преобразований UML - C++ в Rational Systems Developer и Rational Software Architect

UML - это язык общего назначения. IBM Rational Software Architect и IBM Rational Systems Developer позволяют расширить функциональность UML-моделирования за счет поддержки конструкций, специфических для языка программирования C++. Преобразования UML - C++ в Rational Software Architect и Rational Systems Developer конвертируют UML-модели в код на языке C++. В этой статье рассматриваются различные советы по поводу того, как добиться более детализированного контроля над кодом C++, генерируемым при запуске преобразования UML - C++. Статья делится на несколько разделов, в каждом разделе рассматривается одна из методик. Вы можете просматривать эти разделы в любом порядке.

Применение профиля преобразования C++ к моделированию конструкций C++

Обычно для того, чтобы перекинуть мост между унифицированным языком моделирования (Unified Modeling Language, UML) и конкретной предметной областью, используют профили UML . Профиль UML позволяет определить дополнительные семантические правила и характеристики для существующих UML -элементов - классов, операций и т. п.. Для моделирования элементов, специфичных для C++, то есть структур, объединений, пространств имен (и т. д.), необходимо использовать профиль UML Модуль преобразования UML - C++ в Rational Software Architect и Rational Systems Developer поставляется в комплекте с профилем преобразования C++ . Этот профиль можно применить к UML-модели следующим образом.

  1. Выберите в обозревателе проектов Project Explorer UML-модель, к которой нужно применить профиль;
  2. Не снимая выделения с модели в Project Explorer, переключитесь на представление Properties и перейдите на вкладку Profiles;
  3. Нажмите кнопку Add Profile, как показано на рисунке 1;

Рисунок 1. Применение профиля преобразования UML - C++
Применение профиля преобразования  UML - C++

  1. Выберите пункт C++ Transformation из раскрывающегося списка Deployed Profile, показанного на рисунке 2.

Рисунок 2. Выбор Преобразования C++
Пример модели  UML2

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

UML предоставляет ограниченный набор встроенных типов. Это такие типы, как Boolean, Integer, String и UnlimitedNatural. Большинство языков программирования, в том числе C++, предлагают гораздо более богатый набор примитивов. Если вы моделируете для C++, вам часто будут нужны встроенные элементарные типы, специфичные для C++ (например, при присваивании типа атрибуту, параметру, типу возврата операции и т. д.). Чтобы импортировать библиотеку моделей C++, поставляемую с модулем преобразования C++ Transform, нажмите правой кнопкой мыши на UML-модели в Project Explorer и выберите команду Import Model Library, как показано на рисунке 3.

Рисунок 3. Импорт библиотеки типов C++
Импорт библиотеки типов C++с помощью контекстного меню

Выделите пункт C++ Types в списке Deployed Library, как показано на рисунке 4.

Рисунок 4. Импорт библиотеки типов C++
Импорт библиотеки типов C++

 
Опции документа
  Для печати установите альбомную (landscape) ориентацию 

Распечатать эту страницу

   

Обсудить


Выскажите мнение об этой странице
   

Помогите нам улучшить содержание


Уровень сложности: средний

Сандип Кохли, старший инженер-программист, IBM
Шрирупа Сен, старший инженер-программист, IBM

18.12.2007

UML - это язык общего назначения. IBM Rational Software Architect и IBM Rational Systems Developer позволяют расширить функциональность UML-моделирования за счет поддержки конструкций, специфических для языка программирования C++. Преобразования UML - C++ в Rational Software Architect и Rational Systems Developer конвертируют UML-модели в код на языке C++. В этой статье рассматриваются различные советы по поводу того, как добиться более детализированного контроля над кодом C++, генерируемым при запуске преобразования UML - C++. Статья делится на несколько разделов, в каждом разделе рассматривается одна из методик. Вы можете просматривать эти разделы в любом порядке.

Применение профиля преобразования C++ к моделированию конструкций C++

 
Поделитесь мнением...

 
digg   Отзыв на digg.com 
 
del.icio.us   Публикация на del.icio.us 
 
Slashdot   Публикация на slashdot 

 

Обычно для того, чтобы перекинуть мост между унифицированным языком моделирования (Unified Modeling Language, UML) и конкретной предметной областью, используют профили UML . Профиль UML позволяет определить дополнительные семантические правила и характеристики для существующих UML -элементов - классов, операций и т. п.. Для моделирования элементов, специфичных для C++, то есть структур, объединений, пространств имен (и т. д.), необходимо использовать профиль UML Модуль преобразования UML - C++ в Rational Software Architect и Rational Systems Developer поставляется в комплекте с профилем преобразования C++ . Этот профиль можно применить к UML-модели следующим образом.

  1. Выберите в обозревателе проектов Project Explorer UML-модель, к которой нужно применить профиль;
  2. Не снимая выделения с модели в Project Explorer, переключитесь на представление Properties и перейдите на вкладку Profiles;
  3. Нажмите кнопку Add Profile, как показано на рисунке 1;

Рисунок 1. Применение профиля преобразования UML - C++
Применение профиля преобразования  UML - C++

  1. Выберите пункт C++ Transformation из раскрывающегося списка Deployed Profile, показанного на рисунке 2.

Рисунок 2. Выбор Преобразования C++
Пример модели  UML2

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

UML предоставляет ограниченный набор встроенных типов. Это такие типы, как Boolean, Integer, String и UnlimitedNatural. Большинство языков программирования, в том числе C++, предлагают гораздо более богатый набор примитивов. Если вы моделируете для C++, вам часто будут нужны встроенные элементарные типы, специфичные для C++ (например, при присваивании типа атрибуту, параметру, типу возврата операции и т. д.). Чтобы импортировать библиотеку моделей C++, поставляемую с модулем преобразования C++ Transform, нажмите правой кнопкой мыши на UML-модели в Project Explorer и выберите команду Import Model Library, как показано на рисунке 3.

Рисунок 3. Импорт библиотеки типов C++
Импорт библиотеки типов C++с помощью контекстного меню

Выделите пункт C++ Types в списке Deployed Library, как показано на рисунке 4.

Рисунок 4. Импорт библиотеки типов C++
Импорт библиотеки типов C++

Создание пространств имен C++ в модели

В этом разделе рассказывается о том, как моделировать пространства имен C++ в UML-модели. Чтобы создать пространство имен в C++, необходимо применить стереотип cpp_namespace к UML-пакету. По умолчанию, преобразование UML - C++ отображает UML-пакет в папку. Чтобы отобразить UML-пакет не в папку, а в пространство имен, необходимо применить к нему стереотип cpp_namespace, а затем присвоить свойству NamespaceName, ассоциируемому с этим стереотипом, значение - имя пространства имен. Все классы, структуры, перечисления (и т. п.) стереотипного UML-пакета в формируемом коде будут сгенерированы в этом пространстве имен.

Вам может быть интересно, почему это пространство имен не получает имя стереотипного пакета. Причина - поддержка моделирования анонимных пространств имен в C++. То есть, если вы оставите свойство NamespaceName незаполненным, то пространство имен будет считаться анонимным.

Моделирование определяемых типов C++

Чтобы смоделировать определяемый тип C++(typedef), создайте UML-класс и примените к нему стереотип cpp_typdef. Этот стереотип предлагает три пары свойство/значение:

  • arrayDimensions
  • ImplementationType
  • qualifier

Чтобы создать определяемый тип typedef int const IntMatrix100_20_t [10][20];, создайте UML-класс IntMatrix100_20_t и примените к нему стереотип cpp_typedef. Задайте для этого стереотипа свойства в соответствии с рисунком 5.

Рисунок 5. Создание определяемого типа C++
Свойства определяемого типа C++

Чтобы понять зависимость определения определяемого типа от свойств, предоставляемых профилем, вы можете представить себе определяемый тип следующим образом: typedef <ImplementationType> <qualifier> <Class Name> <arrayDimensions>

Создание атрибутов многомерных массивов

В этом разделе рассказывается о том, как создать атрибут-трехмерный массив размерностью [10][20][30]. Выберите в обозревателе проектов Project Explorer атрибут, который нужно реализовать в виде многомерного массива. В представлении Properties перейдите на вкладку Stereotypes. На вкладке Stereotypes нажмите кнопку Apply Stereotypes и выберите стереотип cpp_type. Этот стереотип предлагает следующие пары свойство/значение:

  • arrayDimensions
  • InitializerKind
  • isAuto
  • isMutable
  • isRegister
  • isVolatile
  • qualifier

В поле arrayDimensions Value, изображенном на рисунке 6, укажите [10][20][30]. В результате этого в исходном коде будет сгенерирован атрибут с размерами массива [10][20][30].
Рисунок 6. Настройка многомерных атрибутов
Настройка многомерных атрибутов 

Определение формального параметра метода как константного

Этот прием использует те же принципы, что и предыдущий (определение многомерного массива). Выделите в Project Explorer параметр, который должен быть константным . В представлении Properties перейдите на вкладку Stereotypes. На вкладке Stereotypes нажмите кнопку Apply Stereotypes и выберите стереотип cpp_type. Этот стереотип предоставляет следующие пары свойство/значение:

  • arrayDimensions
  • InitializerKind
  • isAuto
  • isMutable
  • isRegister
  • isVolatile
  • qualifier

Все эти свойства могут быть полезными, но сейчас нас интересует только свойство qualifier. В поле Value для свойства qualifier введите значение const (как показано на Рисунке 5). Благодаря этому после выполнения преобразования в исходном коде будет сгенерирована сигнатура функции с константным спецификатором для выбранного параметра.

Примечание: убедитесь, что значение, которое вы указываете в этом поле, является корректным. Некорректное значение вызовет ошибку компиляции, которую придется исправлять до выполнения преобразования UML - C++.

Обратите внимание на то, что стереотип cpp_type применим также к атрибутам и классам. Однако для того, чтобы сгенерировать константный атрибут, проще просто пометить его как Read Only.

Как сделать константным весь метод

Предположим, что вы хотите объявить метод константным, чтобы он был сгенерирован с константным ключевым словом, как в )int Operation1(MyType Parameter1 const;. Для этого необходимо установить флажок для спецификатора Query на вкладке General в представлении Properties для этого метода, как показано на рисунке 7. Чтобы воспользоваться этой возможностью, нет необходимости в применении стереотипа.

Рисунок 7. Создание константного метода
Константный  метод C++ 

Добавление исключения в метод

Исключения - это приоритетные элементы в UML, поэтому их можно моделировать без использования профилей. Для упрощения и обобщения практики моделирования преобразования UML - C++ везде, где это возможно, используют свойства UML, а не профили. Чтобы сгенерировать предложение throw для функции, например, int Operation1() throw ( MyType);, необходимо сначала создать параметр для этой операции и установить для свойства Is Exception значение true.

Имя параметра не имеет значения, поскольку оно игнорируется в процессе преобразования, но лучше выбрать такое имя, которое позволит правильно идентифицировать исключение при его возникновении. На рисунке 8 показано, как установить для параметра Is Exception значение true.

Рисунок 8. Установление типа вызова исключительной ситуации для метода
Предложение Throw для метода

Контроль над предложениями include в генерируемом коде

Преобразование UML - C++ предназначено для автоматического выделения отношений из модели с последующим генерированием корректных предложений include или объявлений forward. Однако могут возникнуть ситуации, в которых вы захотите контролировать формирование предложений include. Например, вы хотите использовать в теле метода локальные переменные определенного типа, и поэтому вам нужно, чтобы в файле тела были сгенерированы предложения include для этого типа.

Вам придется явным образом смоделировать такие случаи, создав UML-отношение между этими двумя классами и применив к этому отношению стереотип cpp_dependency. Этот стереотип поставляется со свойством IsInclusionInHeader, значение которого по умолчанию равно false. Если вы хотите, чтобы предложения include были сгенерированы в файле тела, то вы должны оставить значение по умолчанию (false). Если эти предложения include нужно сгенерировать в заголовке, то следует либо вообще не применять стереотип cpp_dependency к созданному отношению, либо применить стереотип и установить для свойства IsInclusionInHeader значение true.

Использование секций сохранения кода при воспроизведении преобразования на уровне файла

Если вам нужно использовать в исходном коде типы из стандартной библиотеки или из какой-либо другой библиотеки, то в модели такие строки необходимо определить как простые строки (plain string). Например, если нужно объявить атрибут как vector of integers, в модели вы определили бы его тип как vector<int>. В процессе преобразования этот тип будет считаться примитивным типом, в результате чего для него не будут сгенерированы предложения include или объявления forward. Следовательно, такие типы необходимо включить в исходные файлы явным образом.

Например, для типа vector необходимо вставить в исходный код явное предложение include для типа vector: #include <vector>. Для поддержки этой возможности в каждом сгенерированном файле предусмотрена секция, которая будет сохранена дословно при повторном применении преобразования UML-C++, как показано в следующем листинге (см. листинг 1). Обратите внимание на строку //TODO: Add definitions that you want preserved (Добавьте определения, которые должны быть сохранены). Все, что вы напишете между комментариями Начало секции и Завершение секции, будет сохранено. Именно сюда можно добавлять такие предложения, как #include <vector>.

Листинг 1. Код, сгенерированный для класса Car

                

#ifndef CLASS1_H
#define CLASS1_H
//Начало секции для файла Class1.h
//TODO: Добавьте определения, которые должны быть сохранены
//Завершение секции для файла Class1.h

#include "MyType.h"

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

     //Начало секции для Class1
    //TODO: Добавьте определения, которые должны быть сохранены
    //Конец секции для Class1
    public:

        //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        int Operation1()const  throw ( MyType);

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

#endif
	      

Удаление секции повторного применения преобразования на уровне класса

Обратите внимание на то, что в коде предыдущего листинга имеется строка //Начало секции для Class1 ... //Завершение секции для Class1 . Вы можете поместить здесь все специфические предложения языка C++, которые вы не можете смоделировать, и они будут сохраняться до тех пор, пока вы явным образом их не удалите. При повторном применении преобразования UML - C++ предложения в этой секции не будут перезаписаны. Если вам не нужна эта секция в генерируемом коде, то, возможно, вы захотите удалить ее. При повторном выполнении преобразования UML - C++ она не будет сгенерирована снова. Именно так вы сможете избавиться от комментариев, которые вам не нужны.

В этом случае удалите следующую секцию (см. листинг 2), после чего она не будет восстановлена автоматически. Если вам снова понадобится эта секция, то придется вставить ее вручную в этом же месте кода.

Листинг 2. Код, сгенерированный для класса Car

                
    ...
    //Начало секции для Class1
    //TODO: Добавьте определения, которые должны быть сохранены
    //Завершение секции для Class1
    ...     

Как изменить имя генерируемого пакета, не изменяя UML-модель

Чтобы изменить имя пакета, выполните двойной щелчок на конфигурационном файле преобразования, чтобы открыть его в редакторе. Перейдите на вкладку Mapping и установите флажок Enable mapping, как показано на рисунке 9.

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

Нажмите кнопку New, чтобы создать модель отображения по умолчанию и дать ей подходящее имя. Нажмите кнопку Edit Mapping, чтобы вывести на экран диалоговое окно, показанное на рисунке 10.

Рисунок 10. Редактирование модели отображения
Редактирование модели отображения

Предположим, вы работаете с UML-моделью, показанной на рисунке 11. Если у вас нет модели отображения, то класс Date будет сгенерирован в папке с именем Package1. Если же вы хотите, чтобы Package1 был сгенерирован как Folder1, тогда вам нужно будет использовать модель отображения. Для этого в модели отображения перейдите к элементу Package1, а затем в редактируемом поле Mapped Name в нижней части страницы мастера введите имя Folder1. Теперь в генерируемом коде класс Date будет помещен в папку с именем Folder1.

Рисунок 11. Рабочая UML-модель
Отображение UML-модели

Как сгенерировать несколько классов в одном файле

Когда мы отображаем класс UML в модели отображения на другое имя, мы изменяем имя файла, в котором он будет сгенерирован, но не имя класса, который будет сгенерирован в этом файле. По умолчанию высокоуровневый класс генерируется в файле, имя которого соответствует имени этого класса. Значит, для класса UML с именем MyClass преобразование UML - C++ сгенерирует файлы MyClass.h и MyClass.cpp.

Однако вы можете выбрать другое имя для UML-класса при помощи модели отображения. Аналогично тому, как мы переименовали UML-пакет в модели отображения, чтобы сгенерировать другое имя для папки, можно отобразить UML-класс в файл с другим именем. Имя самого класса модель отображения не меняет. Следовательно, чтобы сгенерировать несколько классов в одном файле, достаточно дать им всем одно и то же целевое имя в модели отображения.

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 25.12.2007 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
IBM RATIONAL Rose Enterprise Floating User License + Sw Subscription & Support 12 Months
Rational ClearQuest Floating User License
IBM RATIONAL Quality Manager Quality Professional Authorized User Single Install License + Sw Subscription & Support 12 Months
IBM Rational Functional Tester Floating User License
Rational ClearCase Multisite Floating User License
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
CASE-технологии
Мир OLAP и Business Intelligence: новости, статьи, обзоры
Мастерская программиста
Компьютерная библиотека: книги, статьи, полезные ссылки
Работа в Windows и новости компании Microsoft
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100