BOLD - инструмент реализации MDA в Delphi


         

Создание модели приложения


рис. 3), позволяющего создавать UML-модели (в текстовом режиме), а также обеспечивающего реализацию основных функциональных возможностей Bold на этапе разработки приложения ? таких как экспорт и импорт моделей из других редакторов, модификация, верификация и тонкая настройка моделей, генерация баз данных и кода. На настоящем этапе мы используем его для создания модели нашего простого приложения.

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

В целях упрощения будем считать, что автор характеризуется именем (то есть фамилией), а книга ? названием. Кроме того, специально введем еще одно искусственное условие: у каждой книги может быть только один автор.

Таким образом, после некоторой дальнейшей конкретизации неформально будущую модель приложения можно описать следующим набором бизнес-правил:

  • описываемая предметная область включает множество авторов и множество книг;
  • автор однозначно идентифицируется текстовым атрибутом ? именем;
  • книга однозначно описывается текстовым атрибутом ? названием;
  • автор может написать много книг;
  • книга может быть написана только одним автором.

Назначение UML-редактора ? преобразовать неформальное описание бизнес-правил в формальную модель на языке UML (рис. 3).

Теперь можно приступить к созданию модели. Правой кнопкой мыши кликнем на пункте LogicalView в верхней части левой панели редактора и во всплывающем меню выберем пункт NewClass (создание нового класса). Проделаем эту операцию еще два раза (рис. 4).

Новые классы по умолчанию получили имена NewClass, NewClass_1, NewClass_2. Для удобства дальнейшей работы переименуем их. Для этого в левой панели редактора выберем курсором мыши пункт NewClass, перейдем в правую панель редактора и введем в поле Name имя нашего класса ? Author. Второму классу присвоим имя Book, а третьему ? имя AuthorBook. После этого у нас должна получиться модель, представленная на рис. 5.

Теперь создадим атрибуты наших классов. Автор книги, как мы договорились раньше, описывается в нашей модели своим именем, а книга ? названием. Следовательно, класс Author будет иметь один атрибут ? назовем его aname, класс Book будет иметь также единственный атрибут, которому дадим название btitle. Класс AuthorBook пока трогать не будем. Для создания атрибутов выберем в левой панели редактора нужный класс, кликнем правой кнопкой мыши и из всплывающего меню выберем пункт New Attribute. Создадим по одному новому атрибуту для классов Author и Book, а затем раскроем дерево модели на левой панели редактора, как показано на рис. 6.

По умолчанию новые атрибуты получили имена (каждый в своем классе) ? NewAttribute. Переименование атрибутов осуществляется так же, как и переименование классов (рис. 7).

Теперь вспомним о третьем классе, созданном нами, ? AuthorBook. В принципе, как будет показано в дальнейшем, для такой простой модели, как наша, совсем необязательно создавать этот класс вручную ? это можно сделать автоматически. Но на данном этапе этот класс будет полезен для иллюстрации возможностей описываемой технологии. Смысл создания этого класса ? обеспечение связи между авторами и книгами, поэтому AuthorBook является не обычным классом, а носителем для ассоциации между классами Author и Book. Однако прежде чем определять этот класс в качестве носителя ассоциации, необходимо создать саму ассоциацию. Для этого поступаем так же, как и при создании новых классов: выбираем пункт LogicalView в дереве модели на левой панели редактора, после чего нажимаем правую кнопку мыши, но из всплывающего меню теперь выбираем пункт New Association, затем раскрываем дерево модели (рис. 8).

В правой панели редактора в окошке с именем класса мы видим, что имя класса ? носителя для новой ассоциации (ей автоматически присвоено имя NewAssociation) отсутствует (<none>). Из выпадающего списка в этом окошке назначим для класса ассоциации имя ранее созданного нами класса ? AuthorBook. Далее в дереве модели мы видим, что созданная ассоциация имеет два подпункта: AssociationEnd0 и AssociationEnd1, представляющие собой автоматически созданные названия для ролей нашей ассоциации. Определим эти роли: выделим роль ассоциации AssociationEnd0, в правой панели редактора введем в поле Name имя роли byAuthor, а в поле Class выберем из выпадающего списка класс Author; установим значение поля Multiplicity в «1..1» и снимем флажок Embed (рис. 9).

Затем выделим роль ассоциации AssociationEnd1, в правой панели редактора введем в поле Name имя роли writes, а в поле Class выберем из выпадающего списка класс Book. Далее установим значение поля Multiplicity в «1..*» и снимем флажок Embed (рис. 10).

Теперь немного порассуждаем, что именно мы только что сделали с ролями нашей ассоциации и почему. Как говорилось выше, в нашей модели принято упрощающее предположение о том, что книга может быть написана только одним автором. Именно по этой причине мы установили свойство Multiplicity у роли byAuthor в значение «1..1» (см. рис. 9), то есть один и только один (автор). Однако наша модель по умолчанию допускает, что автор может написать много книг, и поэтому на другом конце нашей ассоциации writes свойству Multiplicity назначено значение «1..*» (см. рис. 10), другими словами, одна, две.. много (книг). Теперь осталось только понять, почему «1..1» относится именно к автору, а «1..*» ? к книгам. Но ведь эту привязку сделали мы сами, когда назначали классы для ролей!



Содержание раздела