Программирование >>  Хронологические базы данных 

1 ... 40 41 42 [ 43 ] 44 45 46 ... 348


RETURN ( P ) ; END ; END OPERATOR ;

OPERATOR POLAR ( R RATIONAL, THETA RATIONAL ) RETURNS ( POINT ) ; RETURN ( CARTESIAN ( R * COS ( THETA ),

R * SIN ( THETA ) ) ) ;

END OPERATOR ;

Обратите внимание на то, что при определении оператора POLAR используется оператор выбора CARTESIAN, а также встроенные операторы SIN и COS. Оператор POLAR можно определить и по-другому, непосредственно с помощью защищенных операторов.

OPERATOR POLAR ( R RATIONAL, THETA RATIONAL ) RETURNS( POINT ) ; BEGIN;

VAR P POINT ;

Х-компонент физического представления P := R * COS ( THETA ) ; У-компонент физического представления P := R * SIN ( THETA ) ; RETURN ( P ) ; END ; END OPERATOR ;

Защищенные операторы используются также определителем типа для реализации необходимых операторов ТНЕ .

OPERATOR ТНЕ Х ( Р POINT ) RETURNS ( RATIONAL ) ;

RETURN ( Х-компонент физического представления Р ) ; END OPERATOR ;

OPERATOR THE Y ( P POINT ) RETURNS ( RATIONAL ) ;

RETURN ( У-компонент физического представления P ) ; END OPERATOR ;

OPERATOR THE R ( P POINT ) RETURNS ( RATIONAL ) ; RETURN ( SQRT ( THE X ( P ) ** 2+ THE У ( P ) ** 2 ) ) ; END OPERATOR ;

OPERATOR THE THETA ( P POINT ) RETURNS ( RATIONAL ) ;

RETURN ( ARCTAN ( THE Y ( P ) / THE X ( P ) ) ) ; END OPERATOR ;

Здесь при определении операторов THE R и ТНЕ ТНЕТА используются операторы ТНЕ Х и THE Y, а также (встроенные по предположению) операторы SQRT и ARCTAN. Операторы THE R и ТНЕ ТНЕТА также можно определить непосредственно в терминах защищенных операторов. Предлагаем читателю сделать это самостоятельно в качестве упражнения.

На этом наше пространное обсуждение типа POINT можно считать завершенным. Однако следует понимать, что все вышесказанное применимо и к более простым типам, например к таким, как тип QTY. Вот несколько примеров использования оператора выбора для этого типа.



QTY (100) QTY (Q)

QTY ( ( Ql - Q2 ) * 2 )

Операторы THE этого типа могут использоваться следующим образом. THE QTY ( Q )

THE QTY ( ( Ql - Ql ) * 2 )

Отметим, в частности, что, поскольку каждое значение всегда принадлежит какому-либо типу, совершенно некорректно говорить, например, что количество деталей определенной поставки равно 100. Количество деталей - это значение типа QTY, а не INTEGER! В этом случае более правильно было бы сказать, что количество деталей равно QTY(IOO), а не просто 100. В неформальном контексте мы часто не заботимся о такой точности и употребляем число 100 как удобное сокращение для оператора выборки QTY(IOO). В частности, подобные сокращения использовались на рис. 3.8 (база данных поставщиков и деталей) и на рис. 4.5 (база данных поставщиков, деталей и проектов).

В завершение приведем пример определения типа LINESEG (отрезок).

TYPE LINESEG POSSREP ( BEGIN POINT, END POINT ) ;

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

Определение операторов

в этом разделе особое внимание будет уделено определению операторов. Для этого рассмотрим еще несколько примеров. В первом примере определяется пользовательский оператор для встроенного типа RATIONAL.

OPERATOR ABS ( Z RATIONAL ) RETURNS ( RATIONAL ) ; RETURN(CASE

WHEN Z > 0.0 THEN +Z WHEN Z < 0.0 THEN -Z END CASE ) ; END OPERATOR ;

Оператор ABS (модуль числа) определен для одного параметра Z типа RATIONAL и возвращает значение того же типа (другими словами, такое выражение, как ABS (АМТ1 -АМТ2), принадлежит типу RATIONAL).

В контексте языка SQL мы делаем то же самое, но по другой причине, а именно - потому, что в языке SQL не поддерживаются (пока) типы, определенные пользователем (см. приложение Б).



в следующем примере для определения оператора DIST (вычисления расстояния между двумя точками) применяются типы данных, установленные пользователем.

OPERATOR DIST ( Pi POINT, P2 POINT ) RETURNS ( LENGTH ) ; RETURN ( WITH THE X( Pi ) AS XI , THE X( P2 ) AS X2 , THE Y( PI ) AS Yl , THE Y( P2 ) AS Y2 : LENGTH ( SQRT ( ( XI - X2 ) ** 2 + ( Yl - Y2 ) ** 2 ) ) ) ; END OPERATOR ;

Здесь предполагается, что LENGTH - это определенный пользователем тип с допустимым представлением RATIONAL. Обратите внимание на то, что для использования в соответствующих выражениях сокращенных имен употребляется предложение WITH.

В следующем примере рассмотрен оператор равенства = для типа POINT.

OPERATOR EQ ( Pi POINT, P2 POINT ) RETURNS ( BOOLEAN ) ; RETURN ( THE X ( PI ) = THE X ( P2 ) AND THE~Y ( PI ) = THE Y ( P2 ) ) ; END OPERATOR ;

Обратите внимание, что в выражении оператора RETURN используется встроенный оператор = для типа RATIONAL. Далее с целью упрощения будем считать, что обычное инфиксное обозначение = используется для оператора равенства (для всех типов, в частности и для типа POINT). Практическое определение данного инфиксного обозначения рассматриваться не будет, поскольку это всего лишь вопрос синтаксиса.

Оператор < для типа QTY определяется следующим образом.

OPERATOR LT (Q1 QTY, Q2 QTY ) RETURNS ( BOOLEAN ) ;

RETURN ( THE QTY ( Ql ) < THE QTY ( Q2 ) ) ; END OPERATOR ;

Здесь в выражении оператора RETURN используется встроенный оператор < для типа INTEGER. И опять же, с этого момента и далее будем считать, что обычное инфиксное обозначение < используется для этого оператора по отношению ко всем упорядоченным типам, каковым, в частности, является и тип QTY. (По определению упорядоченным типом называется тип, для которого применим оператор < . Простейшим примером неупорядоченного типа может служить тип POINT.)

Рассмотрим пример определения оператора обновления (во всех предыдущих примерах операторы были операторами считывания). Мы увидим далее, что в теле определения таких операторов вместо слова RETURNS используется слово UPDATES. Операторы обновления значений не возвращают и должны активизироваться с помощью явных вызовов CALL [3.3].

Операторы считывания и обновления также называются наблюдателями и мутаторами соответственно, особенно в объектных системах (см. часть IV этой книги).



1 ... 40 41 42 [ 43 ] 44 45 46 ... 348

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика