Программирование >>  Реляционные базы данных 

1 ... 110 111 112 [ 113 ] 114 115 116 ... 125


8.1 Свойства ODL, связанные с запросами 339

Функция может порожд<1ть исключение noLengtfiFomd. Вероятно, оно возникает тогда, когда атрибут length объекта, к которому применяется метод lengthlnHours, имеет неопределенное значение, не способное выразить правильную продолжительность (например, отрицательное число).

Обратите внимание: в описании нет ничего, что тревочало бы от метода выполнения того, что следует нз его имени. Например, можно реализовать метод lengthlnHours с помошью функции, всегда возврашаюшей 3.14159 независимо от объекта отношения Movie, к которому она применяется. Можно также реализовать его п виде функции, возврашаюшей квадрат продолжительности фильма, переведенный в число с плаваюшей точкой. Здесь применима любая функция, которая не использует аргументов (кроме объекта, к которому оиа применяется), возврашает число с плаваюшей точкой и не порождает никаких исключений, кроме noLenglhFound.

На строке (11) находится сигнатура другою метода-функш1И slarNames. У этой функции нет возврашаемого значения, но она имеет параметр вывода, типом которого является множество строк. Предполагается, что значением параметра, вычисляемого этой функцией, служит множество строк, яиляющи.хся значениями атрибута name, к которому применяется данный метод. Однако нет никакой гарантии, что реализуемая функция действует именно так.

И наконец, на строке (12) находится третий метод otherMovles. .Эта функция имеет параметр ввода типа Star Возможна следующая ее реализация. Функция предполагает, что данная кинозвезда снимается в фильме. Если это не так, порождается исключение noSuchStar. Если же кинозвезда участвует в фильме, к которому применяется метод, тогда множество всех других фильмов, где снималась эта кинозвезда, приписывается в качестве значения параметру вывода, типом которого является множество фильмов. □

8.1.3 Экстент класса

Для каждого класса (интерфейса) ODL можно определить его экстент ~ имя текущего множесгва объектов этого класса. Экстент описывается ключевы.м словом extent, за которым следует выбранное имя. Это описание должно стоять непосредственно за именем интерфейса (класса).

По существу, экстент класса анало1ичен имени отношения, а само определение класса аналогично описанию типов атрибутов этого отношения. Как будет показано далее, запросы OQL относятся к степени класса, а не к его имени.

Пример 8.2. Строка (2) на рис. 8.1 иллюстрирует определение степени класса Movie. Имя этой степени - Movies. Значением Movies всегда является множество всех объектов класса Movie, существующих в БД в данный момент. О

8.1.4 Упражнения к разделу 8.1

Ипрожненне 8.1.1. Рис, 8.2 - это описание, в котором все три типа продуктов сделаны подклассами главного класса Product. Тип продукта можно получить или из атрибута type, или из подкласса, к которому он принадлежит. Этот метол не самый лучший, так как он допускает возможность совпадения атрибута type объекта РС с laptop или printer. Однако он обеспечивает шгтерссные режимы выражения запросов.

Поскольку Printer наследует type из суперкласса Product, необходимо переименовать атрибут type класса Printer в printerType. Последний выражает способ печати (например, лазерный или струйный), а type из Product имеет значения типа ПК. ПК-блокнот или принтер.

Добавьте к профамме ODL (рис. 8.2) сигнатуры методов, подходящие для функций, выполняющих следующие задачи:

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



attribute integer model; attribute string maiufacturer; attribute string type, attribute real price;

interface PC : Product (extent PCs)

attribute integer speed; attribute integer ram; attribute integer hd; attribute string cd;

interface Laptop; Product (extent Laptops)

attr bute integer speed; attnbute integer ram; attr bute integer hd; attr bute real screen;

interface Printer: Product (extent Pnnters)

attribute boolean color; attribute string printerType;

Рис. 8.2. CteMo Product s OX

*b) Возвратите скорость продукта, если им является ПК или ПК-блокнот, и rcHepHpyflTe исключение notComputer в противном случае.

с) Установите размер экрана П К-блокнота в определенное значение ввода v.

!d) Для заданного продукта р определит, имеет ли продукт q, к которому применяется метод, более высокую скорость и меньшую цену, чем продукту. Генериру[1те исклюение badlnput, если продукт р не имеет скорости (т.е. не является ни ПК, ни П1\.-6локногом), и исключение noSpeed. если продукт q не имеет скорости.

Упражнение 8.1.2. Рис. 8.3 -это описание ODL БД боевых кораблей. Добавьте к нему сле1уошие сиг11ат1ры четолов:

a) Вычислите огневую мошь корабля, те. ч-юло орудий, умноженное на куб 11\ калибра

b) Найд 1те кора6ли- близнецы для каждого корабля. Генерируйте исключе-нне noSisters, если корабль является единственным в своем классе

c) ПЛ1Н11мзя сражение Л в качес1ве параметра и приме! яя метол к кораблю s, найдите корабли, потопленные в сражении b при условии, что в этом сражении участвовал Kopa6jrb s. Генерируйте исключение, если корабль s не участвовал в сражении b

interface Product

(extent Products key model)



attribute name;

attribute Date dateFought;

relationship Set<Outcome> results inverse Outcome:itheBattle;

Interface Outcome

(extent Outcomes)

attribute enum Stat (ok,sunk,damaged} status; relationship Ship theShip inverse Ship::inBatttes; relationship Battle theSattle Inverse Battle::results;

Рие. 8.3. БД боевых короблвй в ODL

8,2 Введение в OQL

В этом разделе вводится понятие языка объекгных запросов OQL. Он рассматривается не так подробно, как SQL. Здесь будут описаны только наиболее важные виды операторов и характерные особенности OQL, но в нем сушествует и множество других средств. Часто они похожи на соотлетствуюшие средства SQL или типичных объектно-ориентированных языков программирования.

OQL ие позволяет выразить произвольные функшт так. как они выражаются п обычных языках программирования типа С. Он обеспечивает сходную с SQL нотацию для выражения конкретных запросов иа более высоком уровне абстракции, чем типичные операторы обычного языка. Предполагпется. что OQL применяется как расширение главного объектно-ориентированного языка типа С+-ь, Smalltalk или .lava. Объектами ма.чипулируют и запросы OQL, и обычные операторы тланного язык?.. Возможность соединять onep.tTopbi главного языка с запросами OQL без явного переноса значений межлу двумя языками имеет более высокий уровень, чем способ истраивания SQL в главный язык, рассмотренный в разделе 7.1.

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

interface Class

(extent Classes 1<еу name)

attribute string name;

attribute string country;

attribute integer numGuns

attribute integer bore;

attribute integer displacement;

relationship Set<Ship> ships inverse Ship::classOf;

interface Ship

(extent Ships key name)

attribute name;

attribute integer launched;

relationship Class classOf inverse Classxships

relationship Set<Outcome> inBattles inverse Outcome::theShip;

Interface Battle

(extent Battles key name)



1 ... 110 111 112 [ 113 ] 114 115 116 ... 125

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