|
Программирование >> Хронологические базы данных
и наконец рассмотрим объекты, представляющие преподавателей. В нащем примере следует несколько отвлечься от исходной реляционной версии базы данных и рассмотреть преподавателей (TEACHER) как подкласс класса сотрудников (ЕМР). 1 ЕМР SUBCLASS : TEACHER 2 INSTVARNAMES : [ COURSES ] 3 CONSTRAINTS : t[ t[ #COURSES, CSET ] ] . Пояснения. В строке 1 определен объектный класс TEACHER, который является подклассом ранее определенного класса ЕМР (иначе говоря, TEACHER ISA ЕМР). Таким образом, каждый отдельный объект TEACHER имеет закрытые переменные экземпляра ЕМР#, ENAME и POSITION (которые унаследованы от класса ЕМР), а также переменную COURSES, которая содержит идентификатор объекта класса CSET. Объект CSET определяет множество всех курсов, которые ведет конкретный преподаватель. Каждьш объект TEACHER также наследует все методы класса ЕМР. Как уже отмечалось, в предыдущих определениях классов предполагалось существование нескольких классов коллекций (например, коллекций объектов потоков, учеников, преподавателей и т.д.), но они не были определены. Теперь следует дать точное определение коллекции каждого класса, а именно: ESET, CSET, OSET, NSET и TSET. Например, объект класса CSET будет состоять из множества идентификаторов отдельных объектов класса COURSE. Ниже даются определения всех этих классов, начиная с класса ESET. 1 SET SUBCLASS : ESET 2 CONSTRAINTS : EMP . Пояснения. В строке 1 дается определение класса ESET, который является подклассом встроенного класса SET. В строке 2 на объекты класса ESET накладывается офаничение: они должны быть множествами идентификаторов объектов класса ЕМР. В общем случае может существовать произвольное число объектов класса ESET, но в данной ситуации будет создан только один объект (подробности приводятся в следующем подразделе), который будет содержать множество идентификаторов всех объектов класса ЕМР. Выражаясь неформально, объект ESET можно считать аналогом базовой переменной-отнощения ЕМР в реляционной версии базы данных. Определения классов CSET, OSET, NSET и TSET аналогичны (они приводятся ниже). Однако для каждого из них придется создать не один, а несколько объектов соответствующей коллекции классов. Например, в нащем случае будет существовать столько коллекций объектов OSET, сколько существует отдельных объектов COURSE. SET SUBCLASS : CSET CONSTRAINTS : COURSE . SET SUBCLASS : OSET CONSTRAINTS : OFFERING . SET SUBCLASS : NSET CONSTRAINTS : ENROLLMENT . SET SUBCLASS : TSET CONSTRAINTS : TEACHER . * Заметим, что здесь наследуется закрытое представление (т.е. физическая реализация). Заполнение базы данных Теперь обсудим, как можно поместить в рассматриваемую базу данных требуемую информацию. При этом остановимся на пяти основных типах объектов (сотрудники, курсы, потоки, слушатели, преподаватели). Начнем с сотрудников. Напомним о нашем намерении собрать вместе идентификаторы всех объектов ЕМР в единственном объекте ESET. Таким образом, прежде всего необходимо создать объект ESET. OID OF SET OF ALL EMPS := ESET NEW . Правая часть этого выражения возврашает объектный идентификатор (OID) нового пустого экземпляра объекта класса ESET (т.е. пустое множество идентификаторов объектов класса ЕМР), а затем идентификатор этого нового экземпляра присваивается программной переменной OID OF SET OF ALL EMPS. Говоря неформально, эта переменная обозначает множество всех сотрудников. Теперь всякий раз при создании нового объекта класса ЕМР идентификатор этого объекта следует помешать в объект ESET, идентификатор которого хранится в переменной OID OF SET OF ALL EMPS. Для создания объекта класса ЕМР и вставки его идентификатора в объект класса ESET необходимо определить метод или же написать профамму, которая выполнит эту задачу. 1 METHOD : ESET анонимный! 2 ADD ЕМР# : ЕМР# PARM параметры 3 ADD~ENAME : ENAME PARM 4 ADD~POS : POS PARM 5 I EMP OID I локальная переменная 6 EMP OID := EMP NEW . новый сотрудник 7 EMP~OID SET EMP# : EMP* PARM ; инициализация 8 ~ SET~ENAME : ENAME PARM ; 9 SET~POS : POS PARM . 10 SELF ADD: EMP OID . вставка 11 % Пояснения В строке 1 начинается запись кода данного метода (который завершается символом % в строке 11) для объектов класса ESET. (На самом деле в системе во время выполнения программы будет существовать всего один объект этого класса.) В строках 2-4 определены три параметра с внешними именами ADD EMP#, ADD ENAME и ADD POS. Эти имена будут использованы в сообщениях, вызывающих данный метод. Соответствуюшие внутренние имена EMP PARM, ENAME PARM и POS PARM будут использоваться только внутри кода реализации данного метода. В строке 5 определена локальная переменная EMP OID, а в строке 6 ей присвоен идентификатор нового неинициализированного экземпляра объекта класса ЕМР. В строках 7-9 посылается сообщение новому объекту класса ЕМР с указанием трех методов (SET EMP, SET ENAME и SET POS) и передачей одного аргумента каждому из них (EMPlJARM для SETJMP*, ENAME pARM для SETJNAME и POS JARM для SET POS). Замечание. Здесь предполагается, что SET EMP является методом, который используется для объекта класса ЕМР и предназначается для присвоения некоторого значения переменной ЕМР#. Аналогично определяются методы SET ENAME и SET POS. Несколько подробнее эти методы рассматриваются ниже. В строке 10 посылается сообщение объекту SELF. Это имя объекта является специальным обозначением, представляющим во время выполнения тот самый текущий объект, в котором определен указанный метод (т.е. сообщение посылается самому текущему целевому объекту). Сообщение вызывает встроенный метод ADD (этот метод содержится в каждом классе, определяющем коллекцию ). В результате идентификатор объекта, который содержится в локальной переменной EMP OID, будет вставлен в объект, идентифицируемый значением переменной SELF (в данном случае это будет объект ESET, содержащий идентификаторы всех существующих на текущий момент объектов класса ЕМР). Замечание. Переменная SELF необходима потому, что параметр, соответствующий объекту-получателю, не имеет собственного имени (см. строку 1). Обратите внимание, что, как отмечено в комментарии к строке 1, определенный здесь метод остается анонимным. В общем случае в языке OPAL методы не имеют имен; вместо этого для них используется сигнатура (т.е. комбинация имени класса, в котором он применяется, и внещних имен их параметров). Однако при этом возникает опасность создания неуклюжих и Офомных выражений. Можно отметить и еще один недостаток: если два метода одного и того же класса используют одни и те же параметры, то для этих методов должны использоваться разные внещние параметры. Теперь новый метод, созданный для вставки в базу данных новых объектов класса ЕМР, можно применить следующим образом. OID OF SET OF ALL EMPS ADD EMPt ADD~ENAME ADD~POS E009 Helms Janitor При использовании приведенного выражения будет создан объект класса ЕМР для сотрудника с номером Е009, а идентификатор этого объекта будет добавлен к множеству всех идентификаторов объектов класса ЕМР. Обратите внимание, что встроенный метод NEW никогда не должен использоваться для класса ЕМР, кроме тех случаев, когда он является частью только что определенного метода. Иначе могут быть созданы лищние объекты класса ЕМР, которые не будут представлены в множестве всех сотрудников . Замечание. Следует принести извинения за слишком частое повторение таких выражений, как множество всех сотрудников и только что определенный метод , однако сложно описывать то, что не имеет собственного имени. А теперь займемся курсами. Объекты для сотрудников представляют собой наиболее простой случай, поскольку они соответствуют регулярным объектам (согласно терминологии модели типа сущность/связь ) и не содержат никаких других объектов (не считая неизменяемых). Далее следует рассмотреть более сложный случай объектов для курсов, которые (несмотря на то, что они все еще остаются регулярными объектами ) концептуально содержат другие изменяемые объекты. В целом, чтобы создать объекты для курсов, необходимо выполнить следующие действия.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |