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

8.2. Ограничения типа

По существу, ограничение типа является перечнем (или логическим эквивалентом перечня) допустимых значений типа. Вот простой пример ограничения типа для типа WEIGHT (Вес).

TYPE WEIGHT P0SSREP ( RATIONAL )

CONSTRAINT THE_WEIGHT ( WEIGHT ) > 0.0 ;

Мы принимаем очевидное соглашение, по которому в ограничении типа можно ис­пользовать подходящее имя типа, призванное обозначить произвольное значение рас­сматриваемого типа. В данном случае допустимы только такие значения веса детали, которые могут быть представлены рациональным числом, большим нуля. Любое вы­ражение, в котором предполагается определение веса, но в результате вычисления ко­торого получается значение, не удовлетворяющее приведенному выше ограничению, будет отвергнуто.

Замечание. Если вам необходимо восстановить в памяти назначение операторов POSSREP и THE , возвратитесь к главе 5.

Напомним, что ограничение типа является, в общем, просто перечнем значений, ко­торые составляют данный тип. Следовательно, в языке Tutorial D мы связываем такие ограничения с определениями соответствующих типов и идентифицируем их посредст­вом соответствующего имени типа. (Поэтому ограничение типа может быть упразднено лишь в том случае, если будет исключен сам тип.)

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

Вот еще один пример ограничения типа.

TYPE POINT POSSREP CARTESIAN ( X RATIONAL, Y RATIONAL ) CONSTRAINT ABS ( THE X (POINT) ) < 100.0 AND ABS ( THE~Y (POINT) ) < 100.0 ;

Здесь контроль типа осуществляется (концептуально) в результате обращения к опе­ратору выбора CARTESIAN. Обратите внимание на применение определенного пользова­телем оператора ABS (см. раздел 5.2 главы 5).

Приведем более сложный пример — определение типа компонентов эллипса.

TYPE ELLIPSE POSSREP ( A LENGTH, В LENGTH, CTR POINT ) CONSTRAINT THE_A ( ELLIPSE ) > THE_B ( ELLIPSE ) ;

Здесь представлены возможные компоненты, а именно — А, В и CTR, которые соот­ветствуют длине большой полуоси а, длине малой полуоси b и точке центра ctr рассмат­риваемого эллипса. Предположим, что скалярная переменная Е объявлена с типом ELLIPSE, ее текущее значение длины большой полуоси равно 5, а значение длины малой полуоси равно 4. Теперь рассмотрим следующее присвоение.

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

Замечание. В этом примере скалярная переменная и операция скалярного присвоения используются исключительно из соображений упрощения, поэтому вместо них с тем же успехом можно было использовать, скажем, переменную-отношение и операцию реля­ционного присвоения.

Это присвоение, как и следует ожидать, будет отвергнуто, однако ошибочным явля­ется не само присвоение как таковое. Ошибка будет зафиксирована, опять же, при вы­полнении оператора выбора (хотя никакого прямого вызова подобного оператора в при­

своении не видно), поскольку в действительности данное присвоение является сокраще­нием следующего выражения3.

Е := ELLIPSE { ТНЕ_А ( Е ), LENGTH ( 6.0 ), THE_CTR ( Е ) ) ;

Здесь в правой части операции присвоения явно показано обращение к оператору вы­бора, при выполнении которого и будет зафиксирована ошибка.

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