Bold for Delphi Створення активної моделі структури – реальність

Bold for Delphi – Це об'єктно-орієнтоване середовище розробки додатків, яка отримала широке визнання, використовує загальноприйняті стандарти і дозволяє розробникам швидко створювати та супроводжувати бізнес-додатки. Можливо, Bold for Delphi підходить не всім розробникам, але в області проектування і супроводу додатків це середовище розробки є великим кроком вперед далеко за межі заснованої на компонентах архітектури більшості Delphi-додатків. Сучасному розробнику Bold for Delphi дає інструменти, які відносяться до наступного етапу розвитку засобів розробки бізнес-додатків. Є також версія для C++Builder (Bold for C++).


Наріжний камінь проектування додатків – діаграми класів універсального мови моделювання UML (Unified Modeling Language) 1.3. Це одна з головних характеристик Bold for Delphi. Стандарти мови UML, призначеного для об'єктно-орієнтованого проектування та аналізу, виробила група OMG (Object Management Group), провідна організація у галузі стандартів розробки об'єктно-орієнтованого програмного забезпечення для підприємств. Моделі класів на зазначених діаграмах вбудовуються в додаток і використовуються компонентами Bold for Delphi для управління поведінкою програми.


Використовувані в Bold for Delphi моделі класів UML можна створювати різними способами. Більшість працюючих з Bold for Delphi розробників використовують Rational Rose (Http://www.interface.ru/rational/rosemain.htm), засіб розробки UML компанії Rational Software Corporation . Моделі UML також можуть бути повністю описані в Bold for Delphi з використанням редактора моделей Bold UML Model Editor, редактора компонентів, пов'язаного з компонентом TBoldModel, хоча цей підхід не настільки наочний, як у Rose. Компанія BoldSoft також оголосила про планах підтримки інших засобів розробки, включаючи ModelMaker. Крім того, Bold підтримує імпорт моделей, описаних з використанням XMI – Стандарту обміну метаданими XML. До моменту публікації цього огляду вже повинна бути підтримка експорту інформації про модель у формат XMI.


Крім підтримки моделей класів UML, Bold for Delphi широко використовує версію 1.1 мови виразів OCL (Object Constraint Language, мова обмежень об'єктів), схожого на мову SQL, але створеного спеціально для навігації по об'єктах і отримання даних з об'єктів. Наприклад, численні компоненти Bold містять властивість Expression, за допомогою якого команди мови OCL можуть визначати, як ці компоненти повинні обробляти свої дані. Крім того, редактор властивості Expression в OCL дозволяє просто і швидко створювати і перевіряти вираження OCL.


"Таке поєднання стандартних технологій зробило Bold for Delphi лідером наступної хвилі засобів розробки програмного забезпечення ", – пояснює Хенрік Джонделл (Henrik Jondell), генеральний та комерційний директор компанії BoldSoft. Продукт Bold for Delphi завоював 11-й щорічний приз Software Development Productivity Award журналу Software Development Magazine. Компанія Borland включила Bold for Delphi, Поряд з Rational Rose, у свій потужний продукт під назвою Borland Enterprise Studio for Windows.


Інший підхід до розробки додатків


В основі Bold for Delphi лежить архітектура нового покоління, яку найточніше можна назвати керованою моделлю (MDA, model-driven architecture). Використовуючи архітектуру MDA, розробник творить на більш високому рівні, ніж більшість використовують Delphi розробників. Зокрема, більшість Delphi-розробників проектують на основі компонентів, що є повторного використання об'єктами, які пов'язані між собою властивостями і формують додаток. Перевагою об'єктно-орієнтованої розробки на основі компонентів є багаторазове використання об'єктів, а її недоліком – слабка увага до взаємодії об'єктів у додатку. "Що ще гірше, – зауважує Джонас Хогстрем (Jonas Hogstrom), головний розробник компанії BoldSoft. – Використовувана в Delphi модель компонентів, не має нічого спільного з об'єктами домену та бізнес-об'єктами. Зазвичай об'єкти Delphi – це компоненти графічного інтерфейсу користувача, такі як TDBEdit або TDataSet, які не є бізнес-об'єктами тому, як об'єкт TPerson. "


Архітектура MDA, яка є розширенням об'єктно-орієнтованої розробки, визначає відносини між об'єктами і їх взаємодія. У Bold це описується за допомогою моделі класів UML. Розглянемо цю модель у Rational Rose на рис. 1. Ця модель визначає абстрактний клас з ім'ям Actor і єдиною властивістю assets (активи). Конкретні класи Person і Organization є відгалуженнями класу Actor. Є також третій клас з ім'ям Family (Сім'я). На цій діаграмі класів також є дві асоціації: members (члени) і familyMembers (члени сім'ї). Кожна особа (Person) може бути членом кількох організацій, або не входити ні в одну з організацій, а організація може складатися з будь-якого кількість членів. Таким же чином і особа може належати до будь-якої сім'ї, або не належати ні до якій сім'ї, а сім'я може складатися з будь-якого, в тому числі нульового кількості членів.

Рис. 1. Діаграма класів у Rational Rose.


Після імпорту цієї моделі в редактор моделей Bold UML Model Editor, класи, їх члени і асоціації стають частиною програми. Якщо діаграму класів (модель) назвати People, то в редакторі Bold UML Model Editor ця модель буде виглядати так, як показано на рис. 2.

Рис. 2. Модель класів, імпортована в редактор моделей Bold UML Model Editor.


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


Розробка додатків у Bold for Delphi вимагає від більшості Delphi-розробників істотного зсуву парадигми. "Для типового Delphi-розробника собі бізнес-об'єкти зазвичай представлені рядком TDataSet, – говорить Ян Норден (Jan Norden), головний архітектор ПЗ компанії BoldSoft. – Такий підхід рідко відповідає реальній моделі, що лежить в основі програми ".


На відміну від Delphi-розробників, Bold-розробники працюють з класами, які прямо відповідають імпортованої моделі класів. Delphi-оголошення цих класів, які є істинними бізнес-об'єктами, генеруються у редакторі Bold UML Model Editor. Внутрішні класи Bold використовують дані цих бізнес-об'єктів для всіх операцій читання і запису в базі даних. "При такому підході програмісти можуть працювати безпосередньо в контексті своїх моделей класів, не зіставляючи їх структурам бази даних ", – пояснює Норден. Тому при програмуванні з допомогою Bold стають реальністю бізнес-об'єкти, про які часто говорять, але рідко застосовують у Delphi-додатках.


Показаний на роздруківці код є частиною розділу інтерфейс коду, генерованого редактором Bold UML Model Editor для діаграми класів, показаної на рис. 1. Але Bold for Delphi – Це не просто генератор коду. Генерування коду є частиною значно більш динамічного процесу. Як вже говорилося, модель класів стає частиною програми (вона зберігається як властивість компонента TBoldModel) і використовується згенерували класами для управління їх поведінкою.


Застосовують Bold розробники зазвичай не взаємодіють в компонентами TDataSet безпосередньо (хоча Bold не завжди рятує від цього), що дуже незвично більшості Delphi-розробників. Згенерували в Bold бізнес-об'єкти використовуються допоміжними класами, які відповідають за читання і запис в базі даних. У контексті Bold це можна назвати зберіганням об'єктів. Якщо дані бізнес-об'єктів (властивості об'єктів) повинні зберігатися, то один з класів Bold зберігає ці дані, записуючи їх у базу даних.


З точки зору моделі, запис у базу даних – це всього лише подробиця реалізації. Коли об'єктно-орієнтовані бази даних стануть більш поширеними, можливо, до бази даних будуть записуватися самі об'єкти, а не їхні дані. Але й існуючий поки доступ до бази даних майже "прозорий", тобто непомітний для розробника. Додаток завантажує, ініціалізує і прибирає об'єкти в міру необхідності. Якщо дані об'єктів повинні бути збережені, то вони записуються в базу даних (хоча це звичайно ініціюється явним викликом методу TBoldSystemHandle.UpdateDatabase).


У поточній версії Bold редактор Bold UML Model Editor відповідає за створення структур у використовуваній додатком базі даних. Якщо Bold UML Model Designer вибрати команду меню Tools / Generate Database, то Bold створить всі таблиці, які необхідні для зберігання метаданих та об'єктів. Bold вже підтримує більшість баз даних, з якими може працювати ADO, BDE і InterBase Express. Крім того, компанія BoldSoft близька до реалізації підтримки баз даних dbExpress, DBISAM, Advantage Database Server і SQLDirect. Якщо ви імпортуєте оновлену модель, і вашу базу даних потрібно оновити, щоб внести зміни, можна вибрати команду меню Tools / Evolve Database, щоб оновити базу даних без втрати існуючих даних (хоча, як завжди, перед тим, як зробити зміни, потрібно зробити резервну копію даних).


Поки Bold не має механізму для злиття існуючих даних в сховищі даних бізнес-об'єктів, тобто Bold for Delphi поки краще підходить для розробки нових додатків, але незручна тим розробникам, які хочуть оновити існуючі програми, щоб використовувати систему Bold. Щоправда, старший архітектор Ян Норден повідомив, що одним з пріоритетів компанії BoldSoft є створення механізму відображення існуючих структур баз даних в систему Bold.


Що потрібно для застосування Bold


Як це часто буває при використанні систем розробки додатків, для переходу до Bold for Delphi необхідна низка умов. По-перше, використовують Bold for Delphi розробники повинні добре розбиратися в об'єктно-орієнтованої розробки додатків. Недостатньо просто встановлювати властивості. Тут основну роль грають об'єкти, тому дуже важливо розуміти їх визначення і використання.


По-друге, для створення додатків за допомогою Bold for Delphi необхідне розуміння мови UML хоча б на тому рівні, який необхідний для розуміння діаграм класів. Проектування програм за допомогою Bold for Delphi починається з діаграм класів UML. Щоб розібратися в цьому, потрібно прочитати кілька хороших книг по UML або закінчити відповідні курси. Оскільки мова UML широко використовується для об'єктно-орієнтованого проектування та аналізу, багато розробники вже задовольняють вказаною вимогу, а інші придбають корисні знання.


По-третє, що використовують Bold for Delphi розробники повинні познайомитися з OCL, мовою виразів на основі об'єктів, який служить для доступу до об'єктів і отримання їх даних. Як відомо, компанія BoldSoft бере участь у підготовці наступного, другої версії мови OCL. (Відомості про поточний стан мови OCL можна знайти за адресою http://www.klasse.nl/ocl/index.html.)


По-четверте, і це, мабуть, найважчий для більшості розробників, при розробці за допомогою Bold for Delphi необхідно використовувати велику кількість компонентів Bold. При розробці програм за допомогою Bold можна використовувати багато стандартних компонентів Delphi, але крім них необхідно використовувати безліч компонентів Bold. Як мінімум, потрібні компоненти TBoldModel, TBoldSystemHandle і TBoldSystemTypeInfo. Крім того, для доступу до бази даних (щоб зберігати в ній об'єкти) необхідний хоча б один з компонентів TBoldPersistenceHandle, наприклад, TBoldPersistenceHandleBDE або TBoldPersistenceHandleADO. Вони дозволяють створеними за допомогою Bold додаткам записувати в базу даних дані бізнес-об'єктів. А для зручного доступу до моделей, створеним за допомогою Rational Rose, необхідний компонент TBoldUMLRoseLink. Приклад мінімальної конфігурації зображений на рис. 3.

Рис. 3. Схема DataModule з найважливішими компонентами Bold.


Але це ще не все. Розробники, що застосовують Bold for Delphi, Використовують ряд додаткових компонентів Bold. Наприклад, графічні інтерфейси створюються з використанням елементів управління Bold. Багато елементів управління в Delphi, які служать для отримання інформації з бази даних, мають двійників у Bold, наприклад, TBoldEdit, TBoldGrid, TBoldNavigator, TBoldCheckBox. Часто використовуються компоненти Bold TBoldListHandle, TBoldFilter, TBoldComparer, TBoldVariableHandle і TBoldDataSet. Ці компоненти знаходяться на сторінках палітри компонентів Bold (див. рис. 4).

Рис. 4. Сторінки палітри компонентів Bold.


Компоненти Bold взаємодіють з моделлю класів і підтримують вирази мови OCL. Крім того, багато компонентів, особливо компоненти графічного інтерфейсу, підтримують передплати, використовуючи модель видавець-передплатник. Підписка дозволяють одному об'єкту (зазвичай об'єкту графічного інтерфейсу) оголошувати інтерес у значеннях, представлених іншим об'єктом (зазвичай бізнес-об'єктами). Якщо один об'єкт підписується на інший, то перший (передплатник) інформується про зміни даних другого (видавця), отримуючи можливість перераховувати своє вираження OCL. Підписка широко використовуються в Bold, особливо при проектуванні графічного інтерфейсу користувача.


На рис. 4 дві сторінки палітри пов'язана з функціями COM. Bold for Delphi можна використовувати для створення мережевих розподілених додатків на основі діаграм класів UML, при цьому підтримуються такі технології як XML, COM, HTTP і SOAP.


Це не для всіх


Як би не був хороший продукт Bold for Delphi, Він все ж таки підходить не для всіх розробників, які використовують інструментарій Delphi. Bold for Delphi, Як і всяка інструментальна система, вимагає істотних пізнань в технології. Як вже було зазначено вище, для використання Bold for Delphi необхідний ряд умов, у тому числі мінімальний рівень розуміння деяких технологій. Bold for Delphi важко освоїти навіть досвідченим розробникам, які вже добре знають мови UML і OCL.


Інша важлива характеристика Bold for Delphi – Широке використання об'єктів, як бізнес-об'єктів, з якими взаємодіє написаний вами код, так і з їх допоміжними класами. Якщо ваш код повинен працювати з великою кількістю об'єктів одночасно, то і в пам'яті буде утримувати безліч об'єктів. Це може знизити швидкодію та збільшити технічні вимоги до клієнтських робочих станцій.


Інша перешкода для впровадження Bold for Delphi – Недолік документації. Bold for Delphi поставляється з вбудованою довідковою системою, яка за своєю природою містить лише обмежений обсяг інформації. На багатьох сторінках довідки є посилання, які ведуть на сторінки, що пропонують відправити в компанію BoldSoft запит на отримання додаткової інформації. Така довідка марна для розробників, які намагаються використовувати незнайомий їм компонент.


Це не означає, що компанія BoldSoft не підтримує свій продукт. Вбудована довідка все-таки містить чимало корисної інформації. А додаткову і найсвіжішу інформацію з використання компонентів Bold for Delphi можна отримати від групи новин BoldSoft. Крім того, компанія BoldSoft пропонує послуги з навчання використанню Bold for Delphi. І, нарешті, Ентоні Річардсон (Anthony Richardson) написав ряд статей, присвячених використанню Bold for Delphi. Ці статті поставляються разом з продуктом, їх також можна знайти на веб-сайті компанії BoldSoft.


Bold for Delphi – Вражаюча система для розробки додатків, яка використовує стандартні технології і керовану моделлю архітектуру. І хоча освоєння Bold for Delphi вимагає багато часу і терпіння, але переваги, які отримають зважилися освоїти її компанії, варті того – підвищення продуктивності і керованості, більш точну відповідність додатків проектним специфікаціям.


Код, що згенерував Bold


type


{Попередні оголошення всіх класів. }


TPeopleClassesRoot = class;
TPeopleClassesRootList = class;
TActor = class;
TActorList = class;
TFamily = class;
TFamilyList = class;
TMemberShip = class;
TMemberShipList = class;
TOrganization = class;
TOrganizationList = class;
TPerson = class;
TPersonList = class;


TPeopleClassesRoot = class(TBoldObject)
private
protected
public
end;


TActor = class(TPeopleClassesRoot)
private
function
_Get_M_assets: TBACurrency;
function _Getassets: Currency;
procedure _Setassets(NewValue: Currency);
protected
public
property
M_assets: TBACurrency read _Get_M_assets;
property assets: Currency
read _Getassets write _Setassets;
end;


TFamily = class(TPeopleClassesRoot)
private
function
_Get_M_familyName: TBAString;
function _GetfamilyName: string;
procedure _SetfamilyName(NewValue: string);
function _Get_M_isNoble: TBABoolean;
function _GetisNoble: Boolean;
procedure _SetisNoble(NewValue: Boolean);
function _GetfamilyMembers: TPersonList;
protected
public
property
M_familyName: TBAString
read _Get_M_familyName;
property M_isNoble: TBABoolean read _Get_M_isNoble;
property M_familyMembers: TPersonList
read _GetfamilyMembers;
property familyName: string
read _GetfamilyName write _SetfamilyName;
property isNoble: Boolean
read _GetisNoble write _SetisNoble;
property familyMembers: TPersonList
read _GetfamilyMembers;
end;


TMemberShip = class(TPeopleClassesRoot)
private
function _GetOrganizations: TOrganization;
function _Get_M_Organizations: TBoldObjectReference;
function _Getmembers: TPerson;
function _Get_M_members: TBoldObjectReference;
protected
public

property M_Organizations: TBoldObjectReference
read _Get_M_Organizations;
property M_members: TBoldObjectReference
read _Get_M_members;
property Organizations: TOrganization
read _GetOrganizations;
property members: TPerson read _Getmembers;
end;


TOrganization = class(TActor)
private
function
_Get_M_name: TBAString;
function _Getname: string;
procedure _Setname(NewValue: string);
function _Getmembers: TPersonList;
function _GetMemberShip: TMemberShipList;
protected
public
property
M_name: TBAString read _Get_M_name;
property M_members: TPersonList read _Getmembers;
property M_MemberShip: TMemberShipList
read _GetMemberShip;
property name: string read _Getname write _Setname;
property members: TPersonList read _Getmembers;
property MemberShip: TMemberShipList
read _GetMemberShip;
end;


TPerson = class(TActor)
private
function _Get_M_givenName: TBAString;
function _GetgivenName: string;
procedure _SetgivenName(NewValue: string);
function _Get_M_dateOfBirth: TBADate;
function _GetdateOfBirth: TDate;
procedure _SetdateOfBirth(NewValue: TDate);
function _Get_M_age: TBAInteger;
function _Getage: Integer;
function _GetOrganizations: TOrganizationList;
function _GetMemberShip: TMemberShipList;
function _GetFamily: TFamily;
function _Get_M_Family: TBoldObjectReference;
procedure _SetFamily(value: TFamily);
protected
procedure
_age_DeriveAndSubscribe(
DerivedObject: TObject; Subscriber: TBoldSubscriber);
virtual;
function GetDeriveMethodForMember(Member: TBoldMember):
TBoldDeriveAndResubscribe; override;
function GetReverseDeriveMethodForMember(
Member: TBoldMember): TBoldReverseDerive; override;
public
function
olderFamilyMembers: Integer;
property M_givenName: TBAString read _Get_M_givenName;
property M_dateOfBirth: TBADate
read _Get_M_dateOfBirth;
property M_age: TBAInteger read _Get_M_age;
property M_Organizations: TOrganizationList
read _GetOrganizations;
property M_MemberShip: TMemberShipList
read _GetMemberShip;
property M_Family: TBoldObjectReference
read _Get_M_Family;
property givenName: string
read _GetgivenName write _SetgivenName;
property dateOfBirth: TDate
read _GetdateOfBirth write _SetdateOfBirth;
property age: Integer read _Getage;
property Organizations: TOrganizationList
read _GetOrganizations;
property MemberShip: TMemberShipList
read _GetMemberShip;
property Family: TFamily
read _GetFamily write _SetFamily;
end;


TPeopleClassesRootList = class(TBoldObjectList)
protected
function GetBoldObject(index: Integer):
TPeopleClassesRoot;
procedure SetBoldObject(index: Integer;
NewObject: TPeopleClassesRoot);
public
function Includes(anObject: TPeopleClassesRoot):
Boolean;
function IndexOf(anObject: TPeopleClassesRoot):
Integer;
procedure Add(NewObject: TPeopleClassesRoot);
function AddNew: TPeopleClassesRoot;
procedure
Insert(index: Integer;
NewObject: TPeopleClassesRoot);
property BoldObjects[index: Integer]:
TPeopleClassesRoot read GetBoldObject
write SetBoldObject; default;
end;


TActorList = class(TPeopleClassesRootList)
protected
function GetBoldObject(index: Integer): TActor;
procedure SetBoldObject(index: Integer;
NewObject: TActor);
public
function Includes(anObject: TActor): Boolean;
function IndexOf(anObject: TActor): Integer;
procedure Add(NewObject: TActor);
function AddNew: TActor;
procedure Insert(index: Integer; NewObject: TActor);
property BoldObjects[index: Integer]: TActor
read GetBoldObject write SetBoldObject; default;
end;


TFamilyList = class(TPeopleClassesRootList)
protected
function GetBoldObject(index: Integer): TFamily;
procedure SetBoldObject(index: Integer;
NewObject: TFamily);
public
function Includes(anObject: TFamily): Boolean;
function IndexOf(anObject: TFamily): Integer;
procedure Add(NewObject: TFamily);
function AddNew: TFamily;
procedure Insert(index: Integer; NewObject: TFamily);
property BoldObjects[index: Integer]: TFamily
read GetBoldObject write SetBoldObject; default;
end;

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


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

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

Ваш отзыв

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

*

*