АНАЛІЗ ВЗАЄМОДІЇ МІЖ ТИПАМИ і підтипів НА ПРИКЛАДІ коло і еліпс

Чи можуть екземпляри підтипів розглядатися як екземпляри типів, наприклад, чи дійсно окружності є еліпсами До цих пір в цьому розділі (на цілком резонних підставах) Передбачалося, що відповідь на це питання є позитивним, але тепер необхідно визнати той факт, що з цього питання, який зовні здається однозначним, в літературі можна знайти абсолютно протилежні думки [206] Розглянемо зазвичай використовуються в цій главі змінні Е і з, які мають, відповідно, оголошені типи ELLIPSE і CIRCLE Припустимо, що ці змінні були ініціалізовані таким чином

Е: = ELLIPSE (LENGTH (50), LENGTH (30), POINT (00, 00))

; С: = CIRCLE (LENGTH (50), POINT (00, 00

) )

Відзначимо, зокрема, що тепер обидва оператори, ТНЕ_А (С) І ТНЕ_В (С), повертають значення пять

Потім розглянемо одну операцію, яку можна, безумовно, застосувати до змінної Е – оновлення значення півосі а, наприклад, як показано нижче

ТН Е_ А (Е): = LE NGT H (6 0)

Але якщо тепер буде зроблена спроба виконати аналогічну операцію зі змінною с (як показано нижче), то буде отримана помилка

ТНЕ_А (С): = LENGTH (6 0)  

Але в чому саме полягає ця помилка Справа в тому, що якби було виконано це оновлення, змінна з зрештою містила б окружність, що порушує

Глава 20 Спадкування типів801

обмеження, що накладається на колі в тій частині, яка стосується умови а = b a саме: компонент а тепер мав би значення шість, тоді як компонент b, безумовно, був би раніше дорівнює пяти (оскільки в нього не було внесено зміни) Іншими словами, змінна з після цього містила б некруглу окружність, порушуючи тим самим обмеження типу, накладене на тип CIRCLE

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

півосі а чи b кола (тобто присвоювання їй нового значення) є синтаксично неприпустимим Іншими словами, операція присвоювання значень псевдопеременной ТНЕ_А або ТНЕ_В не може бути застосована до типу CIRCLE і спроба подібного оновлення повинна закінчуватися невдачею через помилку при перевірці типів на етапі компіляції

Примітка Насправді очевидно, що подібні присвоювання і повинні бути синтаксично неприпустимими Нагадаємо, що операція привласнення псевдопеременной ТНЕ_ фактично являє собою просто скорочення Тому, наприклад, спроба привласнення псевдопеременной ТНЕ_А (С), якби була допустимою, то представляла б собою скорочене позначення приблизно наступного оператора

С: = CIRCLE (..)

При цьому виклик селектора CIRCLE в правій частині мав би містити фактичний параметр ТНЕ_А зі значенням LENGTH (6 0) Але виклик селектора CIRCLE не включає фактичний параметр ТНЕ_А У ньому передбачений тільки фактичний параметр THE_R і фактичний параметр THE_CTR Тому початкове присвоювання, безумовно, є неприпустимим

Додаткові відомості про зміну семантики

Перш за все, слід негайно відкинути пропозицію, яке могло бути зроблено в спробі врятувати від краху ідею, що в кінцевому підсумку присвоювання псевдопеременной ТНЕ_А або ТНЕ_в має бути допустимим для кіл Таке пропозиція полягає в тому, що операцію присвоювання (наприклад) псевдопеременной ТНЕ_А необхідно перевизначити (іншими словами, реалізувати нову версію цього оператора) для кіл таким чином, щоб в якості побічного ефекту відбувалося також присвоювання псевдопеременной ТНЕ_В, тобто щоб окружність і раніше задовольняла б обмеженню а = b після оновлення Автор відкидає цю пропозицію щонайменше за трьома вказаними нижче причин

■ По-перше, семантика присвоювання псевдопеременним ТНЕ_А і ТНЕ_В є продиктованої (цілком свідомо) В розробленій автором моделі і її не сле дме змінювати в запропонованій формі

■ По-друге, навіть якщо б ця семантика була запропонована моделлю, в цій книзі вже було зазначено, що в цілому не рекомендується змінювати довільним чином семантику будь-якого оператора, а тим більше не рекомендується змінювати семантику лю бого оператора так, щоб у результаті виникали побічні ефекти Обгрунтовано ний загальний принцип полягає в тому, що слід неухильно прагнути до того, щоб оператори створювали один і тільки один необхідний ефект, не більше і не менше

■ По-третє, найбільш важливим запереченням є те, що можливість зміни семантики в запропонованій формі іноді навіть повністю відсутній Наприклад, припустимо, що тип ELLIPSE має ще один безпосередній підтип, NONCIRCLE припустимо, що до фігур, відмінним від кіл, що належить до цього підтипу, належить обмеження а> b, і розглянемо операцію присвоювання псевдопеременной ТНЕ_А однією з таких фігур, яка у разі її успішного виконання встановила б значення а, рівне b Яким було б прийнятне перевизначення семантики для такого присвоювання Вірніше, який побічний ефект був би прийнятним

Пошук застосовної моделі успадкування

Отже, в попередніх підрозділах ми зупинилися на розгляді такої ситуації, що операція привласнення псевдопеременной ТНЕ_А або ТНЕ_В є операцією, яка може застосовуватися до еліпсам в цілому, але не до кіл зокрема Але необхідно також враховувати наведені нижче міркування

а) Передбачається, що тип CIRCLE – це підтип типу ELLIPSE

б) З того, що тип CIRCLE – підтип типу ELLIPSE, випливає, що операції, примі німие до еліпсам в цілому, є застосовними і до кіл зокрема (іншими словами, операції з еліпсами успадковуються окружностями)

в) А тепер ми в кінцевому підсумку стверджуємо, що операція привласнення псевдопе пасової ТНЕ_А або ТНЕ_В НЕ успадкована

Хіба тут ми не стикаємося з протиріччям Що ж, зрештою відбувається Перш ніж спробувати знайти відповіді на ці питання, необхідно підкреслити серйозність проблеми, що розглядається Наведений вище довід дійсно виглядає як парадокс, оскільки якщо деякі оператори не успадковуються типом CIRCLE від типу ELLIPSE, то на підставі чого саме ми можемо стверджувати, що окружність є еліпсом А який сенс має поняття спадкування, якщо деякі оператори в кінцевому підсумку взагалі не успадковуються Чи існує взагалі застосовна модель

спадкування Чи не ганяємося ми за примарами, намагаючись знайти таку модель

Примітка Деякі автори цілком серйозно пропонували, щоб операція привласнення псевдопеременной ТНЕ_А була допустимою як для кіл, так і для еліпсів (стосовно окружностям вона повинна була оновлювати радіус), а операція привласнення псевдопеременной ТНЕ_В мала бути застосовної тільки для еліпсів і тому фактично тип ELLIPSE мав представляти собою підтип типу CIRCLE Іншими словами, ці автори пропонували розгорнути ієрархію типів в протилежному напрямку Але досить задуматися лише на мить, щоб зрозуміти, що вказана ідея є непридатною, оскільки, зокрема, порушується принцип заменяемости (наприклад, що таке радіус еліпса загального вигляду)

Саме такі міркування, які були описані вище, привели деяких авторів до висновку, що насправді ніякої застосовної моделі спадкування не існує (див анотацію до [202]) Інші автори запропонували моделі успадкування з такими засобами, які суперечать здоровому глузду або, безумовно, є небажаними Наприклад, як показано в розділі 2010, стандарт SQL допускає наявність Некруглих кіл та інших подібних абсурдних обєктів (У стандарті SQL

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

Рішення задачі визначення моделі успадкування

Підводячи підсумок описаної вище ситуації, можна відзначити, що ми зіткнулися з описаною нижче дилемою

■ Якщо окружності успадковують оператори присвоювання псевдопеременним ТНЕ_А і ТНЕ_в від еліпсів, то можуть створюватися некруглі колу.

■ Спосіб запобігання появи некруглих кіл полягає в поддерж ке обмежень типу

■ Але якщо підтримуються обмеження типу, то оператори не можуть бути унасле довай

■ Отже, виявляється, що спадкування в кінцевому підсумку взагалі не існує

Як же вирішити цю дилему

Для цього може застосовуватися спосіб (який часто дозволяє вийти зі складної ситуації при обговоренні питань теорії реляційних баз даних), який полягає в тому, що слід визнати факт існування важливого логічного відмінності між значеннями і змінними і діяти відповідно з цим фактом Під виразом кожна окружність є еліпсом мається на увазі саме те, що кожне значення окружності є значенням еліпса Таким чином, цей вираз, безумовно, не означає, що кожна змінна окружності є змінною еліпса (змінна з оголошеним типом CIRCLE – це не змінна з оголошеним типом ELLIPSE і не може містити значення найбільш конкретного типу ELLIPSE) Іншими словами, спадкування застосовується до значень, а не до зміннихНаприклад, у разі еліпсів і кіл справедливі наведені нижче твердження

■ Як вже було зазначено, кожне значення колі являє собою значе ние еліпса

■ Тому всі операції, застосовні до значень еліпсів, застосовні також і до значень кіл

■ Але ні з одним значенням не можна виконати одну дію – змінити його Якби ми могли змінювати значення, то воно більше не було б значенням (Безумовно, ми можемо змінити поточне значення змінної, оновлюючи цю змінну, але ще раз повторюю не можемо змінити значення як таке)

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

■&nbsp&nbsp&nbsp&nbsp Операції тільки читання успадковуються значеннями і тому, в силу самого цього факту, поточними значеннями змінних (Оскільки очевидно, що операції лише то читання можуть на законних підставах застосовуватися до тих значень, які виявилися поточними значеннями змінних)

Ця більш точне формулювання дозволяє також пояснити, чому поняття поліморфізму і заменяемости відносяться саме до значень, а не до змінних Наприклад (просто, щоб освіжити це в памяті), відзначимо, що згідно з визначенням заменяемости, завжди можна замінити значення типу т, очікуване системою, значенням типу T , де T – підтип типу т (напівжирним шрифтом відзначені ключові слова цього визначення) І дійсно, даний принцип при першому знайомстві з ним був представлений саме якпринцип заменяемости значень (Тут також напівжирним шрифтом зазначено ключове слово)

Що в такому випадку можна сказати про операції оновлення За визначенням, такі операції відносяться до змінних, а не до значень Але чи означає це, що можна

стверджувати, ніби операції оновлення, застосовні до змінних типу ELLIPSE,

успадковуються змінними типу CIRCLE

Швидше за все, таке твердження буде неправильним, вірніше, не зовсім правильним Наприклад, операція привласнення псевдопеременной THE_CTR може застосовуватися до змінних обох оголошених типів, але (як було зазначено вище) операція присвоювання псевдопеременной ТНЕ_А такою не є Отже, спадкування операцій оновлення повинно бути умовним в дійсності, необхідно явно визначати, які саме операції оновлення успадковуються Як приклад можна вказати наведені нижче умови успадкування

■ Змінні оголошеного типу ELLIPSE мають оператори поновлення MOVE (це – версія, призначена для оновлення) і оператори присвоювання псевдопеременним ТНЕ_А, ТНЕ_В і THE_CTR

■ Змінні оголошеного типу CIRCLE мають оператори поновлення MOVE (це – версія, призначена для оновлення) і оператори присвоювання псевдопеременним THE_CTR і THE_R, але не псевдопеременной ТНЕ_А або ТНЕ_В

Примітка Оператор MOVE розглядався в попередньому розділі

Безумовно, якщо деяка операція оновлення успадковується, то ми маємо справу з тим різновидом поліморфізму і тим різновидом заменяемости, які відносяться до змінних, а не до значень Наприклад, версія оператора MOVE, призначена для оновлення, приймає фактичний параметр, який являє собою змінну оголошеного типу ELLIPSE, але цей оператор можна викликати і з фактичним параметром, який замість цього являє собою змінну оголошеного типу CIRCLE (але не з фактичним параметром, що є змінною оголошеного типу O_CIRCLE) Тому ми можемо (і повинні) з повним правом обговорювати ще один принцип – принцип заменяемости змінних, але слід враховувати, що цей принцип є більш обмежувальним, ніж принцип заменяемости значень, описаний вище

Джерело: Дейт К Дж, Введення в системи баз даних, 8-е видання: Пер з англ – М: Видавничий дім «Вільямс», 2005 – 1328 с: Ил – Парал тит англ

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


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

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

Ваш отзыв

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

*

*