Проектирование на Rose Delphi LinkИсточник: rdlfarru/ Большаков Олег
Компания Rational Software уже несколько лет является лидером в области создания инструментальных средств для проектирования, разработки, тестирования и сопровождения программного обеспечения. Основным продуктом в линейке Rational является CASE-средство Rational Rose. Rational Rose поддерживает визуальное объектно-ориентированное моделирование (UML), поддерживает генерацию кода и обратное проектирование (построение модели по программному коду) для многих языков программирования, позволяет строить объектную модель разрабатываемой программной системы, определять спецификации классов, объектов, атрибутов и операций (подробнее см. "Программист" №№ 2, 3, 5/6 за 2001 год). Так как Rational Rose обладает всеми необходимыми характеристиками для проектирования архитектуры системы любого масштаба, напрашивается идея использования Rose с такой мощной и популярной системой программирования, как Delphi. В стандартной поставке Rational Rose не предусмотрена возможность работы с Delphi, но Rational Software ведет программу по поддержке сторонних производителей программ-мостов (Links) между Rose и другими средствами разработки. В рамках этой программы фирмой Ensemble Systems была разработана программа-мост Rose Delphi Link (RDL), связывающая Rational Rose и Delphi. Основные функции RDL - генерация кода и обратное проектирование. Следует помнить, что генерируемый RDL код не содержит реализацию функциональности! Генерируются только декларативные элементы: определения классов, интерфейсов, записей, типов, директивы видимости и т.д. Дистрибутив Rose Delphi Link можно скачать с сайта фирмы фирмой Ensemble Systems, размер - около 8 МБ. Установка RDL стандартная, никаких сложностей не вызывает. После инсталляции программы в Rational Rose в меню Tools появляется новый пункт Ensemble Tools -> Rose Delphi Link (рис.1). Рисунок 1. Пункт меню RDL
Рисунок 2. Методология проектирования с использованием RDL Основная идея такого подхода состоит в использовании обратного проектирования (Round-trip engineering): все изменения, сделанные на уровне программного кода в Delphi, отображаются в объектной модели, построенной в Rose, и наоборот, при изменении классов, методов и т.п. в объектной модели Rose, соответственно, корректируется программный код. Обратите внимание на пару стрелок, которые соединяют третий и четвертый блок. Как раз эти стрелки и отображают процесс обратного проектирования. Рисунок 3. Основное окно Rose Delphi Link Основное окно RDL является дочерним по отношению к главному окну Rational Rose и постоянно находится поверх этого окна, сворачивается так же как дочернее окно, что, несомненно, очень удобно. Теперь воспользуемся приведенной выше методикой проектирования и разработаем программу и соответствующую ей модель Rose. Для примера возьмем программу, заполняющую два числовых массива размером 5 на 5 случайными числами, а также реализующую некоторые математические функции по их обработке. Программа должна выполнять следующие функции:
Рисунок 4. Интерфейс разрабатываемой программы Сохраним этот проект с именами модулей, предлагаемыми Delphi по умолчанию, откроем новый проект Rational Rose, и запустим Delphi Rose Link. Выберем пункт меню Open Project, и откроем только что сохраненный в Delphi проект. В окне RDL отобразятся деревья объектов модели Rose и проекта Delphi (рис. 5). Рисунок 5. Проект Delphi, открытый в RDL Левое дерево объектов - это объекты модели Rose, правое дерево - это объекты, объявленные в исходном коде Delphi. Обратите внимание на красные восклицательные знаки слева от значков, обозначающих объекты. Они обозначают различия между кодом Delphi и моделью Rose. Сейчас отмечены все значки, так как модели в Rose пока еще вообще не существует. Рисунок 6. Модель объектов модуля Unit1 Когда интерфейс разрабатываемой программы достаточно сложен и включает не один десяток элементов, объектная модель получается несколько перегруженной. Для того чтобы разгрузить модель, можно удалить из модели некоторые несущественные элементы. Удалять элементы нужно только из диаграммы, так как в этом случае они удаляются только визуально. При удалении из браузера объекты удаляются окончательно, и это влечет за собой изменение генерируемого RDL кода. Создадим новый модуль. Сделать это можно и в Delphi, и в Rose, и в RDL, но для чистоты эксперимента создавать все будем только в RDL. В Rose активизируем окно RDL и щелкнем правой кнопкой мыши по корневому элементу в дереве объектов модели Rose - в нашем случае это Model1.mdl. В контекстном меню выберем New -> Unit. Откроется окно редактора компонента (Component Editor) (рис. 7). На вкладке General указывается имя модуля (Unit2), и комментарий к создаваемому модулю, который при кодогенерации будет вставлен в модуль как комментарий. На вкладке Detail указывается вид (kind) компонента, и путь к исходному файлу. На вкладке Code Preview можно посмотреть код, который будет сгенерирован RDL для данного модуля. Выключение переключателя Allow Code/Model Updates запрещает генерацию кода и обновление модели для выбранного элемента. Рисунок 7. Редактор компонента После нажатия кнопки Ok видим, что в окне RDL появился значок, обозначающий новый модуль, и рядом с ним восклицательный знак, сигнализирующий о том, что модель Rose и код Delphi не синхронизированы. Обновим код Delphi, нажав кнопку Update All->. Теперь нужно переключиться на Delphi. Видим окно, предупреждающее, что модуль был изменен (рис. 8). Для загрузки обновленного модуля нажмем Ok. Рисунок 8. Сообщение Delphi об изменении файла проекта Теперь откроем только что сгенерированный модуль Unit2.pas. Можно убедиться, что генерация кода прошла успешно - объявлены все необходимые ключевые слова, вставлен комментарий. Следующий шаг - моделирование классов и их методов в этом модуле. Перейдем в Rose, и активизируем окно RDL. В дереве объектов выведем контекстное меню на объекте Unit2 и выберем пункты New -> Class. Появляется окно редактора класса (Class Editor) (рис. 9). На вкладке General нужно указать имя класса (Name), вид (Kind), видимость (Visibility) и комментарий к классу (Documentation). В нашем случае класс будет называться TMassiv, область видимости для него - Public. Рисунок 9. Редактор класса Для создания всех методов и атрибутов класса будем пользоваться пунктом меню New в контекстном меню класса в дереве объектов RDL. Редакторы атрибутов и методов в основном аналогичны редактору класса, поэтому подробности создания опустим. Создадим следующие атрибуты и методы (все методы с директивами видимости Public, атрибут M имеет видимость Private): В создании методов с параметрами есть некоторая особенность. Сначала метод создается обычным способом, затем, в дереве объектов RDL, в контекстном меню на методе, для которого предлагается указать параметр, выбирается пункт New -> Parameter и указывается имя параметра, его тип и комментарий к нему. После создания класса обратите внимание на диаграмму классов для модуля Unit2 в Rose - наш класс отображен в соответствии со спецификацией UML (рис. 10). Рисунок 10. Диаграмма классов с созданным классом Итак, класс создан, точнее его оболочка, пока без реализации. Теперь в основном модуле Unit1 создадим два экземпляра этого класса. Объявим их как M1 и M2 в секции Public класса TForm1. Это делается выбором нужных пунктов в контекстном меню дерева объектов и указанием параметров в редакторе атрибутов. Измененная диаграмма, где в классе TForm1 показаны объявленные экземпляры класса, изображена на рис. 11. Рисунок 11. Экземпляры класса, объявленные в секции public класса TForm1 Итак, модель построена, и теперь нужно сгенерировать окончательный код. В окне RDL жмем Refresh, Update All-> и переходим в среду Delphi. Теперь надо написать код, реализующий функциональность, и откомпилировать программу. При заполнении методов кодом иногда требуется добавить локальные или глобальные переменные. Это можно сделать в RDL, но лучше реализовать эти переменные в коде, а затем обновить модель Rose по исходному коду Delphi (Update All). Если в модели были удалены некоторые элементы, а в коде они уже реализованы, этот код заключается между директивами компилятора {$IFDEF DELETED} и {$ENDIF}. После реализации всего исходного кода в Delphi вернемся в RDL и еще раз выполним обратное проектирование, нажав Refresh и Update All. Класс TForm1 изменился - в нем появились методы - обработчики событий кнопок (рис. 12). В нашем случае это окончательный вариант диаграммы классов и всей модели в целом. Рисунок 12. Окончательный вариант диаграммы классов для модуля Unit1 Окончательный исходный код программы и построенную модель Rose можно скачать отсюда. В рассмотренном примере мы следовали методике разработки приложений, предложенной разработчиком Rose Delphi Link, и в результате получили объектную модель системы. Все классы и диаграммы, описывающее деятельность системы были спроектированы в Rational Rose с помощью программы Rose Delphi Link. Итак, выделим основные преимущества совместного использования RDL и Rational Rose:
Таким образом, при периодическом согласовании на основе технологии обратного проектирования обеспечивается соответствие модели Rose и кода Delphi, что позволяет разработчику убедиться, что архитектурные решения не претерпели существенных изменений, а также иметь актуальные документированные модели, отражающие действительное состояние разработки проекта. Литература 1. Вендров А.М. Проектирование программного обеспечения экономических информационных систем. - М.: Финансы и статистика, 2000 г. |