Структура создаваемого кода класов




Возможности создания кода класса

Класс в Rational Rose — это описание общей структуры (данных и связей) для дальнейшего создания объектов. Для того чтобы генератор Rational Rose имел возможность создавать на основе описанной модели программный код, для каждого класса необходимо указать язык, для которого будет создаваться код. Также необходимо определить компонент, в котором этот класс будет храниться. Если в качестве языка для создания кода указан VC++, то пользователь получает доступ ко всей иерархии классов библиотеки MFC при помощи визуальных средств Model Assistant.

При создании класса необходимо указать стереотип, который влияет на получаемый исходный код класса. Так, при изменении стереотипа на struct или union, будут созданы указанные типы данных.

Как вы уже заметили, Rational Rose поддерживает обычные для классов C++ обозначения области видимости, такие как public, prшivate, protected. Таким образом, каждый атрибут или операция в спецификации классов при создании заголовочного файла класса будут определены в одну из секций public, private, или protected. Также имеется возможность не создавать программный код для определенных классов.

Структура создаваемого кода класов

Для каждого создаваемого класса Rational Rose создает следующую структуру кода:

· директивы # include, которые создаются исходя из необходимости включения атрибутов и связей классов;

· декларация класса, имя класса, тип, наследование;

· переменные Data members, которые создаются по описанию атрибутов класса и его связей;

· декларация методов класса и скелет этих методов для дальнейшего наполнения каждой операции, заданной в описании класса;

· документация для каждого создаваемого класса, переменных, методов, заданная в описании модели;

· идентификатор ID модели, который включается в код как комментарий для каждого создаваемого класса, атрибута или метода, заданных в текущей модели. Например, //##ModelID=3237F8CE0053.

Ассоциация класса с языком VC++

Для того чтобы использовать класс в программном проекте, необходимо его ассоциировать с выбранным языком, в нашем случае с VC++. Для этого проделаем следующее Menu:Tools=>Visual C++=>Component Assigned Tools. Получаем окно, показанное на рис. 14.1.

Рис. 14.1. Назначение класса в VC++ проект

В появившемся окне выбираемы класс и перетаскиваем его на значок VC++. На вопрос, желаем ли мы создать VC++ компонент и ассоциировать его с классом, отвечаем Yes и попадаем в окно выбора проекта VC++ (рис. 14.2). Здесь можно создать проект или выбрать из уже имеющихся для помещения в него нового класса. Нажмите Add и ОК. У меня уже создан проект greenhouse.

Рис. 14.2. Выбор проекта

Вы у себя можете создать проект с таким же именем при помощи MFC Арр Wizard exe (мастер создания исполняемого приложения) с типом Single document (однооконный документ).

Замечание. Подробно о создании приложений Visual C++ можно прочитать, например, в книге [3]. Некоторые принципы создания приложений Visual C++ будут рассмотрены в теме 16, там же рассмотрим создание проекта при помощи мастера Visual C++.

По большому счету, класс может быть ассоциирован с любым языком, поддерживаемым генератором кода Rational Rose, и в результате ассоциации будет создан код программы на том языке, с которым ассоциирован класс, причем от конкретного языка зависят некоторые свойства класса. Поэтому неплохой идеей будет изначальная ассоциация классов с определенным языком программирования.

Совет. Для того чтобы вновь создаваемые классы сразу ассоциировались с VC++, нужно проделать: Menu: Tools='>Options=>Notation=>Default Language=VC++.

Меню инструментов Visual C++

После ассоциации класса с языком программирования вы можете воспользоваться пунктом главного меню Tools для Visual C++, показанном на рис. 14.3.

Рис. 14.3. Меню инструментов Visual C++

Model Assistant

Model Assistant позволяет обновлять и конкретизировать классы в модели, используя дополнительные ключевые слова C++ для необходимой генерации кода. Model Assistant представляет собой окно, позволяющее создавать атрибуты и операции и изменять их свойства (рис. 14.4), причем значительно проще и нагляднее, чем это происходит для C++.

Замечание. Те свойства, которые нельзя изменить, подсвечены серым цветом.

В этом окне вы видите следующие поля:

· Preview (предварительный просмотр) показывает описание класса так, как оно определено в текущий момент;

· Code Name (имя программы) показывает имя программного файла для данного класса;

· Generate Code (создавать исходный текст) — ключ, определяющий, необходимо ли создавать для данного класса исходный текст на языке VC++. Если ключ снят, то генерация кода не будет происходить, я этот класс не будет показываться в списке классов для обновления кода в окне Code Update (обновление исходного текста);

Рис. 14.4. Model Assistant для класса датчика температуры

· Class Type (тип класса) позволяет установить тип класса, такой как «class», «struct» или «union»;

· Documentation (документация) позволяет задавать произвольные комментарии для класса. Если это поле заполнено, то при генерации исходного кода текст из него будет включен в программу как комментарии. Это чрезвычайно удобно при просмотре программистом кода, созданного при помощи генератора Rational Rose. По крайней мере, данная возможность позволяет создавать документацию к программе непосредственно в момент создания класса.

Я по себе знаю, как не хочется писать комментарии к программе именно в тот момент, когда она должна вот-вот заработать.

Rational Rose позволяет создавать комментарии еще на этапе проектирования, пока не написано ни строки кода, что довольно удобно, потому что именно в момент проектирования класса еще не забыты те цели и ограничения, с которыми создается проектируемый класс или метод.

Значительные возможности предоставляет Rational Rose по интерактивной установке свойств методов класса. Рассмотрим свойства операции calibrate, для чего активизируем строку calibrate в окне Model Assistant. При этом программа активизирует диалоговое окно, показанное на рис. 14.5. Это окно позволяет устанавливать и изменять атрибуты для операции, а также перегружать определенные в классе операции.

Совет. Для того чтобы добавить атрибут или операцию, не выходя из Model Assistant воспользуйтесь пунктом Insert контекстного меню.

Рис. 14.5. Свойства операции calibrate

Назначение полей в окне следующее:

· Preview (предварительный просмотр) показывает описание операции таким образом, как оно было определено в текущий момент;

· Code Name (наименование кода) показывает имя кода для операции. Может быть скрыто, если такое имя не задано;

· Return Type (тип) позволяет выбрать из списка тип, возвращаемый операцией;

· Linkage (присоединение) позволяет установить тип операции, который может быть Friend или Static:

1. Static обозначает, что к данной операции можно обращаться еще до создания объекта класса;

2. Friend определяет, что данная функция хоть и не является членом класса, но имеет доступ к его защищенным и собственным компонентам. Таким образом, определяя операцию как дружественную, мы тем самым удаляем ее из методов класса и подразумеваем, что данная функция будет описана вне класса.

· Inline позволяет указать в операции ключевое слово inline, то есть операция будет создана как inline подстановка. В этом случае компилятор при создании объектного кода будет стараться подставить в текст программы код операторов ее тела. Таким образом, при многократных вызовах подставляемой функции размеры программы могут увеличиваться, однако исключатся затраты на передачу управления вызываемой функции и возвраты из нее. Как отмечает проект стандарта C++, кроме экономии времени при выполнении программы, подстановка функции позволяет проводить оптимизацию ее кода в контексте, окружающем вызов, что в ином случае невозможно. Наиболее удобны для подстановки функции, состоящие всего из нескольких строк;

· Const определяет тип операции как Const.

· Access Level (уровень доступа) указывает доступ к операции и может быть Public, Protected или Private;

· Operation Kind — тип операции Virtual, Abstract, или Non - Virtual. К механизму виртуальных функций обращаются в тех случаях, когда необходимо в базовый класс поместить функцию, которая должна по-разному выполняться в производных классах. Например, базовый класс может описывать фигуру на экране без конкретизации ее вида, а производные классы уже описывать реализацию конкретных треугольников, эллипсов, квадратов и т.д. При этом класс, который содержит хотя бы одну виртуальную функцию, называется абстрактным. В данном случае нет разницы между установкой пункта Virtual или Abstract. И в том, и в другом случае будет создана функция с ключевым словом virtual, которая потребует переопределения в производных классах или как минимум создания дочерних классов для класса, имеющего виртуальную функцию.

Если щелкнуть по атрибуту класса, то открывается окно для редактирования свойств этих атрибутов, показанное на рис. 14.6, в котором можно установить основные атрибуты класса, не выходя из Model Assistant.

Рис. 14.6. Редактирование атрибутов класса при помощи Model Assistant

В данном окне имеются следующие поля:

· Preview (предварительный просмотр) показывает описание атрибута таким образом, как оно было определено в текущий момент;

· Туре (тип) позволяет выбрать из списка тип атрибута;

· Initial Value (инициализация) позволяет устанавливать значение для инициализации атрибута;

· Access Level (уровень доступа) указывает доступ к атрибуту и определяет секцию, в которой будет создан атрибут: Public, Protected или Private;

· Static обозначает, что атрибут является статичным (общим для всех объектов класса);

· Derived обозначает, что данный атрибут является производным;

· Documentation позволяет редактировать описание атрибута.

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

Замечание. Model Assistant — основное окно для работы со свойствами класса и для создания необходимого кода, поэтому к нему также есть доступ из контекстного меню класса.

Component Assignment Tool

Активизирует диалоговое окно назначения классов в компоненты и назначения языка для класса (рис. 14.1). Это окно предоставляет возможность создания новых компонентов в модели, ассоциации компонентов с проектами на конкретных языках программирования и назначения классов в компоненты. Для того чтобы получить преимущества использования данного инструмента, необходимо создавать компоненты здесь, а не через окно Browser или в диаграмме компонентов. При этом созданные компоненты будут содержать всю необходимую информацию для генерации кода на выбранном языке программирования. Данное средство позволяет просмотреть классы, которые еще не назначены в компоненты, что уменьшает вероятность ошибки.

Component Assignment Tool может быть открыт как посредством меню Tools, так и из контекстного меню компонента в окне Code Update Tool.

Update Code/Update Model (обновить код/модель)

Данная возможность, как и возможность Update Model from code (обновить модель по коду), меня, как программиста на C++, больше всего привлекает в пакете Rational Rose.

Это возможность создать проект Visual C++ по разработанной модели и обновить модель по уже готовому проекту, созданному при помощи MFC.

Причем, что очень приятно, есть возможность не просто закачать уже готовый код в программу Rational Rose, как это предусмотрено пунктом меню C++ Reverse Engineering, а поддерживать обмен постоянно, то есть работать именно в том средстве, которое позволяет наиболее быстро получить необходимый результат.

Например, необходимо быстро подправить что-либо в уже готовой, работающей программе, причем, как всегда бывает, это необходимо было сделать «еще вчера». Программист быстро «подкручивает» что-то в исходном коде, добавляет или изменяет методы и атрибуты и быстро сдает работающую программу. Затем просто выбирает пункт Update Model from code, и эти изменения тут же попадают на рабочий стол Rational Rose. Теперь с ними можно нормально работать и сопровождать.

Ведь не секрет, что сопровождение — это кошмарный сон программиста. Часто проще написать код заново, чем разбираться в многочисленных «заплатках», сделанных в разное время и иногда даже разными людьми.

Здесь же «заплаток» нет принципиально. Вся программа составляет одну обозримую модель.

Допустим, что у нас уже создан проект greenhouse (у вас он должен уже быть, если все сделано правильно), и мы знаем, что после того как последний раз изменялась модель, исходный код класса датчика температуры был исправлен, и его необходимо обновить.

Выберем пункт Update Model from code. Причем в контекстном меню класса, ассоциированного с VC ++, также есть этот пункт, только он называется Update Model, что, впрочем, не имеет никакого значения, так как действия, выполняемые этими пунктами, одинаковы. После выбора появится окно с описанием дальнейших действий, его можно погасить, выбрав кнопку Next (дальше), и, к тому же, еще предотвратить его назойливое появление в дальнейшем путем установки флажка в поле Don't show this page in the future (больше не показывать эту страницу). После этого появится окно, показанное на рис. 14.7.

Рис. 14.7. Окно Update Model Tool

Здесь можно обновить как все классы модели, так и отдельные классы, при помощи установки и снятия отметок с определенных классов.

Если классы модели еще не ассоциированы ни с одним проектом VC++, то при помощи кнопки Add Component (добавить компонент) это можно сделать прямо из данного окна.

Некоторые классы проекта могут иметь ошибки или недостаток данных при создании их в Rational Rose с последующей генерацией кода или же при переносе данных из готового кода в модель Rational Rose. Такие классы отмечаются знаком вопроса в ярко желтом кружочке. Если выбрать такой знак вопроса, то появится сообщение Rational Rose, которое указывает на возникшую проблему или ошибку в классе, и предлагает методы ее устранения.

Затем Rational Rose получает информацию из проекта Visual C++, для этого загружается Microsoft Visual Studio и активизируется нужный проект Visual C++. После того как обмен произошел, может быть активизировано окно удаления компонентов. Если вы проводили эксперименты с полученным кодом, а затем удалили некоторые классы, операции или атрибуты, то программа отследит, что элементы существуют в модели Rational Rose, но никак не отражены в исходном коде. Программа считает, что эти компоненты были удалены из исходного кода и предлагает их удалить и из модели (рис. 14.8).

Рис. 14.8. Синхронизация кода и модели

Внимательно отнеситесь к этому вопросу. Возможно в проект Visual C++ были добавлены классы, например, при помощи Class Wizard, и они еще не отражены в модели Rational Rose. В этом случает необходимо провести обновление кода при помощи функции Update Code (обновить код). У нас именно такой случай, и вы можете ничего не удалять, если не будете устанавливать флажки на предложенных компонентах.

После завершения обмена программой будет представлен отчет о том, как прошло обновление. В окне имеется две вкладки:

Summary — краткая общая информация и Log — полный отчет об обновленных классах (рис. 14.9). Если все прошло нормально, то ошибок и предупреждений быть не должно, как показано на рисунке. Фатальная ошибка будет возникать, если на компьютере установлен пакет Visual Studio 5, а не 6, с которым работает Rational Rose 98i-2000.

Рис. 14.9. Отчет о проведенных обновлениях компонентов

При этом будет возникать ошибка обновления, и процесс завершится неудачно.

Совет. Если на вашем рабочем месте установлены обе версии Visual Studio, то для того, чтобы Rational Rose мог обнаружить версию 6, перед обновлением кода просто откройте в Visual Studio пустой проект.

Процесс обновления кода по изменениям в модели происходит аналогично. Причем Rational Rose позволяет выбрать конкретные классы, которые необходимо обновить.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-11 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: