Главная » SQL, Базы данных » УТОЧНЕНИЕ С ПОМОЩЬЮ ОГРАНИЧЕНИЯ

0

Рассмотрим следующий пример вызова селектора для типа ELLIPSE.

ELL IP SE ( L ENG TH ( 5 . 0 ), L E N G T H ( 5 . 0 ) , PO INT ( . . . ) )

Это выражение возвращает эллипс с равными полуосями. Но в реальном мире эллипс с равными полуосями фактически представляет собой окружность, поэтому можно ли рассчитывать на то, что данное выражение возвратит результат наиболее конкретного типа CIRCLE, а не просто наиболее конкретного типа ELLIPSE?

Вопросы, подобные этому, вызвали публикацию в литературе  многочисленных  откликов, зачастую выражающих противоположные мнения (а фактически эта дискуссия все еще продолжается [20.6]). После тщательных размышлений автор в определении своей собственной модели решил настаивать на том, что указанное выражение должно возвращать результат наиболее  конкретного типа CIRCLE. Более общее определение этого подхода состоит в следующем: если тип T’ представляет собой подтип типа т, а вызов селектора для типа Т возвращает значение, которое удовлетворяет ограничению типа для типа T’,  то (в рассматриваемой модели) результат этого вызова селектора относится к типу T’. Теперь (ко времени написания данной книги) лишь немногие из современных коммерческих продуктов (если вообще таковые имеются) фактически действуют указанным образом, но автор рассматривает этот факт как упущение со стороны разработчиков данных продуктов. В частности, в [3.3] показано, что вследствие данного упущения подобные  системы  вынуждены  поддерживать  "некруглые  окружности",  "неквадратные квадраты" и аналогичные абсурдные  объекты, тогда как эти критические замечание не относятся к предлагаемому автором подходу.

Примечание. См. также описание второго серьезного заблуждения в главе 26.

Из приведенного выше следует, что ни одно значение наиболее конкретного  типа ELLIPSE не должно характеризоваться таким значением длин полуосей а и b, при котором а = b (по меньшей мере, в предложенной автором модели); иными словами, значения наиболее конкретного типа ELLIPSE ДОЛЖНЫ ТОЧНО соответствовать тем эллипсам реального мира, которые действительно не являются окружностями. В отличие от этого, в других моделях наследования значения наиболее конкретного типа ELLIPSE соответствуют таким

эллипсам реального мира, которые могут быть или не быть окружностями. Поэтому автор надеется, что предложенная им модель немного ближе к такому определению, как "достоверная модель реального мира".

Наконец, идея о том, что, например, эллипс с полуосями а = b должен относиться к типу CIRCLE, известна под названием уточнения с помощью ограничения (specialization

by constraint) [3.3], но мы обязаны предупредить читателя, что другие авторы используют этот термин или очень близкий к нему для обозначения совсем другого понятия

(см., например, [20.10], [20.14]).

Дополнительные сведения о псевдопеременных ТНЕ_

Как было описано в главе 5, псевдопеременные ТНЕ_ предоставляют способ обновления одного компонента переменной, притом что другие компоненты остаются неизменными (под "компонентами" здесь подразумеваются компоненты некоторого возможного представления, а не обязательно физического представления). Например, предположим, что переменная Е относится к объявленному типу ELLIPSE, а текущее значение Е представляет собой эллипс (скажем) с полуосью а, равной пяти, и полуосью Ь, равной трем. В таком случае  приведенный ниже оператор присваивания обновляет значение длины полуоси b переменной Е (после чего эта длина становится равной четырем), не изменяя значение полуоси или положение центра.

ТНЕ_В                                        (    Е    )                                         :=    LENGTH                                        (     4 . 0                                        )     ;

Итак, из этого следует вывод, что псевдопеременные ТНЕ_ фактически не требуются; они в действительности представляют собой просто сокращения (что было также отмечено в главе 5). Например, приведенный выше оператор присваивания, в котором используется псевдопеременная ТНЕ_, эквивалентен  следующему, в котором она не используется.

Е := ELLIPSE ( ТНЕ_А ( Е ), LENGTH ( 4.0 ), THE_CTR ( E ) ) ;

Поэтому рассмотрим следующий оператор присваивания.

ТНЕ _ В                                          (                                        Е                                        )                                           : =                                        LE NG T H                                          (   5   .   0   )

По определению этот оператор присваивания эквивалентен приведенному ниже. Е := ELLIPSE ( ТНЕ_А ( Е ), LENGTH ( 5.0 ), THE_CTR ( E ) ) ; Таким  образом,  вступает  в  силу  принцип  уточнения  с  помощью  ограничения

(поскольку выражение в правой части возвращает эллипс с полуосями а = b), и общий

эффект состоит в том, что после присваивания типом MST(E) становится CIRCLE, а не

ELLIPSE.

Затем рассмотрим следующий оператор присваивания.

ТНЕ_В                                        (    Е    )                                         :=    LENGTH                                        (    4 . 0     )                                        ;

Теперь переменная Е содержит эллипс с полуосью а, равной пяти, и полуосью b, равной четырем, а тип MST (Е) снова становится типом ELLIPSE, т.е. по существу происходит действие, которое автор называет обобщением с помощью ограничения (generalization by constraint).

Примечание. Предположим, что (как и в конце раздела 20.4) тип CIRCLE имеет строгий подтип O_CIRCLE (где "О-окружность" представляет собой окружность с центром в начале координат) с приведенным ниже определением.

TYPE O_CIRCLE IS CIRCLE

CONSTRAINT THE_CTR ( CIRCLE ) = POINT ( 0.0, 0.0 ) POSSREP { R = THE_R ( CIRCLE ) } ;

В таком случае текущее значение переменной Е в некоторый заданный момент времени может относиться к наиболее конкретному типу O_CIRCLE, а не  просто к типу CIRCLE. Предположим, что так оно и есть, и рассмотрим приведенную ниже последовательность операторов присваивания7.

ТНЕ_А ( Е ) := LENGTH (7.0 ) ;

ТНЕ_В ( Е )  := LENGTH (7.0 ) ;

После первого из этих присваиваний Е содержит "просто эллипс" благодаря обобщению с помощью ограничения. Но после второго присваивания она снова содержит окружность, но является ли последняя именно О-окружностью или  "просто окружностью"? Безусловно, желательно, чтобы это была именно О-окружность. И разумеется, так оно и есть, поскольку данное значение удовлетворяет ограничению типа O_CIRCLE (включая ограничение, унаследованное этим типом от типа CIRCLE).

Побочные следствия изменения типов

Снова предположим, что Е — переменная объявленного типа ELLIPSE. Выше было описано, как изменить тип Е, чтобы эта переменная рассматривалась "как находящаяся на более низком уровне иерархии типов" (например, если ее текущим наиболее конкретным типом является ELLIPSE, ТО  значение этой переменной  можно обновить таким образом, чтобы ее текущим наиболее конкретным типом стал CIRCLE). Кроме того, в этой главе было показано, как изменить тип переменной Е, чтобы она рассматривалась "как находящаяся на более высоком уровне иерархии типов" (например, если ее текущим наиболее конкретным  типом является CIRCLE, значение этой переменной можно обновить таким образом, чтобы ее текущим наиболее конкретным типом стал ELLIPSE). А какие  побочные эффекты вызывает такое изменение типа? Предположим, что рассматриваемый пример будет дополнен таким образом, что тип ELLIPSE имеет два непосредственных подтипа8, CIRCLE и NONCIRCLE, смысл которых является  очевидным.

Не углубляясь в излишние подробности, можно сделать приведенные ниже выводы.

■     Если текущее значение переменной Е относится к типу CIRCLE (поэтому а = b), такое обновление Е, в результате которого становится истинным условие а  >b, повлечет за собой то, что MST (Е) станет равным NONCIRCLE.

■     Если текущее значение переменной Е относится к типу NONCIRCLE (поэтому а > b), такое обновление Е, в результате которого становится истинным условие а = b, по влечет за собой то, что MST(E) станет равным CIRCLE.

Таким образом, при конкретизации с помощью ограничений учитываются также побочные эффекты изменения типов.

7  Если бы поддерживалось множественное присваивание, можно было бы выполнить эту последова тельность операций в виде одной операции.

8  Кстати, следует отметить, что теперь тип ELLIPSE становится объединенным типом. См. раздел 20.7.

Примечание. Если читатель задумался над следующим вопросом, но не нашел на него ответ, отметим, что такое обновление Е, при котором выполняется условие а < Ь, является невозможным (оно нарушает ограничение, налагаемое на тип ELLIPSE).

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

По теме:

  • Комментарии