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


         

OCL и вычисляемые данные


рис. 3, справа вверху). Добавление столбца осуществляется аналогично тому, как это делается в стандартном компоненте Grid. Присвоим новому столбцу название «Книг» (оно будет отображаться в заголовке столбца). Однако на этом аналогия с традиционным компонентом заканчивается — как мы видим (Рис.3, слева) , в инспекторе объектов снова присутствует уже знакомое нам свойство «Expression». Введем в него вручную или с помощью OCL-редактора выражение «knigi ->size.asString». В данном случае оно означает, что необходимо взять значение роли ассоциации класса «Тематика» с названием «книги» (см. модель на рис.1), затем получить количество элементов этой роли — оператор «->size » и, наконец, преобразовать полученное выражение в строку «.asString». Тем самым мы решили поставленную задачу.

Аналогично, в компоненте BoldGrid6 добавим столбец для отображения количества книг, изданных конкретным издательством. В этом случае OCL-выражение, как легко убедиться, будет тем же самым, поскольку название роли такое же, что и в предыдущем случае.

И наконец, обратимся к компоненту BoldGrid5, отображающему названия стран. До этого момента в нем отображался всего один столбец, созданный по умолчанию и содержащий название страны. Предположим, что мы хотим получить дополнительную статистическую информацию по каждой стране, а именно — общее количество авторов, проживающих в этой стране, общее количество издательств, а также общее количество всех изданных в данной стране книг. Для этого добавим к сетке BoldGrid5 три новых столбца — с названиями «Авт», «Изд», «Книг». Для столбца «Авт» выражение OCL примет следующий вид: «avtory->size.asString», для столбца «Изд»: «izdatel_stva ->size.asString». Однако для последнего столбца подобное простое выражение не будет являться решением, поскольку алгоритм расчета суммарного количества книг оказывается более сложным. В самом деле, в нашей модели отсутствует ассоциация, непосредственно связывающая оба класса — «Страна» и «Книга», и это вовсе не считается недостатком модели, поскольку вся необходимая информация для решения поставленной задачи у нас есть.

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

«izdatel_stva->collect(knigi->size)->sum».

Здесь мы впервые сталкиваемся с операторами взятия коллекции «->collect» и оператором суммирования «->sum». Смысл их вполне ясен из рассмотренного примера.

Можно сказать, что во многом оператор коллекции схож с известным SQL-оператором группировки «group by». Стоит отметить, что оператор получения коллекции применяется в OCL-выражениях довольно часто. После запуска приложения можно убедиться, что оно приобрело новые, необходимые нам качества (рис. 4).

На этом мы завершаем описание основных возможностей OCL. На примере созданного приложения были продемонстрированы основные подходы к реализации взаимодействия бизнес-уровня и графического интерфейса пользователя. Мы убедились на практике, что при использовании Borland MDA эта среда обеспечивает принципиально новые возможности по формированию такого взаимодействия благодаря встроенной поддержке языка OCL. Так, любой визуальный элемент приобретает способность отображать практически любые данные, содержащиеся в объектах объектного пространства. В рассмотренном примере мы «заставили» метки и сетки отображать информацию из объектов, принадлежащих разным классам нашей модели, и даже получать новую информацию, которая непосредственно в модели не содержится (статистические данные по странам, издательствам и т.д.). Необходимо отметить, что формирование такого рода взаимодействий не ограничивается этапом разработки приложения. Любое OCL-выражение можно формировать и присваивать и во время выполнения программы, при этом OCL-запрос будет исполнен средой Borland MDA, поскольку OCL-интерпретатор включается в состав исполняемого exe-файла приложения, так же как и вся информация о модели.

Нельзя еще раз не отметить, что при создании приложения мы не писали код на языке Object Pascal, и не использовали язык SQL, но, тем не менее, смогли «завязать» все элементы нашей модели в одно целое. Использование OCL позволяет сделать приложение более платформенно-независимым, так как язык OCL сам является платформенно-независимым языком. На практике это означает, что бизнес-логика приложения, будучи один раз создана на языке OCL без кодирования на языках программирования, при переносе разработки на другую платформу полностью сохранится и может быть повторно использована. И это является еще одним преимуществом технологии Borland MDA.



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