Початкова сторінка

Микола Жарких (Київ)

Персональний сайт

?

Метаінформація

М.І.Жарких, Ю.Б.Кабаков

Ієрархія наслідування системних класів

Рис. 1. Ієрархія наслідування системних класів.

Метаінформація – це інформація про структуру іншої інформації. Оскільки в будь-якій базі даних зберігається структурована інформація, кожна БД у той чи інший спосіб визначає метаінформацію, яка необхідна для кодування/декодування та осмислення записів в БД. В силу послідовності об’єктної моделі ми представляємо метаінформацію у вигляді екземплярів спеціалізованих класів. В пропонованій моделі абстрактним носієм метаінформації є МетаОб’єкт – абстрактний системний клас, який є нащадком ПерсОб’єкту (рис. 1).

Кожен екземпляр метаоб’єкта має по одному екземпляру таких атрибутів :

ім’я з типом даних “рядок” є символьним ідентифікатором, під яким екземпляр відомий у системі. Його семантика близька до логічного імені, тому цей атрибут є непоганим кандидатом на звання логічного імені;

власник з типом даних “вказівник на МетаОб’єкт”. За допомогою цього атрибута екземпляри-метаоб’єкти можна зв’язати у дерево (подбавши про заборону циклічних посилань типу Х.Власник := Y; Y.Власник := X). Семантика цього зв’язку на рівні метаоб’єкту не визначається – це роблять нащадки метаоб’єкту;

коментар з типом даних “рядок”, який містить пояснення щодо призначення даного екземпляру.

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

Таким чином, основне призначення МетаОб’єкту – надати нащадкам механізм зв’язування екземплярів у дерево.

ПротоОб’єкт – абстрактний системний клас, успадкований від МетаОб’єкту, який визначає дві множинні властивості :

вирази – множина екземплярів класу Вираз;

види – множина екземплярів класу ПротоВид.

Вирази призначено для представлення інформації про екземпляр, основаної на значеннях його атрибутів, наприклад, для розрахунку площі прямокутника за значеннями довжини та ширини. Види призначено для управління видимістю та порядком слідування значень (атрибутів / виразів) під час пред’явлення інформації.

В ПротоОб’єкті реалізовано також три методи :

абстрактний віртуальний метод Вибрати (аналог оператора SQL SELECT). Цей метод повертає множину екземплярів, пов’язану з даним протооб’єктом. Детальну семантику цього метода визначають нащадки ПротоОб’єкту. Як і у випадку з ПерсОб’єктом, з цим методом можна зв’язати дві події (ПередВибиранням / ПісляВибирання);

ОбчислитиДекларативнийКлас, ОбчислитиФактичнийКлас – результатом виконання методів є клас, який є спільним суперкласом для множини об’єктів, що її повертає метод “Вибрати”. Різниця між ними та, що декларативний клас множини обчислюється тільки на підставі опису способу формування множини (без звертання до екземплярів класів); цей метод є абстрактним і віртуальним. Фактичний клас обчислюється шляхом аналізу множини об’єктів, створеної методом “Вибрати”.

Таким чином, основне призначення ПротоОб’єкту – надати нащадкам механізм формування множин екземплярів.

Від ПротоОб’єкту утворюються два системних класи, які не є абстрактними – Генератор та МетаКлас (третього нащадка – Закладку – розглянемо пізніше). Розглянемо спочатку простіший клас – Генератор. Він має один специфічний атрибут – генеруючий вираз – синтаксис якого буде розглянуто нижче. Генеруючий вираз використовується під час виклику методу “Вибрати” для генератора, і результат обчислення цього виразу є результатом виклику методу. Вказівник “Власник” для генератора може вказувати на інший генератор; в такому випадку він означає відношення використання (даний генератор може в своєму генеруючому виразі посилатись на вираз генератора-власника). Метод ОбчислитиДекларативнийКлас для генератора аналізує генеруючий вираз і обчислює спільний суперклас для всіх операндів.

Таким чином, основне призначення Генератора – створити механізм виконання операцій над множинами об’єктів.

МетаКлас є центральним в ієрархії системних класів. Він визначає три множинних властивості :

множину атрибутів;

множину індексів;

множину правил.

Семантика цих властивостей визначається семантикою системних класів Метаатрибут, Вираз, Індекс, Правило.

Атрибут “Власник” для кожного екземпляру МетаКласу вказує на інший екземпляр МетаКласу, який виступає як суперклас. Таким чином, цей атрибут відбиває ієрархію спадковості для класів предметної області, які є екземплярами МетаКласу.

Метод “Вибрати” повертає множину всіх екземплярів задекларованого предметного класу разом з усіма екземплярами усіх його підкласів. Додатковий метод ВибратиПрямийКлас вибирає тільки екземпляри задекларованого класу (без екземплярів підкласів). Метод ОбчислитиДекларативнийКлас повертає як результат сам клас.

Основна відмінність МетаКласу полягає в тому, що на основі його екземплярів – класів предметної області – створюються екземпляри самої предметної області. Інакше кажучи, екземпляри МетаКласу є метаоб’єктами, в той час як екземпляри інших системних класів представляють тільки самих себе і не є зразками для утворення інших екземплярів. Важливо розуміти, що самі класи предметної області успадковуються від ПерсОб’єкта (тобто атрибут “Власник” для декларації проблемного класу вказує на ПерсОб’єкт або на іншу декларацію проблемного класу).

Таким чином, основне призначення МетаКласу – забезпечити механізм ієрархічного успадкування для класів предметної області.

Значення – абстрактний системний клас без спеціальних властивостей, який є основою для конкретних класів МетаАтрибут та Вираз. Атрибут “Власник” для нього вказує на екземпляр МетаКласу, якому належить даний екземпляр “Значення”, і виражає відношення використання.

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

обов’язковий – логічне значення; якщо воно є істинним, порожнє значення (null value) атрибута є неприпустимим;

множинний – логічне значення; якщо воно є істинним, атрибут є векторним (може мати кілька екземплярів значення); якщо воно є ложним, атрибут є скалярним (містить не більше одного значення);

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

Вираз – конкретний клас, призначений для розрахунку значень за правилами, які записані у його атрибуті Формула. Формула складається із значень (атрибутів / виразів / літералів), поєднаних символами операцій. Набір операцій залежить від набору типів даних в об’єктній СУБД; детальний опис синтаксису формул належить скоріше до реалізації.

Літерал – конкретний клас, призначений для представлення сталих значень у формулах. Він визначає один атрибут ЛітеральнеЗначення, тип даних якого – екземпляр атрибута. Тип даних літерала визначається типом даних цього екземпляра; тобто літерал є поліморфним, здатним представляти значення довільного типу.

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

Правило є нащадком класу Вираз. Задана в ньому формула має повертати значення логічного типу. Правило дозволяє або забороняє дію, в контексті якої воно виконується. Наприклад, правило класу виконується в контексті методу збереження об’єкту. Якщо значення правила істинне, дія виконується; якщо воно ложне, виникає помилка і дія скасовується. Таким чином, за допомогою правил класу можна перевіряти умови, які залежать від значень одразу кількох атрибутів.

Якщо в одному контексті визначено кілька правил, всі вони мають виконуватись одночасно; порядок їх обчислення задається реалізацією; правила не повинні покладатись на припущення, що вони завжди будуть обчислюватись у певній послідовності. Задаючи набір правил, треба дбати про їхню сумісність. Якщо правило А вимагає, щоб атрибут Х був менше 5, а правило В – щоб атрибут Х був більше 10, то під управлінням такої множини правил не можна буде виконати ніякої дії. Автоматичне доведення сумісності або несумісності множини правил – це окрема алгоритмічна проблема, в яку ми не будемо заглиблюватись.

В силу принципу актуалізму запровадження нових правил класу не впливає на раніше записані екземпляри класу – навіть якщо вони не задовольняють новому правилу. Такі екземпляри можуть зберігатись і використовуватись необмежено довго – аж до моменту, коли екземпляр буде змінено і відбудеться спроба запису його в базу даних. Така особливість стану цілісності інформації відповідає об’єктному підходу та внутрішній логіці певних предметних областей (прикладом є відсутність зворотньої дії закону в юриспруденції).

Індекс – конкретний системний клас, призначений для організації логічного індексування об’єктів. Індексування об’єктів має на меті прискорення відбору та сортування екземплярів об’єктів на підставі найчастіше вживаних “Значень”, пов’язаних з об’єктами. Відбір екземплярів в об’єктній СУБД не є швидкою операцією : для того, щоб перевірити значення якогось атрибута, треба прочитати весь об’єкт. Індексування дозволяє дізнатись про значення атрибута, не відкриваючи самого об’єкта. Термін “логічне” в даному випадку означає, що ми розглядаємо індекс лише як спосіб упорядкування екземплярів, без огляду на фізичні структури даних, які його забезпечують.

Атрибут “Власник” для індексу вказує на метаклас, для якого визначено індекс. Індекс визначає векторний атрибут ІндексніЗначення, в якому перелічено якісь “Значення” (атрибути або вирази), властиві даному класу. В загальному випадку індекс є множинним, упорядкованим за величиною першого індексного значення, при рівній величині його – за величиною другого індексного значення і т.д. Найважливішим частинним випадком є одиничний індекс, збудований за одним індексним значенням.

ПротоВид – абстрактний системний клас, який є базою управління візуальним представленням об’єктів. Його атрибут “Власник” вказує на ПротоОб’єкт, представлення якого треба визначити. Для кожного Значення (атрибута або виразу), наявного у власнику, ПротоВид визначає його місце у послідовності Значень та правило видимості. Правило видимості застосовується під час пред’явлення даного Значення : Значення буде показано лише у випадку істинності правила. Набір Значень, які знаходяться під управлінням ПротоВиду, визначається ДекларативнимКласом для ПротоОб’єкта-власника ПротоВиду.

За допомогою таких гнучких засобів можливо створити на основі однієї сукупності екземплярів документи різної структури і вигляду. Наприклад, для класу “Людина” один вид може визначити послідовність атрибутів “Прізвище”, “Ім’я”, “По батькові”; другий вид – послідовність “Ім’я”, “По батькові”, “Прізвище”; третій вид – послідовність “Ім’я”, “Прізвище”, приховавши атрибут “По батькові”. Четвертий вид можна зробити на основі третього, але більш гнучким, скажімо, наказавши показувати атрибут “По батькові” лише в тому разі, коли він не є порожнім (перший і другий види в нашому прикладі показують цей атрибут незалежно від того, чи містить він якісь дані, чи ні). Таким чином, за допомогою правил видимості можна управляти видимістю значень на рівні окремого екземпляру.

ПротоВид може також визначати додаткові Вирази, відсутні у власника, але потрібні в контексті даного виду.

Вид є конкретним класом – нащадком ПротоВиду. Він володіє трьома додатковими властивостями :

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

ПорядокСортування є екземпляром Індексу, який визначає послідовність пред’явлення екземплярів;

Атрибут ОбмеженняВводу є логічним значенням – аналогом опції SQL WITH CHECK OPTION.

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

Властивість Фільтр обчислюється в контексті операції Відкриття екземпляру : якщо правило дозволяє, екземпляр буде пред’явлено. Отже, визначений для виду фільтр не намагається проглянути множину екземплярів заздалегідь; замість того він чекає, поки надійде вимога показати той чи інший екземпляр.

Атрибут ОбмеженняВводу керує процесом збереження об’єктів, які додаються або редагуються під управлінням Виду. Якщо ця властивість істинна, набір правил класу доповнюється правилом фільтрування для Виду. Якщо об’єкт під управлінням такого набору правил можна зберегти в БД, то це є гарантією того, що він не “зникне з поля зору” і буде доступним через даний Вид.

Організований у такий спосіб Вид є мономорфним : кожен екземпляр об’єкту, незалежно від його конкретного класу, розглядається через призму поліморфізму як екземпляр ДекларативногоКласу для ПротоОб’єкта, який є власником виду. Завдяки конкретному класу Підвид можна організувати мудріший поліморфний вид. Для цього в класі Підвид визначено атрибут Супервид, який є вказівником на ПротоВид (тобто Вид або інший Підвид). Завдяки цьому атрибуту екземпляри Підвиду зв’язуються у дерево, в корені якого знаходиться екземпляр Виду (він визначає правила фільтрування та сортування для всього дерева).

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

З усіх цих системних об’єктів Значення з його підкласами, Метаклас та Індекс є об’єктами визначення даних, а об’єкти ПротоВид з підкласами, Генератор і Закладка – об’єктами маніпулювання даними. З них справді необхідними є МетаКлас та МетаАтрибут. Створивши дерево класів предметної області (тобто певну кількість екземплярів МетаКласу) і задавши їх атрибути (тобто створивши певну кількість екземплярів МетаАтрибуту), можна приступати до наповнення бази даних, тобто до створення екземплярів класів предметної області. Конкретна інформація про предметну область зберігається тільки в цих екземплярах. Важливо розуміти, що ці екземпляри не містять нічого, окрім значень атрибутів даного екземпляру. Усілякі інші дані, необхідні для розуміння та використання значень атрибутів, зберігаються у вигляді метаінформації.