© Константин Грибачев
Статья была опубликована в журнале КомпьютерПресс
В предыдущей части были рассмотрены основные функции модели приложения в Borland MDA, а также кратко описаны элементы диаграммы классов UML. Настоящая статья посвящена практической разработке модели MDA-приложения в графических UML-редакторах на примере CASE-системы Rational Rose. Следует отметить, что после включения в версию 4 Bold for Delphi полной поддержки функций импорта и экспорта модели в формате XMI (XML Metadata Interchange — язык обмена метаданными XML) появилась возможность разрабатывать модели приложений для Borland MDA в любом UML-редакторе, поддерживающем этот формат (например, в PowerBuilder компании Sybase). Кроме того, в состав Delphi 7 Studio входит инструмент ModelMaker, в который также включены развитые средства UML-моделирования и некоторые средства интеграции с Bold. Тем не менее с большой долей вероятности можно утверждать, что на данный момент именно Rational Rose остается наиболее удобным средством разработки UML-моделей для Borland MDA. Дело в том, что в качестве инструмента создания модели для Bold CASE-система Rational Rose занимает особое место среди других программных средств, обладающих графическим UML-редактором. Взаимодействие с Rational Rose заложено в Borland MDA начиная с ранних версий продукта Bold for Delphi, причем сделано это довольно основательно. Такое взаимодействие реализуется посредством технологии COM (Component Object Model — модель компонентных объектов). Подробное описание COM приводится во многих источниках, например в [1].
С позиции COM Rational Rose является сервером автоматизации, выполняющим запросы клиента (контроллера) — среды разработки Borland MDA. Благодаря такому тесному механизму взаимодействия обеспечиваются следующие полезные функциональные возможности:
Перечисленные функции позволяют на практике объединить удобные выразительные средства графического интерфейса Rational Rose с возможностью реализации тонкой настройки модели приложения в среде Borland MDA.
Перед созданием модели в редакторе Rational Rose необходимо обеспечить его предварительную настройку для работы с Borland MDA. Для начала следует убедиться в наличии Bold for Delphi в составе активных расширений (Add-In) Rational Rose. Для этого посредством меню Add-Ins->Add-In Manager… нужно вызвать окно менеджера расширений (рис. 1) и, при необходимости, активизировать пункт Bold for Delphi.
Рис. 1
Для настройки под конкретную версию Bold for Delphi используется так называемый файл свойств (Properties Files), именуемый BfD.pty, который создается при инсталляции Bold for Delphi в папке <…\Program Files\Boldsoft\BfDR40D7Arch\Rose\>.
Для его использования необходимо выбрать в Rational Rose пункты меню Tools->Model Properties->Update…, а затем — вышеуказанный файл. После этого необходимо перейти в окно настроек модели (Tools->Model Properties->Edit), выбрать закладку Bold, далее выбрать из ниспадающего списка параметр Project и установить его свойство (самое нижнее в списке параметров) с названием PTYVersion равным новому значению (на рис. 2 номер версии модели 6.4 соответствует последнему обновлению продукта).
Рис. 2
На этом этап настройки Rational Rose закончен. При каждом обновлении версии Bold for Delphi эту настройку следует повторять.
Во второй части этой статьи2 было продемонстрировано создание модели приложения средствами встроенного в Bold текстового UML-редактора. На примере аналогичной модели посмотрим, как данная процедура реализуется с помощью UML-редактора Rational Rose. Для этого создадим простую диаграмму классов, состоящую из двух классов и одной ассоциации. Сохраним созданную модель в файле, например в lib.mdl (рис. 3).
Рис. 3
Далее перейдем в среду Delphi и создадим простой проект, состоящий из одной формы. С закладки <BoldHandles> поместим на форму компоненты BoldModel1,
BoldSystemHandle1, BoldSystemTypeInfoHandle1 и настроим их аналогично рассмотренному ранее простому приложению. С закладки <BoldMisc> поместим на форму компонент BoldUMLRoseLink (он предназначен для связи с моделью RationalRose) и установим в его свойстве FileName имя файла сохраненной нами модели — lib.mdl.
Теперь все готово для импорта модели Rational Rose в среду Borland MDA. Для этого, кликнув дважды по компоненту BoldModel1, откроем встроенный UML-редактор Bold и запустим импорт, нажав на вторую справа иконку со стрелкой в панели инструментов (рис. 4).
Рис. 4
После запроса о подтверждении будет произведен импорт в среду Borland MDA. Корректность импортированной модели можно проверить, задав из главного меню Tools->Consistency Check. Теперь самое время проиллюстрировать преимущества, которые дает взаимодействие Rational Rose и Borland MDA. На рис. 4 в дереве объектов выделены рамками два объекта: ассоциация и класс с названием writesbyAuthor, при этом класс был создан автоматически. Когда в предыдущем примере мы генерировали модель приложения в Bold-редакторе, мы были вынуждены создавать такой класс для нашей ассоциации «вручную». Теперь же можно убедиться, что взаимодействие Borland MDA и Rational Rose настолько интеллектуально, что не ограничивается собственно передачей информации об элементах модели (классах, атрибутах, ассоциациях). В нашем случае при импорте был автоматически добавлен указанный новый класс. Это объясняется тем, что оба конца нашей ассоциации имеют кратность ролей «1..n» (см. ниже). Если заменить в модели кратность хотя бы одной роли на «1» и снова произвести импорт, то можно легко убедиться, что промежуточный класс исчезнет. Таким образом, Borland MDA, как уже говорилось, в ряде случаев способен самостоятельно добавлять в модель необходимые элементы. Подобная операция носит название «болдификация модели» — boldification, а обратная ей — unboldification. При необходимости в Bold-редакторе можно увидеть как болдифицированную, так и исходную модель — для этого достаточно задать в меню Tools->Boldify Model или Tools->Unboldify Model соответственно. Чтобы понять, для чего нужна болдификация модели, вспомним, что объекты модели Borland MDA сохраняет в реляционных базах данных, где существуют определенные ограничения — в нашем случае два класса объединены отношением «многие-ко-многим», поэтому для сохранения объектов этих классов в реляционных СУБД необходимо наличие дополнительной связующей таблицы. И если представить модель, содержащую десятки и сотни классов, то станет понятно, что неоспоримым преимуществом использования программного взаимодействия Borland MDA и Rational Rose является то, что все подобные связующие таблицы (точнее, классы для ассоциаций), присутствующие в отношениях «многие-ко-многим», будут сгенерированы автоматически и при создании модели об этом заботиться не нужно. То есть при импорте автоматически производится болдификация модели. Отметим, что принудительно болдифицировать модель можно и из встроенного текстового UML-редактора. В этом легко убедиться, если произвести в нем следующие действия:
В результате удаленный нами дополнительный класс ассоциации writesbyAuthor создастся вновь и модель снова станет корректной.
Вернемся в Rational Rose и несколько видоизменим нашу модель, а именно — будем использовать русскоязычные названия классов, атрибутов и ролей (рис. 5).
Рис. 5
Сохраним диаграмму классов в файле, например в librus.mdl. Теперь приступим к настройке модели. Для этого воспользуемся некоторыми тэг-параметрами модели, доступ к которым обеспечивается непосредственно из редактора Rational Rose. Кликнем дважды по классу «Автор», перейдем на закладку Bold и модифицируем следующие тэг-параметры (рис. 6):
Рис. 6
По умолчанию три вышеуказанных тэг-параметра имели вид T<Name>, <Name>, <Name> соответственно, что означает подстановку вместо <Name> имени класса модели. При этом в нашем случае генерировались бы русскоязычные идентификаторы, что, например, для идентификатора класса в Delphi является недопустимым.
Для решения проблемы автоматического преобразования имен модели из национальных кодировок в составе Bold имеются специальные средства, активизация которых управляется тэг-параметром проекта NationalCharConversion (рис. 2). Однако для их задействования в общем случае придется перекомпилировать исходные тексты Bold. Возможны и другие способы решения этой проблемы, например средствами Rational Rose — путем написания специального скрипта на языке BasicScript3. Естественно, в диаграмме классов можно также использовать только англоязычные имена, тогда редактирование вышеописанных тэг-параметров не потребуется.
Аналогично настроим тэг-параметры в спецификации класса «Книга» и присвоим им следующие значения:
Теперь перейдем к настройке ассоциации. Вызовем ее спецификацию, перейдем на закладку BoldA и изменим значение тэг-параметров следующим образом (рис. 7):
Рис. 7
Аналогично изменим значения тэг-параметров и для второй роли нашей ассоциации (рис. 8). Кроме того, в спецификации ассоциации перейдем на закладку Bold и изменим тэг-параметр LinkClassName на значение LinkNapisalNapisana для обозначения имени класса ассоциации.
Рис. 8
Теперь сохраним модель, вернемся в наше приложение Delphi, изменим свойство FileName компонента BoldUMLRoseLink1 на имя файла новой модели librus.mdl и произведем импорт. После этого проверим корректность модели (меню Tools->Consistency Check) и убедимся (рис. 9), что среда Borland MDA восприняла все сделанные изменения. При этом названия всех классов и атрибутов остались русскоязычными, хотя на панели дополнительных параметров (она может быть вызвана в Bold-редакторе по нажатии Ctrl+A) мы увидим измененные нами значения.
Рис. 9
Если повторить дальше действия по созданию простого приложения, описанные во второй части данной статьи, то можно легко увидеть, что в заголовках столбцов таблиц, а также на автоформах все обозначения станут русскоязычными, поскольку они берутся из названий классов, атрибутов и ролей модели приложения.
Для настройки тэг-параметров модели во встроенном редакторе Borland MDA следует выделить в дереве модели необходимый элемент (класс, атрибут, ассоциацию, роль) и выбрать в меню <Tools->Edit tagged values> (или просто нажать комбинацию клавиш <Ctrl+T>). При этом появится окно редактора параметров, на закладке <Bold> которого представлены все тэг-параметры, относящиеся к выбранному элементу модели (рис. 10). Для редактирования конкретного параметра необходимо выделить его в списке параметров и ввести новое значение в правом окне тэг-редактора. Кроме того, в тэг-редакторе можно удалять тэг-параметры или добавлять новые (пользовательские) параметры. Значения тэг-параметров доступны как во время проектирования приложения, так и программно, во время его выполнения.
Рис. 10
Как уже говорилось, наборы тэг-параметров привязаны к уровням иерархической структуры модели и для каждого уровня этой структуры имеется собственный набор таких параметров. В табл. 1 приведено краткое описание функционального назначения некоторых из них. Ряд параметров (DelphiName, ExpressionName и т.д.) был описан выше и в таблице не приводится.
Таблица 1. Состав основных тэг-параметров и их назначение
Тэг-параметр |
Назначение |
Элементы модели |
DefaultStringRepresentation | Определяет строковое представление для объектов класса, в частности при отображении на формах, автоформах, заголовках столбцов сеток (Grid). Задается OCL-выражением | Класс |
FileName | При генерации кода определяет имя файла, содержащего код операций класса | Класс |
InitalValue | Начальное значение, автоматически присваиваемое атрибуту при вызове конструктора объекта | Атрибут класса |
Derived | Признак того, что значение данного объекта является «вычисляемым» по данным других объектов. Правила для вычисления задаются либо OCL-выражением, либо в коде программы | Атрибут класса |
Visibility | Задает «видимость» объекта при генерации свойства класса в программном коде | Атрибут класса |
AttributeKind | Вид атрибута. Если значение равно BOLD, то атрибут является Bold-атрибутом, если значение равно Delphi, то Delphi-свойством. В последнем случае информация об объекте недоступна во время выполнения. По умолчанию значение равно BOLD | Атрибут класса |
Length | Длина атрибута. Имеет значение при генерации строковых полей таблиц некоторых СУБД, имеющих ограничения на длину строки. По умолчанию равна 255 | Атрибут класса |
AllowNULL | Указывает, допустимы ли значения NULL (пустые) для атрибута. По умолчанию равно False | Атрибут класса |
DerivationOCL | OCL-выражение для «вычисляемых» (derived) атрибутов (см. выше в этой таблице) | Атрибут класса |
DelayedFetch | Если TRUE, то указывает, что значения данного атрибута не должны вызываться из уровня данных во время загрузки объекта класса. Значения будут в этом случае загружены при первом обращении к атрибуту | Атрибут класса |
Persistent | Если TRUE, то значение атрибута будет сохраняться на уровне данных. Для derived-атрибутов этот параметр игнорируется | Атрибут класса |
Ordered | Если TRUE, то роль упорядоченная. При этом автоматически будет создаваться дополнительное поле для таблицы класса на противоположном конце ассоциации | Роль ассоциации |
DeleteAction | Определяет тип действия при попытке удаления связанного объекта. Принимает
значения: • Allow (разрешить) объект удаляется • Prohibit (запретить) — генерируется программное исключение • Cascade (каскадное удаление) — удаляются все связанные объекты |
Роль ассоциации |
Ряд тэг-параметров предназначен для настройки самого верхнего уровня иерархии — уровня модели. Некоторые из них представлены в табл. 2.
Таблица 2. Состав основных тэг-параметров модели
Тэг-параметр |
Назначение |
Значение по умолчанию |
ModelName | Определяет имя модели | "BusinessClasses" |
RootClass | Определяет имя суперкласса родоначальника всех классов модели. Если значение не присвоено, то в качестве суперкласса используется BusinessClassesRoot | "" |
GUID | Определяет глобальный уникальный идентификатор библиотеки типов (Type Library) при генерации интерфейсов. Если не назначен, генерируется случайный GUID | "" |
TypeLibVersion | Определяет версию библиотеки типов при генерации интерфейсов | "" |
UnitName | Определяет имя программного модуля, содержащего код для классов модели. Используется при генерации кода | "BusinessClasses" |
ImplemenationUses | Задает список модулей, разделенных запятой, для включения в IMPLEMENTATION — раздел генерируемого программного модуля | "" |
InterfaceUses | Задает список модулей, разделенных запятой, для включения в INTERFACE — раздел генерируемого программного модуля | "" |
UseGlobaLId | Определяет необходимость генерации GUID для каждого объекта, сохраняемого в БД | TRUE |
UseXFiles | Определяет необходимость генерации дополнительной таблицы, сохраняющей информацию обо всех объектах, когда-либо содержащихся в БД | TRUE |
UseModelVersion | Позволяет задать номер версии модели. Используется дополнительными средствами поддержки версий | 0 |
После настройки модели во встроенном редакторе есть возможность экспортировать ее в Rational Rose. Для этого, как и при импорте, необходимо настроить компонент BoldUMLRoseLink на имя файла модели и экспортировать модель путем нажатия на крайнюю левую кнопку со стрелкой на панели инструментов (рис. 4) или задать в меню <File->Export via Link>. В результате при необходимости произойдет автоматический запуск приложения Rational Rose.
Заметим, что Bold может сохранять и загружать информацию о модели не только в файлах формата Rational Rose (*.mdl), но и в собственном формате (*.bld), в формате XMI, а также в формате ModelMaker (*.mpb). Для использования этих возможностей необходимо из меню встроенного редактора задать File->Open File или File->Save File as…
В данной статье мы ознакомились с основами создания модели приложения в графическом UML-редакторе Rational Rose. Вполне очевидно, что при создании больших моделей графическое представление, безусловно, будет более наглядным по сравнению с текстовым описанием. Кроме того, как мы убедились, при импорте модели автоматически происходит ее болдификация, что также позволяет не задумываться при проектировании о второстепенных элементах. И наконец, простота доступа к тэг-параметрам Borland MDA из Rational Rose обеспечивает необходимую гибкость при настройках модели приложения. Эти преимущества позволяют предположить, что в следующих версиях в состав Borland MDA войдут собственные графические средства для создания моделей приложений. А мы будем двигаться дальше, и в следующей части статьи перейдем к рассмотрению основного уровня функционирования Borland MDA — объектного пространства.
Литература:
Дополнительная информация
За дополнительной информацией обращайтесь в компанию Interface Ltd.
INTERFACE Ltd. |
|