Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CASE-средства и объектные базы данных.doc
Скачиваний:
52
Добавлен:
01.05.2014
Размер:
311.3 Кб
Скачать

4. Реализация базы данных в Real

Программный интерфейс C++ является набором классов на языке C++, которые представляют типы данных, хранящиеся в базе данных, созданной в Real. Для иллюстрации возможностей доступа к базе данных из программ на языке C++ приведем репозиторий Real.

Все классы, представляющие сущности репозитория, — потомки класса Persistent, который является абстрактным и содержит описания виртуальных методов, отвечающих за хранение объектов в репозитории (Update, Delete и т.д.) и работу с идентификатором объекта. Репозиторий Real содержит более 100 классов. Рассмотрим некоторые из них. При описании случаев использования проектируемой системы разработчик создает объекты типа Actor и UseCase. Каждый из случаев использования разбивается на более мелкие функции, которые также отражаются в репозитории. В выполнении функций участвуют объекты, для них заведен класс Object. На MSC-диаграммах проектировщик рисует сообщения, которые объекты посылают друг другу при взаимодействии. Для этого есть классы MSCDiagram и Message. Объекты распределяются по классам, классы связаны ассоциациями. Пользователь задает поведение классов в виде SDL-автомата. Хранение этих сущностей обеспечивают классы Class, Association и SDLBehavior соответственно.

Из программы на языке С++ можно создать в оперативной памяти экземпляр класса, заполнить его необходимыми данными и сохранить в репозитории. Например, когда разработчик задает поведение объектов класса, то состояния, изображенные перед ним на SDL-диаграмме, представляются внутри редактора объектами класса State и сохраняются в репозитории. Следующий фрагмент добавляет новое состояние с именем Idle в описание конечно-автоматного поведения некоторого класса, сохраняет его в репозитории и удаляет объект из оперативной памяти:

CRState *aState=new CRState();

aState->SetName(”Idle”);

aState->SetOwner(aSDLBehaviour);

aState->Update();

delete aState;

Постоянные объекты. В создаваемой с помощью Real программе работа с постоянными объектами происходит в оперативной памяти. При обращении к постоянному объекту, состояние которого сохраняется в базе данных, программный интерфейс создает в памяти его образ в виде объекта языка программирования. При вызове методов объекта программный интерфейс не обращается к базе данных каждый раз, а изменяет состояние объекта в оперативной памяти. Это сделано из соображений эффективности: постоянное обращение к базе данных на диске сильно бы замедлило работу программы. Сохранение состояния объекта на диске происходит только по вызову метода Update.

Рис. 6. Представление постоянных объектов в оперативной памяти.

Рис. 6 иллюстрирует предыдущий пример. Изменения атрибутов объекта aState производятся в оперативной памяти и попадают в базу данных при вызове метода Update. При выполнении оператора delete aState образ постоянного объекта удаляется из оперативной памяти, объект ”засыпает” в базе данных.

Реализация наследования классов. Класс из схемы базы данных может содержать не только свои атрибуты, но атрибуты классов-предков. Хранятся же экземпляры классов в реляционной базе данных. Поэтому одной из важных задач реализации ее программного интерфейса является отображение наследования в реляционную модель данных. В CASE-средстве Real это сделано следующим образом.

Каждому классу, который не имеет предков, соответствует ровно одна таблица реляционной базы данных. В этой таблице хранятся атрибуты и отношения экземпляров этого класса. Каждому экземпляру класса соответствует строка в этой таблице. Если класс имеет одного предка, то данные его экземпляров распределены уже по двум таблицам. В таблице с именем самого класса хранятся только те атрибуты и отношения, которые описаны в этом классе. Унаследованные члены класса хранятся в таблице предка. Экземпляру класса-потомка соответствует по строке в двух таблицах: в таблице самого класса и в таблице предка. В каждой таблице есть два специальных поля, в которых хранится уникальный идентификатор объекта, состоящий из идентификатора самого объекта и идентификатора типа. Уникальный идентификатор одинаков в тех строках разных таблиц, которые представляют один объект, и тем самым объединяет данные одного объекта, находящиеся в разных таблицах. Идентификатор типа указывает, частью объекта какого класса является строка таблицы.

Такая реализация наследования в реляционной базе данных не случайна. Класс-потомок является частным случаем класса-предка, поэтому если мы хотим сделать выборку среди всего экстента класса-предка, то в нее должны попасть также и экземпляры класса-потомка. А в предлагаемой нами реализации такую выборку сделать просто: в таблице класса-предка хранятся и части экземпляров потомков, поэтому мы можем выбрать и экземпляры базового класса и экземпляры классов-потомков, просмотрев только одну таблицу.

Реализация наборов (collections). Наборы объектов, с которыми позволяет работать программный интерфейс — это множество и список объектов одного класса. Элементы, входящие в набор, являются результатом запроса к реляционной базе данных в виде SQL-предложения. Стандартным способом работы с результатом запроса в реляционной БД является поочередный перебор его элементов с помощью курсора. Поэтому и у набора есть методы GetFirst и GetNext, позволяющие по очереди выбрать все его элементы.

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

Реализация ассоциаций. В схеме базы данных Real допустимы ассоциации один к одному или один ко многим. Если между классами А и Б есть ассоциация один к одному, то в таблицы, соответствующие классу А и классу Б, добавляются по два поля, предназначенные для хранения уникального идентификатора объекта. Имея объект класса А, мы можем найти связанный с ним объект класса Б, и наоборот. Можно также в объект класса А записать другой идентификатор и связать этот объект с другим.

Если между классами А и Б отношение один ко многим, то каждому объекту класса Б соответствует только один объект класса А, а ему, в свою очередь, соответствует много объектов класса Б. Мы можем добавить поле в таблицу Б для хранения идентификатора А, но что делать с таблицей А? В таблицу А не всегда можно добавить поля для хранения массива идентификаторов объектов из Б, потому что их число может быть неизвестно. Поэтому в таблице А нет никаких дополнительных полей. Если надо получить объекты из Б, связанные с некоторым объектом из А, то формируется SQL-запрос, с помощью которого выбираются те элементы таблицы Б, которые ссылаются на этот объект таблицы А. Но ведь и наборы реализованы как результаты SQL-запросов, таким образом, по объекту класса А мы получаем набор объектов класса Б.

Программный интерфейс COM предоставляет набор COM классов, экземпляры которых представляют в программе объекты базы данных. Проиллюстрируем использование программного интерфейса COM на примере репозитория Real. В качестве языка программирования возьмем Visual Basic. Первым классом, с которым стоит познакомиться, является класс Repository: с него начинается работа с репозиторием. Сначала надо создать COM объект:

Dim Repo As New Repository

С помощью оператора New мы создаем объект Repo класса Repository. После этого надо открыть репозиторий, для этого у класса Repository есть метод OpenDialog, который предоставляет пользователю возможность выбрать источник данных ODBC, содержащий репозиторий:

If Not Repo.OpenDialog() Then Exit Sub

Метод OpenDialog возвращает логическое значение «истина», если репозиторий был успешно открыт. Методом SelectObjects можно выбрать подмножество некоторого экстента, определенного SQL-пред­ло­же­нием. Например, выберем из репозитория классы проекта, которые не имеют конечно-автоматного поведения:

Dim Classes As RClassSet

Set Classes = Repo.SelectObjects(tiClass, “BehaviourModel_id=0”)

Первый параметр этого метода — идентификатор типа объектов, которые мы выбираем, второй параметр — условие, налагаемое на значение атрибутов и связей. Это условие дополняется в реализации метода конструкцией «select * from tClass where», чтобы получилось полноценное выражение на SQL. После выполнения этого оператора в переменной Classes мы имеем набор всех классов, у которых отсутствует ссылка на объект репозитория, содержащий конечно-автоматное поведение данного класса. Classes — это объект типа RClassSet, т.е. множество классов (все имена типов данных из COM интерфейса репозитория имеют префикс «R»). Для любого другого COM класса, представляющего объекты репозитория тоже есть соответствующий класс, представляющий множество объектов. Все COM классы, представляющие множества объектов, имеют одинаковый набор методов — метод First и метод Next. Метод First возвращает первый элемент, а с помощью метода Next можно получить следующие элементы множества. С помощью этих двух методов можно перебирать наборы объектов:

Dim aClass As RClass

Set aClass=Classes.First

While Not (aClass Is Nothing)

ClassName=aClass.Name

If ClassName=»NotUseful» Then aClass.Delete

Set aClass=Classes.Next

Wend

После выполнения этого фрагмента из репозитория будет удален объект, представляющий класс с именем «NotUseful». Метод Delete, который мы вызывали, чтобы удалить этот объект, есть у всех объектов репозитория.

Программный интерфейс COM базы данных в Real реализован как сервер Автоматизации в виде динамически подключаемой библиотеки [4]. Этот сервер используется из программ-клиентов Автоматизации для доступа к базе данных. Главная задача программного интерфейса COM состоит в обеспечении возможности доступа к базе данных Real через механизм Автоматизации, а не в работе с базой данных. Поэтому программный интерфейс COM переадресует запросы к базе данных программному интерфейсу C++. COM сервер базы данных Real позволяет работать со всеми типами объектов базы данных, с множествами и списками объектов.

Соседние файлы в предмете Базы данных