2. В результате доказанной теоремы получено кодообразующее соотношение, обеспечивающее формирование кода для укрупненного позиционного числа с неопределенной длиной по двухуровневой схем, а именно на первом уровне формируется кодовое представление для отдельных двухкомпонентных кортежей, а на втором - осуществляется формирование общего кодового представления для кодов, полученных на первом уровне.
Научная новизна. Впервые получено кодообразующее соотношение для компактного представления усеченного вектора двухкомпонентных кортежей как комбинаторного объекта. Отличие заключается в том, что кодовое значение формируется по двухуровневой схеме для укрупненного позиционного числа с неопределенной длиной, элементами которого являются коды биадических чисел, образованных для двухкомпонентных кортежей. Это позволяет сформировать без поте-
УДК004.45
СИСТЕМИ ОБ’ ЄКТНО-РЕЛЯЦІЙНОЇ ПРОЕКЦІЇ ДЛЯ C++
БОНДАРЕНКО М.А., МАКАРЕНКО А.Ю._____________
Узагальнюється теоретична інформація в галузі проектування систем об’єктно-реляційної проекції, визначаються ключові технічні вимоги для проектування ORM-систем, аналізуються механізми проекції та інтерфейси існуючих ORM-систем.
1. Вступ
Найбільш поширеним способом зберігання та первинної обробки інформації є використання реляційних баз даних, тоді як об ’ єктно-орієнтов ане програмуй ання є на сьогодні основною технологією розробки програмного забезпечення. Ключовим елементом реляційних баз даних є таблиця, звернення до якої відбувається шляхом формування запитів мовою, яку підтримує система керування базами даних (СКБД). Основною одиницею об’єктно-орієнтова-ного програмування є клас, який описується в рамках, встановлених синтаксисом мови програмування. В пошуку оптимізації шляхів роботи з даними при розробці програмного забезпеченняоб’ єктно-орієнтованої системи програмування працюють нові інструменти: об’єктно-ре-ляційні СКБД, об’єктно-орієнтовані бази данихта системи об’єктно-реляційної проекції. Проблема даного дослідження полягає у протиріччі між відомими перевагами систем об’єктно-реляційної проекції та низьким рівнем використання цих систем при розробці програмного забезпечення мовою С++.
2. Основний зміст
У рамках зазначеної проблеми мають бути виконані такі завдання: аналіз теоретичних питань в галузі об ’ єктно-реляційної проекції; введення ключової термінології; роль систем об’єктно-реляційної проекції в архітектурі програмного засобу; перелік інструментів для розробки системи; відповідність до цих вимог
РИ, 2013, № 3
ри информации компактное представление для линеаризированной трансформанты.
Литература: 1. Олифер В.Г. Компьютерные сети. Принципы, технологии, протоколы: Учебник для вузов. / В.Г. Олифер, Н.А. Олифер. СПб.: Питер, 2006. 958 с. 2. GonzalesR.C. Digital image processing / R.C. Gonzales, R.E. Woods. Prentice Inc. Upper Saddle River, New Jersey 2002. 779 p. 3. Баранник В.В. Кодирование трансформированных изображений в инфо-коммуникационных системах / В.В. Баранник, В.П. Поляков. Х.: ХУПС, 2010. 212 с. 4. Баранник В.В. Обоснование проблемных недостатков технологии компонентного кодирования трансформированных изображений для средств телекоммуникаций / В.В. Баранник, Ю.В. Стасев, С.В. Туренко // Сучасна спеціальна техніка. 2013. №4. С. 22 - 27.
Поступила в редколлегию 05.01.2013
Рецензент: д-р техн.наук, проф. Баранник В.В.
Туренко Сергей Викторович, аспирант ХНУРЭ. Научные интересы: обработка и передача информации. Адрес: Украина, 61023, Харьков, ул. Ленина, 14.
мови програмування С++; підхід до реалізації механізмів рефлексії; введення інструментів об’єктно-реляційної проекції для С++. Об’ єктно-реляційна проекція (Object-relational mapping- ORM) це програмна технологія, яка пов’язує реляційні бази даних з концепціями об’ єктно-орієнтованого програмування шляхом створення віртуальних об ’ єктних баз даних. Дана технологія може бути введена як програмний компонент (динамічна або статична бібліотека), а також у вигляді окремої розробки програми. ORM-технологія втілює в собі основні принципи концепції RAD (Rapid application development - швидка розробка програмного забезпечення). Це визначає її як інструмент для прискорення розробки ПЗ, підвищення якості роботи, надійності програмного продукту та зниження собівартості його розробки [1]. Для подальшого дослідження необхідно визначити ключову термінологію [2] системи об’єктно-реляційної проекції, а саме: проекція, проектувати, атрибут, проекція атрибуту, проекція зв’язку.
Проекція - зв’язок між об’єктами, співвідношенням об’єктів, які зберігаються в реляційних сховищах даних. Проектувати - визначати об’єкти, їх атрибути та взаємозв ’язки з іншими об ’ єктами, що зберігаються в постійному сховищі даних. Атрибут - загальнодоступний член класу, або значення особистого члена класу, який повертається у разі виклику методу класу. Він співвідноситься зі стовпцем реляційної таблиці.
Проекція атрибута описує метод зберігання значення атрибута об’єкта в реляційному сховищі. Проекція зв’язку - опис методу його збереження (асоціація, агрегація або композиція) між об ’ єктами. Архітектурна роль об’єктно-реляційної проекції в програмному засобі полягає у проекції компонентів бізнес-логіки. Вона представлена конкретними класами на відповідні об’єкти реляційної бази даних [3]. Порівняння узагальненої архітектури ПЗ з її використанням наведено на рисунку. Пунктирною лінією виділені компоненти системи, які мають бути розроблені самостійно. Система об’єктно-реляційної проекції включає в себе
55
вбудований інтерфейс доступу до даних. Вона оптим-ізує час розгортання системи та проектування бізнес-логіки. При цьому ліквідується необхідність розробки компонентів доступу до даних (Data access logic components - DALC).
Технологія об’єктно-реляційної проекції реалізована для використання з переважною більшістю мов програмування у формі окремих бібліотек. Вона реалізована у складі багатофункціональних фреймворків як частина шаблону проектування модель-вид-контролер (MV C). В шаблоні MVC об’єктно-реляційна проекція застосовується для опису моделі даних [4]. Ключовою вимогою до мови програмування для побудови системи об’єктно-реляційнї проекції є можливість рефлексивного програмування [5 ]. Результати узагальненого аналізу підходів до організації рефлексії для мови програ -мування С++ наведено в таблиці.
Існують такі реалізації механізму рефлексії для мови програмування С++: C++/CLI корпорації Microsoft; бібліотека Mirror; Qt Framework. Мета-об’єкти Qt додають нові члени класу до часу виконання програми. Для реалізації проекції виконується мета-об ’ єктний компілятор, який є надбудовою компілятора С++.
Розглянемо існуючі реалізації систем об’ єктно-реляц-ійної проекції для С++ для розробки ORM-систем, перевірки відповідності архітектури інтерфейсу користувача вимогам об’єктно-орієнтованого програмування. LightSQL - бібліотека кросплатформи з відкритим кодом, яка реалізує механізм об ’ єктно-реляційної проекції. Вона дає можливість створювати таблиці, модифікувати структуру бази даних, підтримує проекцію атрибутів та зв ’язків. Механізм проекції повністю реалізується за допомогою XML розмітки без побудови С++ класу. Класи С++ генеруються шляхом використання утиліти кодогенерації lightsql-gen, яка входить в комплект поставки бібліотеки. Розглянемо приклад проекції об ’ єкта засобами бібліотеки LightSQL:
<?xml version=”1.0"?>
<!DOCTYPE database SYSTEM “litesql.dtd”>
Стандартна схема побудови програмного забезпечення
Архітектура ПЗ збереження
<database name=”ExampleDatabase” namespace=”example”> <object name=”Person”>
<field name=”name” type=”string”/>
<field name=”age” type=”integer” default=” 15"/>
<field name=”sex” type=”integer”>
<value name=”Male” value=”0"/>
<value name=”Female” value=”1 "/>
</field>
<method name=”sayHello”/>
</object>
<relation id=”Mother” unidir=”true”>
<relate object=”Person” limit=”many” handle=”mother”/> <relate object=”Person” limit=”one”/>
</relation>
<relation id=”Children” unidir=”true”>
<relate object=”Person” handle=”children”/>
<relate object=”Person”/>
</relation>
</database>
В результаті кодогенерації створюється клас Person, який має відкриті члени класу- атрибути проекції. Розглянемо приклад використання об’єктів згенеро-ваного класу Person:
ExampleDatabase db(“sqlite3”, “database=example.db”);
db.verbose = true;
db.create();
db.begin();
Person jeff(db); jeff.name = “Jeff”; j eff. sex=Person:: Sex: :Male; jeff.age = 32; jeff.update();
Personjill(db);
Схема побудови ПЗ з використанням ORM
даних в реляційному сховищі
56
РИ, 2013, № 3
jill.name = “Jill”;
j ill. sex=Person:: Sex: :Female;
jill.age = 33;
jill.update();
jeff children().link(j ack);
Виборки здійснюються за допомогою визначеного шаблонного об’єкта select або sqlquery:
try {
select<Person>(db, Person::Id == 100).one();
} catch (NotFound e) {
cout << “No Person with id 100” << endl;
}
Реалізація проекції бібліотеки LightSQL обмежує стандартні можливості мови проектування класів через використання механізму кодогенерації класів.
ODB (Object data base- об’єктна база даних) - бібліотека C++, яка реалізує систему об ’ єктно-орієнтованої проекції та використовує компілятор GCC (GNU Compiler Collection- набір компіляторів GNU). Проекція класу досягається директивою компіляції, яка додає до класу необхідну метаінформацію. Розглянемо код проекції з використанням засобів бібліотеки ODB:
#pragma db object table(“people”) class person {
private:
friend class odb: :access; person ();
#pragma db id auto unsigned long id_;
string first_; string last_;
#pragma type(“INT UNSIGNED”) unsigned short age_;
};
Для організації виборки застосовується шаблонний метод об’єкта Database, який є інтерфейсом доступу до реляційної бази даних. Для зберігання об’ єктів використовується шаблонний об’єкт result (результат) стандартної бібліотеки С++. Для формування умов виборки існує шаблонний об’ єкт query (запит). Розглянемо програмний код механізму виборки в бібліотеці ODB:
typedef odb::query<person> query; typedef odb::result<person> result; transaction t (db.begin ());
result r (db.query<person> (query::last == “Doe” && query::age < 30));
for (result::iterator i (r.begin ()); i != r.end (); ++i)
Аналіз підходів до реалізації механізму рефлексії мови програмування С++
Підхід Переваги Недоліки
Аналіз інформації для відладки. Використання стандартного методу опису класу. Можливість отримати повну інформацію про типи даних. Необхідність побудови програми в режимі відладки. Залежить від компілятору.
Препроцесор аналізу та опису класу. Використання стандартного методу опису класу. Специфіка роботи компіляторів з членами класу та таблицями віртуальних функцій. Розробка аналізатора коду С++.
Модифікований компілятор з підтримкою рефлексії. Відсутність додаткових етапів побудови програми. Генерація ефективного коду для засобів рефлексії. Відтворення та адаптація програмної інфраструктури.
Ручне формування мета-опису класу засобами мови програмування. Незалежність від компілятору. Проста реалізація. Написання додаткового програмного коду, для опису метаінформації. Людський фактор.
Формування мета-опису класу в конфігурації зовнішніх класів. Використання стандартного методу опису класу. Можливість використання стандартних засобів опису структур даних (XML, JSON). Додаткові часові та ресурсні видатки на отримання метаінформації.
Формування мета-опису класу засобами скриптової мови програмування. Використання вбудованих можливостей скриптових мов програмування. Часові та ресурсні витрати на запуск та роботу з інтерпретатором скриптової мови програмування.
РИ, 2013, № 3
57
{
cout << “Hello, “ << i->first () << endl;
}
t.commit ();
Wt::Dbo (Web toolkit - Data base object, набір інструментів для веб-розробки — об’єктна база даних) -бібліотека реалізації інструментів об’єктно-реляційної проекції. Для проекції атрибутів та зв’зків бібліотека пропонує задавати програмісту метаінформацію вручну. Це імітує рефлексію класу. Кожен об’єкт для проектування має реалізувати шаблонний метод persist (зберігати), в якому описується структура відповідного об’єкта реляційної бази даних. Розглянемо приклад проекції класу:
#include <Wt/Dbo/Dbo>
#include <string> namespace dbo = Wt::Dbo; class User { public: enum Role {
Visitor = 0,
Admin = 1,
Alien = 42
};
std::string name; std::string password;
Role role; int karma;
template<class Action> void persist(Action& a)
{
dbo::field(a, name, “name”); dbo::field(a, password, “password”); dbo::field(a, role, “role”); dbo::field(a, karma, “karma”);
}
};
Звернення до реляційної бази даних та реєстрація нових об ’ єктів відбувається за допомогою об ’ єкта класу Session (сесія). Він здійснює з’єднання з базою даних та представляє інтерфейс для маніпуляції об ’ єктами та записами в базі даних:
dbo: :ptr<User> joe = session.find <User>().where(“name = ?”).bind(“Joe”);
QxOrm (Qx object relation mapping- об’єктно-реляуійна проекція) - бібліотека, спроектована для надання програмістам можливостей роботи з об ’ єктно-реляційною проекцією. Вона має зовнішню залежність від boost та Qt Framework. Проекція класу відбувається за принципом
ручного додавання метаінформації. Інтерфейс роботи з реляційним сховищем не є об’єктно-орієнтованим. Він зроблений у вигляді функцій, кожна з яких виконує одну конкретну операцію. Аналіз існуючих ORM-систем показує, що найбільш розповсюдженим методом для організації проекції є рефлексія ручного додавання мета-інформації в клас проекції. ORM-бібліотеки надають програмісту неповноцінний об’єктно-орієнтований інтерфейс. Об ’ єкти проекції активно використовують шаблони статичного поліморфізму без прийомів спадкування та динамічного поліморфізму.
Висновки
Наукова новизна. Виконано теоретичний аналіз аспектів проектування архітектури ORM-системита дизайну інтерфейсу користувача. Показано, що ORM-системи програмного засобу заміщують компоненти логіки доступу до даних. Введено терміни об ’ єктно-реляційної проекції: проекція, проектувати, атрибута, проекція атрибуту, проекція зв’язку. Механізм рефлексії є ключовою технічною вимогою до мови програмування для організації проекци реляційної таблиці на клас. Стандарт мови С++ частково реалізує механізм інтроспекції типів даних — можливості доступу об’єкта до структури свого класу у час виконання. Показано, що загальними підходами для реалізації механізму рефлексії для С++ є аналіз інформації для відладки, створення препроцесора, модифікація компілятора, ручне формування мета-опису класу. ORM-системи для С++ відходять від об’єктно-орієнто-ваної концепції побудови програмних інтерфейсів.
Література: 1. Coleman G., Verbruggen R. A Quality Software Process for Rapid Application Development // Software Quality Control. 1998. Vol. 7, № 2. P. 107-122. 2. Van ZylP, Kourie D.G., Boake A. Comparing the performance of object databases and ORM tools // Proc. of the 2006 annual research conference of the South African institute of computer scientists and information technologists on IT research in developing countries. Republic of South Africa: South African Institute for Computer Scientists and Information Technologists, 2006. P. 1-11. 3. Van Zyl P. et al. The influence of optimisations on the performance of an object relational mapping tool // Proceedings of the 2009 Annual Research Conference of the South African Institute of Computer Scientists and Information Technologists. New York, NY, USA: ACM, 2009. P. 150-159. 4. Ireland C. et al. A Classification of Object-Relational Impedance Mismatch // First International Conference on Advances in Databases, Knowledge, and Data Applications, 2009. DBKDA ’09. 2009. P. 36-43. 5. Smith B.C. Procedural reflection in programming languages: Thesis. Massachusetts Institute of Technology, 1982.
Надійшла до редколегії 22.08.2013
Рецензент: д-р техн. наук, проф. Кривуля Г.Ф.
Бондаренко Микола Андрійович, канд. техн. наук, професор Української інженерно-педагогичної академії. Наукові інтереси: інформаційні технології та проектування технічних систем. Адреса: Україна, 61000, Харків, вул. Клочківська, 195 г, кв. 44, тел. 7 19 50 01.
Макаренко Антон Юрійович, асистент кафедри електроніки та комп’ютерних технологій систем управління навчально-наукового професійно-педагогічного інституту Української інженерно-педагогічної академії. Адреса: Україна, Ар-темівськ, вул. Носакова, 9.
58
РИ, 2013, № 3