Bold - инструмент реализации MDA в Delphi. Часть 4. Создание модели

Константин Грибачев

Часть 3

Оглавление

Rational Rose как средство разработки моделей приложений для Borland MDA

В предыдущей части были рассмотрены основные функции модели приложения в 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 по запросу из среды Delphi;
  • импорт UML-моделей и тэг-параметров из Rational Rose в Bold;
  • экспорт UML-моделей и тэг-параметров из Bold в Rational Rose;
  • доступ к тэг-параметрам Bold при разработке модели в Rational Rose;
  • адаптация Rational Rose к конкретным версиям Bold.

Перечисленные функции позволяют на практике объединить удобные выразительные средства графического интерфейса Rational Rose с возможностью реализации тонкой настройки модели приложения в среде Borland MDA.

Настройка Rational Rose

Перед созданием модели в редакторе 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 эту настройку следует повторять.

Создание модели в Rational Rose1 и ее импорт в Borland MDA

Во второй части этой статьи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 из модели;
  • проверить корректность модели (меню Tools->Consistency Check), получив при этом сообщение об ошибке;
  • отменить болдификацию (меню Tools-Unboldify Model);
  • сделать болдификацию (меню Tools-Boldify Model).

В результате удаленный нами дополнительный класс ассоциации writesbyAuthor создастся вновь и модель снова станет корректной.

Настройка тэг-параметров модели в Rational Rose

Вернемся в Rational Rose и несколько видоизменим нашу модель, а именно - будем использовать русскоязычные названия классов, атрибутов и ролей (рис. 5).

Рис. 5

Сохраним диаграмму классов в файле, например в librus.mdl. Теперь приступим к настройке модели. Для этого воспользуемся некоторыми тэг-параметрами модели, доступ к которым обеспечивается непосредственно из редактора Rational Rose. Кликнем дважды по классу «Автор», перейдем на закладку Bold и модифицируем следующие тэг-параметры (рис. 6):

Рис. 6

  • DelphiName - присвоим значение TAuthor; этот тэг-параметр отвечает за преобразование имени класса модели в идентификатор класса, используемый в среде Delphi;
  • ExpressionName - присвоим значение Author; этот тэг-параметр отвечает за преобразование имени класса модели в имя объекта, используемое для обозначения класса в выражениях на языке OCL;
  • TableName - присвоим значение Author; этот тэг-параметр отвечает за преобразование имени класса модели в имя таблицы СУБД, используемой для хранения информации об объектах данного класса.

По умолчанию три вышеуказанных тэг-параметра имели вид T<Name>, <Name>, <Name> соответственно, что означает подстановку вместо <Name> имени класса модели. При этом в нашем случае генерировались бы русскоязычные идентификаторы, что, например, для идентификатора класса в Delphi является недопустимым.

Для решения проблемы автоматического преобразования имен модели из национальных кодировок в составе Bold имеются специальные средства, активизация которых управляется тэг-параметром проекта NationalCharConversion (рис. 2). Однако для их задействования в общем случае придется перекомпилировать исходные тексты Bold. Возможны и другие способы решения этой проблемы, например средствами Rational Rose - путем написания специального скрипта на языке BasicScript3. Естественно, в диаграмме классов можно также использовать только англоязычные имена, тогда редактирование вышеописанных тэг-параметров не потребуется.

Аналогично настроим тэг-параметры в спецификации класса «Книга» и присвоим им следующие значения:

  • DelphiName - присвоим значение TBook;
  • ExpressionName - присвоим значение Book;
  • TableName - присвоим значение Book.

Теперь перейдем к настройке ассоциации. Вызовем ее спецификацию, перейдем на закладку BoldA и изменим значение тэг-параметров следующим образом (рис. 7):

Рис. 7

  • ColumnName - присвоим значение Napisal; этот тэг-параметр задействуется Borland MDA в случае единичной кратности роли для обозначения названия столбца таблицы БД;
  • ExpressionName - присвоим значение Napisal;
  • DelphiName - присвоим значение Napisal;
  • Embed - присвоим значение False; этот тэг-параметр определяет «встраивание» роли отношения в класс. Встраиваться могут только роли с единичной кратностью. Для понимания этого проведем аналогию с реляционными СУБД, где в таблицах, связанных отношением «один-ко-многим», в подчиненной таблице должно содержаться («встраиваться») ключевое поле, связанное с уникальным ключом мастер-таблицы. Если два класса связаны ассоциацией, обе роли которой имеют кратность больше 1, то, независимо от значения тэг-параметра embed, Bold обеспечит создание дополнительного связующего класса, как мы уже убедились. Поэтому в данном случае мы могли и не изменять значение этого параметра;
  • DeleteAction - присвоим значение Cascade; с этим тэг-параметром мы уже имели дело, когда создавали простое приложение. Он отвечает за правила удаления подчиненных объектов при удалении главного.

Аналогично изменим значения тэг-параметров и для второй роли нашей ассоциации (рис. 8). Кроме того, в спецификации ассоциации перейдем на закладку Bold и изменим тэг-параметр LinkClassName на значение LinkNapisalNapisana для обозначения имени класса ассоциации.

Рис. 8

Теперь сохраним модель, вернемся в наше приложение Delphi, изменим свойство FileName компонента BoldUMLRoseLink1 на имя файла новой модели librus.mdl и произведем импорт. После этого проверим корректность модели (меню Tools->Consistency Check) и убедимся (рис. 9), что среда Borland MDA восприняла все сделанные изменения. При этом названия всех классов и атрибутов остались русскоязычными, хотя на панели дополнительных параметров (она может быть вызвана в Bold-редакторе по нажатии Ctrl+A) мы увидим измененные нами значения.

Рис. 9

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

Настройка тэг-параметров модели во встроенном UML-редакторе

Для настройки тэг-параметров модели во встроенном редакторе 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

После настройки модели во встроенном редакторе есть возможность экспортировать ее в 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 - объектного пространства.

Литература:

  1. Елманова Н., Трепалин С., Тенцер А. Delphi 6 и технология COM. СПб: Питер, 2002.
  2. Леоненков А. UML. СПб: БХВ-Петербург, 2001.

Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=1747