Генерация исходных текстов программ
Для демонстрационных целей достаточно спроектировать только один класс. Назовем его String. В его обязанности должны входить основные операции над массивами (печать, копирование, сравнение, получение размера). В качестве примера опишем сначала данный класс на C++: Class String Protected: Char *TmpString; Public: Int Counter; Теперь средствами Rose все спроектируем в графическом виде. Каждый атрибут задается отдельно, с комментарием, и расписывается тип (public, protected, private). На рис. 15.1 показан разворот спецификации для TmpString. Подобным образом расписываются все переменные.
Рис 15.1. Разворот спецификации для TmpString В плане описания функций все аналогично, только помимо описания самой функции (тип возвращаемого значения) необходимо расписать специфику каждого входного параметра, снабдив все это подробнейшими комментариями. Во всех продуктах компании Rational принято давать комментарии для любой малозаметной операции, поскольку впоследствии, при генерации отчетов не нужно будет еще раз вручную доводить документ, чтобы показать его руководству или передать разработчику в качестве технического задания. Результатом выполнения вышеописанных действий будет появление класса с расписанными спецификациями. Сам класс показан на рис. 15.2. Можно отметить, что в графическом виде можно оценить основные свойства каждого элемента.
Следующий шаг в работе - получение кода на C++. Rational Rose 98 в принципе не может дать готового кода, она способна лишь спроектировать класс и расписать спецификацию каждого элемента, подставить шаблоны членов класса для дальнейшего заполнения кодом. Для 100 %-ной генерации рабочего кода на C++ используется Rational Rose RealTime, которая в данном случае не рассматривается. Рассмотрим кодогенерация (точнее сказать, классогенерацию). Через систему меню выбираем поддерживаемый язык для описания спроектированного класса (в данном случае это C++), вызываем Code Generational. Результатом работы будет появление двух файлов:MyString и MyString. В первом расписывается сам класс, а второй является шаблоном для дальнейшего заполнения соответствующим кодом. Имея подобный шаблон, становится не важно, какой именно разработчик начал создавать кодирование логики класса.Для получения же подробного отчета по классу или технического задания можно воспользоваться инструментом Rational SoDA. Следующая задача, с которой поможет справиться RationalRose - анализ существующей системы. Зачем переписывать и документировать крупные системы заново, если можно воспользоваться функцией обратного проектирования, что позволит из имеющегося кода построить визуальную модель и уже визуально дописать необходимые свойства и атрибуты, дописать новые классы. А под конец сгенерировать весь спектр файлов, необходимых для дальнейшей работы программистов. Данный подход называется Round Trip и полностью поддерживается в RationalRose.
// //## begin module%395AF70D0321.cm preserve=no // %X% %Q% %Z% %W% //## begin module%395AF70D0321.cp preserve=no //## Module: MyString%395AF70D0321; Pseudo Package specification #ifndef MyString_h //## begin module%395AF70D0321.additionalIncludes preserve=no //## begin module%395AF70D0321.includes preserve=yes //## begin module%395AF70D0321.additionalDeclarations preserve=yes //## begin MyString%395AF70D0321.preface preserve=yes //## Class: MyString%395AF70D0321 // Данный класс позволяет проводить различные операции class MyString //## begin MyString%395AF70D0321.initialDeclarations preserve=yes public: //## Constructors (generated) MyStringQ; //## Destructor (generated) // // int operator!=(const MyString &right) const; //## Other Operations (specified) //## Operation: GetStringSize%395AF87900E9 Int GetStringSize (Char *massiv // Указатель на массив //## Operation: PrintString%395AF88800B9 //## Operation: CmpString%395AF892013F Char *Str2 // Указатель на второй массив //## Operation: CpyString%395AF89COOD5 //## Get and Set Operations for Class Attributes (generated) const Int get_Stat () const; //## Attribute: Count%395AF8C20148 void set_Count (Int value); // Additional Public Declarations protected: //## end MyString%395AF70D0321.protected private: //## Get and Set Operations for Class Attributes (generated) //## Attribute: TmpString%395AF8B201E5 // Additional Private Declarations //## end MyString%395AF70D0321.private private: //## implementation //## begin MyStrmg::TmpString%395AF8B201E5.attr preserve=no // private: Char * U Char *TmpString; //## begin MyString::Stat%395AF8BB0289.attr preserve=no public: Int U //## begin MyString::Count%395AF8C20148.attr preserve=no public: Int U // Additional Implementation Declarations //## end MyString%395AF70D0321.implementation }; //## begin MyString%395AF70D0321.postscript preserve=yes // Class MyString // return TmpString; //## end MyString::get_TmpString%395AF8B201E5.get inline void MyString::set_TmpString (Char * value) //## begin MyString::set_TmpString%395AF8B201E5.set preserve=no TmpString = value; //## end MyString::set_TmpString%395AF8B201E5.set } inline const Int MyString::get_Stat () const { //## begin MyString::get_Stat%395AF8BB0289.get preserve=no inline void MyString::set_Stat (Int value) { //## begin MyString::set_Stat%395AF8BB0289.set preserve=no inline const Int MyString::get_Count () const inline void MyString::set_Count (Int value) { //## begin MyString::set_Count%395AF8C20148.set preserve=no //## begin module%395AF70D0321.epilog preserve=yes //## end module%395AF70D0321.epilog #endif 1. Каковы преимущества автоматической кодогенерации? 2. Какие виды диаграмм используются для генерации кода? 3. Какие компоненты исходного кода генерирует Rational Rose?
Читайте также:
|


