|
Программирование >> Хронологические базы данных
1. Применить метод NEW для класса CSET с целью создания исходно пустого множества всех курсов (на самом деле - множества идентификаторов объектов класса COURSE). 2. Определить метод для создания нового объекта класса COURSE и вставки его идентификатора в множество всех курсов . При создании этого объекта потребуется задать некоторые значения для параметров COURSE! и TITLE. Кроме того, с помощью метода NEW класса OSET потребуется также создать исходно пустое множество потоков (на самом деле - идентификаторов объектов класса OFFERING), а затем разместить идентификатор этого пустого множества потоков в переменной OFERINGS внутри нового объекта класса COURSE. 3. Вызвать только что определенный метод для каждого отдельного курса. Теперь создадим объекты потоков. Для этого необходимо выполнить следующие действия. 1. Определить метод для создания нового объекта класса OFFERING. Этот метод должен принимать в качестве параметров значения переменных OFFi, ODATE и LOCATION и приводить к созданию нового объекта класса OFFERING с указанными параметрами. Кроме того, потребуется выполнить некоторые дополнительные действия. Для создания исходно пустого множества слушателей (идентификаторов объектов класса ENROLLMENT) следует применить метод NEW для класса NSET, а затем разместить идентификатор этого пустого множества слушателей в переменной ENROLLMENTS внутри нового объекта класса OFFERING. Для создания исходно пустого множества преподавателей (идентификаторов объектов класса TEACHER) следует применить метод NEW для класса NSET, а затем разместить идентификатор этого пустого множества преподавателей в переменной TEACHERS внутри нового объекта класса OFFERING. 2. Данный метод принимает в качестве параметра значение переменной COURSEI и применяет его следующим образом. Используя указанное значение параметра, необходимо найти объект класса COURSE, соответствующий новому объекту класса OFFERING. Как это можно выполнить, описано в следующем подразделе. Замечание. Безусловно, такой метод не позволит создать объект для нового потока, если не будет найден соответствующий ему курс обучения. Далее в этой главе такие исключительные случаи рассматриваться не будут. Следует найти множество всех потоков для данного объекта класса COURSE. Добавить идентификатор нового объекта класса OFFERING к соответствующему множеству всех потоков . Заметьте, что (как уже упоминалось в этой главе) здесь нельзя избежать применения таких пользовательских ключей, как COURSE!. Действительно, они необходимы не только для отображения объектов окружающего мира, но и для организации подстановок справочных данных внутри базы данных. 3. Наконец следует вызвать только что определенный метод для каждого отдельного потока. Обратите внимание, что (в соответствии с используемым представлением иерархии вложения) здесь не было создано множество всех потоков . В результате для выполнения запроса, в котором данные коллекции используются в качестве анализируемой области (например, для запроса Найти все потоки, преподаваемые в Нью-Йорке ), потребуется дополнительно создать некоторую процедуру (см. следующий подраздел). Теперь рассмотрим процедуру создания объектов слущателей. Эти объекты (ENROLLMENT) отличаются от объектов потоков тем, что содержат переменную экземпляра ЕМР, значение которой является идентификатором соответствующего объекта ЕМР. Поэтому последовательность действий должна быть такой. 1. Определить метод для создания нового объекта класса ENROLLMENT. В этом методе в качестве аргументов используются значения переменных COURSEI, OFFI, EMPI и GRADE и создается новый объект ENROLLMENT с заданным значением аргумента GRADE. Кроме того, требуется выполнить некоторые дополнительные действия. Использовать значения COURSEI и OFFI для нахождения объекта OFFERING, соответствующего новому объекту класса ENROLLMENT. Найти множество всех слущателей для данного объекта класса OFFERING. Добавить идентификатор нового объекта класса ENROLLMENT к соответствующему множеству всех слущателей . Кроме того, потребуется следующее. Использовать значение переменной EMPt для нахождения соответствующего объекта ЕМР. Разместить идентификатор объекта ЕМР в переменной ЕМР внутри нового объекта класса ENROLLMENT. 2. Вызывать только что определенный метод для каждого отдельного потока. И наконец перейдем к созданию объектов преподавателей. Различие между способами создания объектов для преподавателей и потоков заключается в том, что класс TEACHER является подклассом класса ЕМР. Ниже приведена последовательность действий, которые необходимо выполнить в данном случае. 1. Определить метод создания нового объекта класса TEACHER. Этот метод принимает в качестве аргументов значения переменных COURSEI, OFFi и EMPI. Потребуются также некоторые дополнительные действия. Использовать значение переменной EMPI для нахождения соответствующего объекта класса ЕМР. Преобразовать объект класса ЕМР в объект класса TEACHER (поскольку этот сотрудник теперь является также преподавателем). Специфика подобного преобразования зависит от конкретной системы (см. главу 19), и здесь этот вопрос рассматриваться не будет. Использовать значения переменных COURSEI и OFFi для поиска объекта класса OFFERING, соответствующего новому объекту класса TEACHER. Найти множество всех преподавателей для этого объекта OFFERING. Добавить идентификатор нового объекта класса TEACHER к соответствующему множеству всех преподавателей . 2. Определить множество всех курсов, которые может вести данный преподаватель, а также задать соответствующим образом значение переменной COURSES в новом объекте класса TEACHER. Однако здесь эти подробности будут опущены. 3. Вызывать только что определенный метод для каждого объекта, описывающего отдельного преподавателя. Операции извлечения Прежде чем приступить к подробному описанию операций извлечения, следует отметить, что (хотя это и вполне очевидно) язык OPAL, как и другие объектные языки в целом, функционирует по принципу последовательной обработки отдельных записей, а не их множеств. Следовательно, для решения большинства проблем программист должен создать некоторую процедуру. Рассмотрим в качестве примера запрос Найти все потоки для курса с номером С001, которые преподаются в городе New York . Для простоты предположим, что есть переменная OOSOAC, значение которой является идентификатором набора всех курсов . Ниже приводится код для такого запроса. 1 I COURSE С001 , С001 OFFS , С001 NY OFFS 2 COURSE~C001 3 := OOSOAC DETECT : [ :CX ( CX GET COURSE* ) = COOl ] . 4 COOl OFFS 5 := COURSE COOl GET OFFERINGS . 6 COOl NY OFFS 7 := COOl OFFS SELECT : 8 [ :0X I ( OX GET LOCATION ) = New York ] . 9 C001JY OFFS . Пояснения В строке 1 объявлены три локальные переменные: COURSE COOl, которая будет использована для хранения идентификатора объекта курса с номером С001; C001 OFFS, которая будет использована для хранения идентификатора объекта набора всех потоков для курса с номером С001; С001 NY OFFS, которая будет использована для хранения идентификатора набора идентификаторов для требуемых потоков (т.е. потоков, читаемых в Нью-Йорке). В строках 2 и 3 посылается сообщение объекту (коллекции), определяемому значением переменной OOSOAC. Это сообщение вызывает встроенный метод DETECT данной коллекции объектов с указанием следующего аргумента. [ I р(х) ] Здесь р(х) -условное выражение, включающее переменную х, а х- переменная диапазона, изменяющаяся в пределах всех членов коллекции, к которой применяется метод DETECT (т.е. множества объектов COURSE в рассматриваемом примере). В результате выполнения метода DETECT возвращается идентификатор первого найденного объекта этого множества, для которого выражение р(х) оказывается
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |