Проектування додатків за допомогою Bold for Delphi і Model Maker (документація), Документація, Програмування, статті

Введення
Model Maker і Bold for Delphi. Загальні відомості, призначення, області використання.
Model driven development з використанням Model Maker і Bold for Delphi
Етап 1. Виділення сутностей предметної області, побудова UML-діаграми класів
Етап 2. «Переклад» моделі в об’єкти мови програмування Delphi.
Етап 3. Написання GUI.

Реалізація відносини один-до-багатьох
Реалізація відносини багато до багатьох
Резюме

Введення


Найбільш помітними нововведеннями в Delphi 7 стала поява двох нових інструментів, Model Maker і Bold for Delphi. Дані інструменти дозволяють за допомогою Delphi здійснювати не тільки кодування, а й, що дуже важливо, проектування додатків.


Природним бажанням кожного програміста є дослідження нових можливостей використовуваної ним середовища розробки. У даній статті я хочу поділитися результатами своїх експериментів з Model Maker і Bold. Як виявилося, ці інструменти дозволяють вивести розробку додатків в Delphi на якісно новий рівень.


Model Maker і Bold for Delphi. Загальні відомості, призначення, області використання.


Model Maker – це інструмент case-проектування компанії Model Maker tools BV. Даний продукт включений до складу Delphi 7, хоча може використовуватися і окремо. Основними можливостями Model Maker є:



Використання Model Maker робить можливим створення програми від етапу проектування і до готового вихідного коду без застосування будь-яких додаткових case-інструментів.


Можна виділити дві основні області застосування продукту:



Bold for Delphi (існує також версія для C + + Builder), в свою чергу, – це технологія швидкої розробки додатків на основі UML-моделей. Цей продукт створений компанією BoldSoft, Нещодавно придбаної Borland. Bold дозволяє на підставі UML-опису бізнес-процесів і бізнес-правил швидко і якісно спроектувати і з легкістю модифікувати інформаційну систему (ІС). Само UML-проектування виконується за допомогою стороннього case-інструмента, а створена UML-модель імпортується в Bold. На сьогоднішній день Bold може імпортувати моделі з Rational Rose і Model Maker.


Яким же чином використання Model Maker і Bold може удосконалити процес розробки ПЗ? Для відповіді на це питання розглянемо спочатку традиційний цикл створення програмного продукту.


Традиційна модель розробки додатку баз даних включає в себе наступні етапи:



  1. Вивчення предметної області. Виділення сутностей предметної області, їх атрибутів і зв’язків між ними.
  2. Проектування бази даних. На даному етапі проектується набір таблиць і реляційних зв’язків для зберігання кожної сутності.
  3. Створення графічного інтерфейсу користувача для управління сутностями.
  4. Реалізація бізнес-правил в збережених процедурах на сервері або в клієнтському додатку.

Порядок проходження етапів може бути трохи іншим, але суть при цьому не змінюється.


Bold пропонує вдосконалену модель, що дозволяє програмісту працювати на рівні подання сутностей предметної області як класів, при цьому необхідні структури для зберігання сутностей в БД створюються автоматично, без додаткових зусиль програміста. Крім того, створюються та метадані сутностей, що дозволяють надалі швидко вносити зміни і доповнення в модель системи. Даний спосіб розробки програми отримав назву «Model driven development», що можна перекласти як «розробка на основі моделі».


Модель програми в Bold розділена на три шари:



Спробуємо розглянути на прикладі процес розробки, заснованої на моделі.


Model driven development з використанням Model Maker і Bold for Delphi


Як приклад використання розробки на основі моделі спроектуємо невеликий додаток – найпростіший телефонний довідник, який буде містити всього два поля – ПІБ абонента і його телефонний номер.


Етап 1. Виділення сутностей предметної області, побудова UML-діаграми класів


Мета етапу : Виділити сутності предметної області, їх атрибути та взаємозв’язку.


Кінцевий результат: UML-діаграма класів.


В результаті побіжного аналізу задачі можна виділити сутність «Абонент» – особа, інформацію про телефони якого потрібно зберігати. У нашому прикладі досить зберігати ПІБ абонента та номер його телефону.


Після проведення аналізу (або, точніше, першою його ітерації) можна приступати до побудови UML-діаграми класів, що представляють сутності. Існує багато інструментів, призначених для побудови UML-діаграм. Найбільш популярними з них є Rational Rose, Power Designer, Model Maker. У даній статті я не буду обговорювати переваги і недоліки кожного з цих продуктів. Свій вибір я зупинив на Model Maker з кількох причин:



Для побудови UML-діаграми класів c допомогою Model Maker слід запустити Model Maker :). Зробити це можна або з IDE Delphi (ModelMaker / Run ModelMaker), або через кнопку Пуск / Програми / … На екрані з’явиться головне вікно програми (див. малюнок 1).



Рисунок 1. Головне вікно Model Maker.


Вікно містить декількох робочих областей.


У лівому верхньому кутку розташована панель вибору режиму роботи. Вона містить такі елементи:



Під панеллю режимів роботи розташоване вікно перегляду членів класу. Використання його навряд чи викличе якісь труднощі.


Праворуч вгорі розташована основна панель інструментів, що складається з набору закладок. Частина вікна – це робоча область, яка змінює свій вигляд в залежності від обраної закладки основної панелі інструментів.


Створимо новий проект. Проект – це набір UML-діаграм, об’єднаних спільним завданням. Різні UML-діаграми дозволяють спроектувати різні аспекти роботи створюваного додатка. Початкову частину проектування ми виконали «неформально», описавши загальні вимоги до додатка в текстовому вигляді, тому відразу переходимо до створення діаграми класів. Для включення в проект діаграми класів необхідно перейти на закладку Diagrams панелі режимів роботи і натиснути на іконку Add class diagram. В основній панелі інструментів потрібно перейти на закладку Diagram Editor. Результат виконання даних дій представлений на малюнку 1. Тепер можна починати власне проектування класу абонента.


На закладці Diagrams натиснемо кнопку Add Class to Model. У діалозі, наведеному на малюнку 2, введемо ім’я класу TAbonent.



Рисунок 2.


Від якого класу буде успадкований TAbonent, не грає ролі, так як далі Bold все одно міняє батька на інший базовий клас. Після натискання кнопки «OK» новий клас з’явиться на діаграмі і в списку класів. Вибравши клас на діаграмі, додамо дві властивості – AbonentName і AbonentPhone. Самим простий спосіб зробити це – використання кнопки додавання властивості класу (Add property) у вікні перегляду членів класу. При натисканні на кнопку з’являється діалог додавання властивості (малюнок 3).



Рисунок 3.


Обидва властивості мають тип AnsiString і прямий доступ на запис (у групі перемикачів Write access треба вибрати перемикач Field). Все, проектування нашого класу завершено.


Етап 2. «Переклад» моделі в об’єкти мови програмування Delphi.


Мета етапу: Отримати набір класів на використовувану мову програмування (Delphi), відповідний UML-діаграмі класів, отриманої на етапі 1.


Кінцевий результат : Набір класів, який реалізує UML-діаграму.


Для зберігання і використання моделі в Bold призначений компонент TBoldModel, розташований на закладці BoldHandelers IDE Delphi. Розмістимо даний компонент (втім, як і інші) на головній формі нашого додатки. Для імпорту діаграми класів з Model Maker призначений компонент TBoldUMLMMLink. Розмістивши цей компонент на формі, встановимо значення його властивості BoldModel рівним BoldModel1 (ім’я компонента BoldModel), а властивості FileName – файлу проекту Model Maker, що містить нашу діаграму.


Для зберігання моделі нам потрібно реляційна БД і додаткові компоненти, що забезпечують запис / витяг моделі. В якості сервера реляційної БД я використовував Interbase. За запевненням Borland, можна використовувати і інший сервер БД. За збереження і завантаження моделі в базу відповідає компонент BoldPersistenceHandleDB. Розмістимо його на формі додатку. Встановимо необхідні властивості даного компонента.


Тепер можна імпортувати діаграму класів. Завантажимо редактор моделей Bold. Для цього достатньо двічі клацнути мишею на компоненті TBoldModel. Зовнішній вигляд вікна редактора наведений нижче.



Рисунок 4.


Для імпорту моделі необхідно скористатися кнопкою Import via Link (друга зліва на панелі інструментів). Після імпорту в дереві перегляду моделі з’явиться вузол з найменуванням TAbonent, що має предком клас BusinessClassesRoot, а не TObject, як це було встановлено при створенні діаграми класів в Model Maker. Пов’язано це з тим, що Bold буде обробляти і зберігати інформацію як про сам класі, так і про створені користувачем примірниках класу. Стандартні класи VCL не розраховані на таке використання і тому не можуть виступити безпосередніми предками для класів моделі.


Можна також описати бізнес-об’єкти, використовуючи тільки редактор моделей Bold, але використання UML-діаграм є, на мій погляд, набагато більш зручним.


Після імпорту необхідно подбати про збереження моделі в базу даних. На головній формі програми розмістимо наступні компоненти і встановимо їх властивості:



Таким чином, ланцюжок компонентів для збереження моделі показана на малюнку 5.



Рисунок 5.


Такий поділ дозволяє зробити процес збереження моделі більш гнучким і не залежних від БД (а в загальному випадку БД може бути замінена іншим способом зберігання інформації).


Після розміщення і налаштування компонентів, що відповідають за збереження моделі, повернемося в редактор моделі і натиснемо на його панелі кнопку Generate database. При цьому модель буде перевірена на коректність і збережена в БД. Крім цього, потрібно натиснути кнопку Generate code для створення службових модулів коду, створюваних Bold. Ці модулі автоматично включаються в проект і в більшості випадків ніяк не проявляють себе.


Тепер можна переходити до створення користувальницького інтерфейсу роботи з сутностями БД.


Етап 3. Написання GUI.


Мета етапу: створення GUI, що дозволяє працювати з об’єктами предметної області у зручній та зрозумілій формі.


Кінцевий результат: клієнтська частина програми.


Компоненти для користувача інтерфейсу розташовані на закладці Bold Controls. Більшість з них аналогічно «звичайним» data-aware компонентам.


Для роботи зі списком абонентів на головній формі програми розмістимо компоненти BoldGrid (аналог DBGrid) і BoldNavigator (аналог DBNavigator). Всі компоненти користувальницького інтерфейсу мають властивість BoldHandle. Дана властивість посилається на компонент-джерело даних про сутності моделі.


Компоненти-джерела даних моделі використовують мову опису об’єктів (Object Constraint Language – OCL). Ця мова призначений для опису роботи з даними UML моделі Bold. Необхідність використання OCL обумовлена ​​тим, що можливостей класичних об’єктів для управління екземплярами сутностей та їх зв’язками на етапі run-time виявляється явно недостатньо. Крім того, OCL дозволяє нам мислити на рівні атрибутів і зв’язків об’єктів моделі, а не класів, їх реалізують, що приховує особливості використовуваної мови програмування і дозволяє повністю зосередитися на бізнес логіці.


В якості компонента – джерела даних використовуємо BoldListHandle, що дозволяє працювати зі списком сутностей одного типу (в нашому випадку абонентів). Розмістимо компонент BoldListHandle1 на головній формі додатки. Для роботи OCL необхідно отримати метаінформацію моделі на етапі розробки. Дану інформацію надає компонент TBoldSystemHandle, який ми також покладемо на головну форму. Властивість RootHandle (джерело метаінформації) компонента BoldListHandle1 встановимо рівним BoldSystemHandle1. А властивість AutoActivate BoldSystemHandle1 в true. Тепер ми готові описати мовою OCL, яку саме інформацію ми хочемо отримати. Для цього подвійним клацанням миші на BoldListHandle1 розкриємо OCL-редактор.



Малюнок 6.


Вікно редактора поділене на три основні частини:



У списку об’єктів двічі клацнемо на класі TAbonent, сутності якого нам необхідно відображати користувачеві. При цьому буде виведений список OCL-операторів для роботи з даним класом. Подвійним клацанням на елементі. allInstances зазначимо, що ми хочемо отримати всі екземпляри цієї сутності. При цьому в полі введення з’явиться вираз OCL TAbonent.allInstances. Звичайно ж, його можна було ввести руками, але описаний вище спосіб зручніше і швидше. Тепер можна закрити редактор, натиснувши кнопку OK.


Встановимо властивість BoldHandle компонентів BoldGrid1 і BoldNavigator1 рівним BoldListHandle1, щоб вони працювали зі списком абонентів. У контекстному меню компонента BoldGrid1 виберемо пункт «Create default columns », при цьому буде згенеровано список колонок, відповідних полям сутності абонента. Подвійним клацанням миші на BoldGrid1 викличемо редактор колонок сітки і встановимо русифіковані заголовки стовпців AbonentName і AbonentPhone. Наше додаток готове до перовому запуску.


Запустимо програму і введемо першого абонента. Тепер спробуємо закрити програму. Ось тут нас підстерігає маленька неприємність у вигляді повідомлення “Destroying system with dirty objects” (це текст повідомлення за умовчанням, його можна, і навіть потрібно поміняти на більш осмислене). Дане повідомлення говорить про те, що створені нами нові екземпляри сутностей не збережені в базі. Тобто Bold після завантаження сутностей з БД не звертається щоразу до бази при створенні нового екземпляра сутності або модифікації існуючого примірника, і при спробі закрити програму чесно попереджає, що зміни не збережені. Більш того, якщо ми повторно запустимо програму, то не побачимо введених нами даних. Для збереження змін необхідно викликати BoldSystemHandle1.System.UpdateDatabase. Даний виклик найзручніше помістити в обробник OnClose головної форми. Ну от, перше Bold-додаток готово.


Реалізація відносини один-до-багатьох


Ще на самому початку розгляду прикладу прозорливий читач напевно вигукнув: «Що за нісенітниця? Кожен абонент може мати кілька телефонних номерів! »Але не поспішайте кидати в мене помідорами :). Якщо Додати в модель окрему сутність «Телефон», то проблема буде вирішена. При цьому факт володіння одного абонента кількома телефонними номерами означає наявність зв’язку один до багатьох між сутностями «Абонент» і «Телефон». Ще більш прозорливий читач знову потягнеться за згаданим овочем, так як в реальному житті і один телефон може належати кільком абонентам (офісний телефон). Але не поспішайте, доберемося й до цього випадку. А поки будемо вважати, що абонент має один і більше телефонів, але телефон завжди належить одному абоненту.


Внесемо відповідні зміни в діаграму класів програми. У класі TAbonent додамо властивість-посилання на клас TPhone. Ім’я даного властивості – Phone. Додамо властивість за допомогою кнопки Add Property to model. На закладці Vizualization встановимо стилі відображення обох кінців зв’язку в Undefined, щоб уникнути відображення стрілок. Source role – owned, Source Multiplicity – 1, Target role – have phone, Target multiplicity – 1 .. *. Діаграма класів при цьому буде виглядати так, як показано на малюнку 7



Малюнок 7.


При додаванні властивості OwnerAbonent лінію, що сполучає класи на діаграмі, слід починати з класу TPhone і завершувати на класі TAbonent. Встановлена ​​зв’язок означає, що клас TAbonent має один або кілька примірників TPhone, а TPhone завжди належить лише одному TAbonent.


Збережемо дану модель і імпортуємо її в редактор моделі Bold. На малюнку 8 наведено фрагмент зміненої моделі у вікні редактора.



Рисунок 8.


Що ж змінилося в моделі? Як бачимо, з’явився клас TPhone із заданими нами атрибутами. А також з’явився новий вид об’єктів моделі Associations. У ньому описані взаємозв’язку класів. Існують дві позиції асоціації Phone, що описують зв’язок сутностей «Абонент» і «Телефон». Кожна позиція відповідає одному кінця зв’язку. Не забудьте згенерувати вихідний код і базу даних заново, так як модель змінилася.


Тепер залишилося лише подбати про графічний інтерфейс користувача. Спочатку приведемо в порядок Grid для відображення сутності «Абонент», а саме – видалимо звідти стовпець, що відповідає номеру телефону, так як номер телефону тепер винесено в окрему сутність. Потім на форму покладемо ще один BoldGrid і BoldNavigator для роботи з сутністю «Телефон», і розмістимо на формі ще один компонент TBoldListHandle (BoldListHandle2) для роботи з OCL з даною сутністю.


Властивість RootHandle для BoldListHandle2 встановимо рівним BoldListHandle1. Саме це визначає, що другий список буде відображати телефони вибраного абонента. В OCL-редакторі задамо вираз have_phone, означає, що нам потрібно відображати елементи асоціації, що вказують на телефони абонента. Для BoldGrid2 і BoldNavigator2 (відображають телефони) властивість BoldHandle встановимо рівним BoldListHandle2. В BoldGrid2 згенеруємо колонки за умовчанням і поставимо їм російські заголовки. Ну ось і все, можна запускати програму.


Реалізація відносини багато до багатьох


Наведемо наш проект до ще більш реалістичного вигляду. Раніше ми вважали, що один телефон може належати тільки одному абоненту. Насправді це не зовсім так. Наприклад, по одному офісному телефону можуть розташовуватися кілька абонентів. Тобто абонент і телефон пов’язані ставленням багато до багатьох. Немає нічого простіше, ніж реалізувати дану модель в Bold.


Спочатку внесемо корективи в модель класів. На закладці Vizualiztion задамо для зв’язку відношення багато до багатьох і імена ролей have phones і have abonents відповідно для класів TAbonent і TPhone. Ім’я властивості класу TAbonent змінимо на OwnedPhones, щоб воно більш точно відображало змінилося призначення. Виправлена ​​діаграма буде мати вигляд, показаний на малюнку 9.



Рисунок 9


Імпортуємо модель в Bold. В редакторі моделі Bold вона буде виглядати так, як показано на малюнку 10.



Малюнок 10.


Зверніть увагу на те, як була згенерована асоціація. Bold представив відношення “багато до багатьох” через окремий клас-посередник OwnedPhones. Якщо вибрати властивості асоціації, можна побачити, що асоціація є екземпляром класу OwnedPhones.


Нам залишається тільки додати користувальницький інтерфейс для роботи зі зміною моделлю. Як приклад я сконструював форму, зображену на малюнку 11.



Рисунок 11


Однак для введення вона не дуже зручна, тому що при введенні телефонів абонента відбувається створення нових об’єктів сутностей “телефон” і, навпаки, при введенні абонентів для телефонів створюються нові абоненти. Таким чином, ми не можемо присвоїти один телефон багатьом абонентам або одного абонента кільком телефонами.


Для вирішення даної проблеми ми розташуємо на формі додатковий компонент TBoldPlaceableAFP з закладки Bold Misc. Даний компонент дозволяє на етапі виконання автоматично конструювати форми, що працюють з елементами сутностей. Для BoldGrid виклик автоформи здійснюється за подвійним клацанням мишею. На малюнку 12 наведено вид автоформи для роботи з абонентом.



Малюнок 12.


Зверніть увагу на стрілку у правому нижньому куті. Перетягування даної стрілки на Grid з абонентами телефонного номера додає даного абонента під власники телефону. Аналогічно діє і стрілка на автоформу телефонів.


Резюме


Отже, не написавши жодного рядка коду, ми створили достатньо функціональний телефонний довідник. Які висновки ми можемо зробити?



  1. Програмування за допомогою Bold вимагає дещо більшою фундаментальності в підготовці програміста. Він повинен почати думати сутностями предметної області та оволодіти базовими знаннями архітектури Bold.
  2. Зв’язка Model Maker і Bold дозволяє здійснювати наскрізне проектування додатки в Delphi, починаючи від етапу розробки концептуальної діаграми сутностей і закінчуючи кодуванням програми.
  3. Застосування Bold в Росії може стримуватися необхідністю локалізації програми. Питання локалізації вимагають окремого дослідження за рамками цієї статті.

Дана стаття є лише введенням у використання Model Maker і Bold. Обмежитися розглядом випадку програмування мишкою означало б лише поверхово висвітлити питання, пов’язані з використанням даних продуктів. У наступних статтях ми торкнемося більш глибоких аспектів роботи з ними.


2-а частина статті


  • Детальніше про продукти Borland
  • Придбати продукти компанії Borland в електронному магазині ITShop.ru
  • Авторизовані курси Borland
  • Курси навчання по продуктах компанії Borland
  • Звернутися в Interface Ltd. за додатковою інформацією / з питання придбання продуктів

  • Схожі статті:


    Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

    Коментарів поки що немає.

    Ваш отзыв

    Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

    *

    *