Скачиваний:
82
Добавлен:
02.05.2014
Размер:
2.28 Mб
Скачать

19.10. Резюме

В этой главе были кратко рассмотрены основные понятия модели наследования ти- пов. Если тип В является подтипом типа А (или, что равносильно, если тип А является супертипом типа В), то каждое значение типа В также является значением типа А. Поэто- му операторы и ограничения, которые применимы к значениям типа А, будут также при- менимы к значениям типа В. Но, кроме того, будут существовать операторы и ограниче- ния, которые применимы к значениям типа В и не применимы к значениям, относящимся лишь к типу А. Мы различили одиночное и множественное наследования (но обсуждали только одиночное наследование), наследование скалярных значений, кортежей и от- ношений (но рассматривали только наследование скалярных значений) и ввели понятие иерархии типа. Мы также дали определение понятия действительного подтипа или супертипа, непосредственного подтипа или супертипа, корневого и листового типов, а также ввели допущение о несвязанности, согласно которому типы Т1 и Т2 не связаны, если ни один из них не является подтипом другого. Вследствие этого допущения каждое значение имеет уникальный конкретный тип (необязательно листовой).

Далее речь шла о концепции включаемого полиморфизма и заменимости значений, причем оба эти понятия логически следуют из основной концепции наследования. Мы различали включаемый полиморфизм (который связан с наследованием) и перегру- жаемый полиморфизм (который с наследованием не связан). Было показано, как благо- даря связыванию во время выполнения включаемый полиморфизм может способст- вовать повторному использованию кода.

Затем обсуждалось влияние наследования на операции присвоения. Основное сде- ланное нами допущение заключается в том, что никаких преобразований типа не проис- ходит, т.е. значения имеют свои конкретные типы и при их присвоении переменным с менее конкретным объявленным типом. Поэтому переменная объявленного типа Т может иметь значение, конкретный тип которого — один из подтипов типа Т. (Аналогично, ес- ли оператор Ор определен с результатом объявленного типа Т, то результат реального вызова оператора Ор может быть значением, конкретный тип которого— это один из подтипов типа Т.) Следовательно, мы моделируем скалярную переменную V или в более общем случае произвольное скалярное выражение, как упорядоченную тройку вида <DT,MST,v>, где DT — объявленный тип, MST — текущий конкретный тип и v — текущее значение. Дополнительно был введен оператор TREAT DOWN, позволяющий выполнять операции, которые в противном случае приводили бы к ошибкам во время компиляции. Это операции с выражениями, конкретный тип которых во время выполнения является подтипом их объявленного типа. (Ошибки во время выполнения по-прежнему могут иметь место, но теперь лишь в контексте оператора TREAT DOWN.)

После этого более детально были рассмотрены операторы выбора. Мы убедились, что вызов оператора выбора для типа Т иногда дает в результате значение, тип которого является собственным подтипом типа Т (по крайней мере в нашей модели, хотя в совре- менных коммерческих продуктах этого обычно не наблюдается). Такой механизм полу- чил название специализация по ограничениям. Также подробно обсуждались операто- ры вида THE_псевдопеременная. Поскольку они представляют собой лишь сокращенную запись, при выполнении оператора присвоения THE псевдопеременная могут существо- вать как специализация по ограничениям, так и обобщение по ограничениям.

Далее рассматривались ситуации, возможные при выполнении сравнения значений подтипов и супертипов, а также при выполнении реляционных операций соединения, объединения, пересечения и разности. Дополнительно было введено несколько опера- торов проверки типа: IS_T, IS MS Т и т.д. Затем обсуждались вопросы, касающиеся операторов только для чтения и операторов обновления, версий операторов и сиг- натур операторов. При этом было указано, что возможность определять различные вер- сии оператора открывает лазейку для изменения семантики данного оператора (но в нашей модели такие изменения запрещены).

И наконец был рассмотрен дискуссионный вопрос "Являются ли окружности на са- мом деле эллипсами?". В результате было сделано заключение, что наследование при- менимо к значениям, а не к переменным. Точнее, операторы, предназначенные только для чтения (которые применимы к значениям), могут наследоваться все без исключения и без каких-либо проблем, но операторы обновления (которые применимы к перемен- ным) могут наследоваться лишь условно. (Наша модель не соответствует большинству подходов. При иных подходах обычно требуется, чтобы операторы обновления наследо- вались безусловно, зато после возникает множество проблем, когда приходится иметь

дело с "некруглыми окружностями" и другими подобными нелепостями.) Завершилось обсуждение выводом, что специализация по ограничениям, на наш взгляд, — это един- ственный допустимый способ определения подтипов.

Упражнения

19.1. Дайте определение следующим терминам.

заменимость полиморфизм

корневой тип связывание во время выполнения

листовой тип сигнатура

непосредственный подтип скалярный тип

нескалярный тип собственный подтип

обобщение по ограничениям специализация по ограничениям

повторное использование кода фиктивный тип

  1. Объясните действие оператора TREAT DOWN.

  2. Каковы отличия между следующими понятиями.

а)

аргумент

и

параметр

б)

объявленный тип

и

текущее конкретное значение

в)

включаемый полиморфизм

и

перегружаемый полиморфизм

г)

сигнатура вызова

и

сигнатура определения и сигнатура версии

д)

оператор только чтения

и

оператор обновления

значение

и

переменная

  1. Используя иерархию типов, изображенную на рис. 19.1, рассмотрите значение е, которое имеет тип ELLIPSE. Каков конкретный тип е — ELLIPSE или CIRCLE? Каков наименее конкретный тип е?

  2. Любая заданная иерархия типов включает несколько подыерархий, каждая из ко- торых может рассматриваться как отдельная иерархия типов. Например, иерархия типов, получаемая на рис. 19.1 посредством удаления типов PLANE FIGURE, ELLIPSE и CIRCLE (только), может считаться независимой. То же самое можно сказать об иерархии, получаемой посредством удаления типов CIRCLE, SQUARE и RECTANGLE (только). С другой стороны, иерархия, полученная посредством удаления типа ELLIPSE (только), не может считаться единой иерархией типов (по крайней мере, не может считаться иерархией, производной от иерархии, которая показана на рис. 19.1), поскольку тип CIRCLE выпал из цепочки наследования, если судить по исходной иерархии. Вопрос: "Сколько различных иерархий типов (в указанном смысле) присутствует на рис. 19.1 ?".

  3. Используя синтаксис, кратко изложенный в этой главе, дайте определения типов RECTANGLE (Прямоугольник) и SQUARE (Квадрат) (для простоты считайте, что все прямоугольники имеют центр в начале координат, но их стороны необязательно

;i расположены только вертикально или горизонтально).

  1. Давая ответ к упр. 19.6, определите оператор поворота указанного прямоугольника на 90° вокруг его центра. Также представьте явную специализацию этого операто- ра для квадратов.

  2. Повторим формулировку примера из раздела 19.6: "Пусть переменная-отношение R имеет атрибут А объявленного типа ELLIPSE и требуется выбрать из нее такие кортежи, в которых значение атрибута А в действительности является окружностью с радиусом, большим 2". Для данного запроса в разделе 19.6 была дана следующая формулировка.

R : IS_CIRCLE ( А ) WHERE THE_R ( А ) > LENGTH ( 2.0 )

а) Почему нельзя просто поместить выражение проверки типа в предложение WHERE, например так, как показано ниже?

R WHERE IS_CTRCLE ( А ) AND THE_R ( А ) > LENGTH ( 2.0 )

б) Вот еще один пример возможной формулировки запроса. R WHERE CASE

WHEN IS CIRCLE ( A ) THEN

THE R { A ) ( TREAT_DOWN_AS_CIRCLE ( A ) )

> LENGTH ( 2.0 ) WHEN NOT { IS CIRCLE ( A ) ) THEN FALSE END CASE

Верна ли эта формулировка? Если нет, то почему?

19.9. В [3.3] предлагается поддержка реляционных выражений следующего вида. R TREAT_DOWN_AS_T ( А )

Здесь R — реляционное выражение, А — атрибут отношения (скажем, г), обозна- чаемый этим выражением, и Т — некоторый тип. Объявленный тип DT(Aj атрибута А должен быть супертипом типа Т (проверка типа во время компиляции). Значение всего выражения определяется как отношение со следующими свойствами.

а) Его заголовок такой же, как заголовок отношения г, но тип атрибута А в нем — Т.

б) Его тело составляют те же кортежи, что в отношении г, но значение атрибута А в каждом из таких кортежей должно рассматриваться как относящееся к типу Т.

Напомним, что приведенный оператор TREAT DOWN является просто сокращением. Но сокращением чего именно?

19.10. Выражение вида R:IS_T(A) также является сокращением. Сокращением чего именно?

Список литературы

19.1. Atkinson М.Р. et al. The Object-Oriented Database System Manifesto // Proc. First International Conference on Deductive and Object-Oriented Databases. — Kyoto, Japan, 1989. New York, N.Y.: Elsevier Science. — 1990.

Относительно отсутствия согласия (как уже отмечалось в разделе 19.1) по вопросу, что должна собой представлять настоящая модель наследования, авторы настоя- щей статьи высказываются так: "Имеется по крайней мере четыре типа наследова- ния: наследование заменимости, включаемое наследование, наследование ограни-

чений и наследование специализации... Различные уровни этих четырех типов на- следования предоставляются существующими системами и прототипами, и мы не предписываем конкретный стиль наследования".

Далее приводится еще несколько цитат, которые дополняют ту же основную мысль.

  • В [19.4] Кливленд (Cleaveland) пишет: "[Наследование может] основываться на [множестве] различных критериев, и не существует какого-либо общепринятого стандартного определения". Он также предлагает восемь возможных интерпре- таций. (Мейер в [19.8] дает двенадцать.)

  • Баклавски (Baclawski) и Индурхия (Indurkhya) в [19.2] пишут: "Язык програм- мирования [просто] предоставляет множество механизмов [наследования]. По- ка эти механизмы, безусловно, ограничивают и возможности языка, и возмож- ные представления наследования... они не допускают для самих себя некоторые представления наследования. Классы, специализации, обобщения и наследова- ние— это только понятия, и... они не имеют всеобщего объективного значе- ния... Отсюда следует, что то, как наследование будет включено в конкретную систему, зависит от проектировщиков [данной] системы; именно это составляет стратегию разработки, которая должна быть реализована с помощью доступных механизмов". Другими словами, нет никакой модели!

  1. Baclawski К., Indurkhya В, Technical Correspondence // САСМ. — September, 1994. —37, №9.

  2. Cardelli L., Wegner P. On Understanding Types, Data Abstraction, and Polymorphism // ACM Сотр. Surv. — December, 1985. — 17, № 4.

  3. Cleaveland G.J. An Introduction to Data Types. — Reading, Mass.: Addison-Wesley, 1986.

  4. Date C.J. Серия статей по наследованию типов на Web-узле DBP&D ww.dbpd.com. — 1999.

Статьи публиковались с февраля 1999 года. Это расширенная учебная разработка (с историческими примечаниями) модели наследования, описанной в настоящей главе и определенной более формально в [3.3].

19.6. Date C.J., Darwen Н. Toward a Model of Type Inheritance // САСМ. — December, 1998,—41, № 12.

Короткая заметка, содержащая перечень основных особенностей нашей модели наследования.

19.7. Mattos N., DeMichiel L.G. Recent Design Trade-Offs in SQL3 // ACM SIGMOD.— December, 1994. — Record 23, № 4.

В статье обосновывается решение разработчиков не поддерживать в SQL3 ограни- чения типа (это обоснование базируется на аргументе, который был выдвинут ра- нее Здоником (Zdonik) и Мейером (Maier) в [19.11]). Однако мы не согласны с та- ким обоснованием. Фундаментальная проблема заключается в том, что в нем не- верно различаются значения и переменные (см. упр. 19.3).

  1. Meyer В. The Many Faces of Inheritance: A Taxonomy of Taxonomy // IEEE Computer. — May, 1996. — 29, № 5.

  2. Rumbauch J. A Matter of Intent: How to Define Subclasses // Journal of Object-Oriented Programming. — September, 1996.

Как указывалось в разделе 19.9, мы придерживаемся мнения, что специализа- ция ограничением — это единственный логически допустимый способ опреде- ления подтипов. Поэтому интересно отметить, что объектный мир (по крайней мере, часть его обитателей) занимает прямо противоположную позицию. Про- цитируем автора настоящей публикации: "Класс SQUARE — это подкласс класса RECTANGLE? ...Растяжение прямоугольника по оси X вполне допустимо. Но ес- ли то же самое сделать с квадратом, он перестанет быть квадратом. Концепту- ально это не обязательно плохо. Когда вы вытягиваете квадрат, получается прямоугольник... Но... большинство объектно-ориентированных языков не до- пускают, чтобы объекты меняли свой класс... Поэтому предлагается следую- щий принцип проектирования для систем классификации: Подкласс не должен быть определен через ограничения суперкласса".

Замечание. Как объясняется в главе 24, в объектном мире часто используется тер- мин класс для понятия, которое мы называем типом.

Нас поражает, что автор принимает указанную позицию просто потому, что объ- ектно-ориентированные языки "не допускают, чтобы объекты меняли свой класс". Мы бы скорее побеспокоились о получении, прежде всего, правильной модели, а не о соответствии конкретной реализации. 19.10.Taivalsaari A. On the Notion of Inheritance // ACM Сотр. Surv.— September, 1996, —28, №3.

19.11. Zdonik S.B., Maier D. Fundamentals of Object-Oriented Databases в [24.52]).

Ответы к некоторым упражнениям

19.3. Рассмотрим лишь п. е (значение и переменная), поскольку это фундаментальные понятия и они еще явно нигде в книге не рассматривались. (Следующие определе- ния взяты из [3.3].)

  • Значение— это "отдельная константа" (например, отдельная константа "3"). Значение не имеет никакого места расположения во времени или пространст- ве. Однако значения могут иметь в памяти некоторые кодированные представле- ния, и такие представления, конечно, имеют место расположения во времени и пространстве (см. следующий абзац). Отметим, что по определению значение не может быть изменено. Иначе, если бы это было возможно, после такого изме- нения оно бы не было больше таким значением (вообще).

  • Переменная — это хранитель кодированного представления некоторого значе- ния. Она имеет место расположения во времени и пространстве. Также перемен- ные в отличие от значений, конечно же, могут быть обновлены, т.е. текущее зна- чение переменной может быть заменено другим значением, возможно, отличным от предыдущего. (Безусловно, после выполнения операции обновления данная переменная остается той же переменной.)

Кстати заметим следующее: важно понимать, что значение не обязательно должно быть таким же простым, как целое число "3". Наоборот, значения могут быть сколь угодно сложными. Например, значение может быть массивом, стеком, списком, отношением, геометрической точкой, эллипсом, Х-лучом, документом, отпечатком пальца и т.д. Аналогичное замечание, конечно, справедливо и для переменных.

  1. Наименее конкретный тип любого значения любого типа, показанный на рис. 19.1, — это, конечно, PLANE_FIGURE.

  2. Всего 22 иерархии. В их число включена и пустая иерархия.

  3. Исходя из того, что все прямоугольники имеют центр в начале координат, каждый заданный прямоугольник может однозначно идентифицироваться любыми двумя смежными вершинами (скажем, А и В), а заданный квадрат может однозначно идентифицироваться любой отдельной вершиной (скажем, А). Чтобы определиться более точно, будем считать, что А — вершина в правом верхнем квадранте плоско- сти (х > 0, у > 0), а В— вершина в ее правом нижнем квадранте (х > 0, у < 0). Тогда типы RECTANGLE и SQUARE можно определить следующим образом.

TYPE RECTANGLE POSSREP ( A POINT, В POINT ) ... ;/

TYPE SQUARE POSSREP ( A POINT )

CONSTRAINT ( THE_X ( THE A ( SQUARE ) ) =

- THE Y { THE~B ( SQUARE ) ) AND

THE~Y { THE~A ( SQUARE ) ) =

THEJC ( THE~B ( SQUARE ) ) ) ;

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

OPERATOR ROTATE ( R RECTANGLE ) UPDATES ( R ) VERSION ROTATE RECTANGLE ; BEGIN ;

VAR P POINT ; VAR Q POINT ; P := THE A ( R ) ; Q := THE~B ( R j ;

the

x

the a

r ) )

:= the y

q

)

the"

"y

the~a

r ) )

:= the~x

q

)

the"

"x

the~B

r ) )

:= the~y

)

the"

"y

the~B

r ) )

:= the~x

)

RETURN ; END ; END OPERATOR ;

OPERATOR ROTATE ( S SQUARE ) UPDATES ( S )

VERSION ROTATE_SQUARE ;

RETURN ; END OPERATOR ;

19.8.

а) Указанное выражение приведет к ошибке несоответствия типа во время компи- ляции, поскольку для оператора THE_R требуется, чтобы аргумент имел тип CIRCLE, а объявленный тип атрибута А был ELLIPSE, а не CIRCLE. (Конечно, если проверка типа во время компиляции будет отсутствовать, мы получим ошибку

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

б) Указанное выражение допустимо, однако оно дает в результате отношение с таким же заголовком, как и заголовок переменной-отношения R, но в этом от- ношении объявленный тип атрибута А — CIRCLE, а не ELLIPSE.

19.9. Выражение служит сокращенной записью выражения такого вида.

( ( EXTEND ( R ) ADD ( TREAT DOWN AS_T ( A ) ) AS A' )

{ ALL ВОТ A } RENAME A' AS A

Здесь A' — произвольное имя, не появляющееся в качестве имени атрибута в ре- зультате вычисления реляционного выражения R.

19.10. Выражение служит сокращенной записью выражения такого вида. ( R WHERE IS_T ( А ) ) TREAT_DOWN_AS_T ( А )

Более того, это последнее выражение само является сокращенной записью для бо- лее длинного выражения, что было показано в ответе к упр. 19.9.

Глава

Распределенные базы данных

Соседние файлы в папке Дейт К. Дж. Введение в системы баз данных [7 издание]