7.3. Объектная модель Caché.
Большинство сегодняшних разработчиков с удовольствием бы воспользовались преимуществами объектной технологии при проектировании новых прикладных программ. Однако на практике полная свобода выбора технологии встречается чрезвычайно редко. Как правило, в компании имеется значительный объем нaрaботок, опирающихся на реляционные СУБД, а значит, реляционную модель дaнных обязательно приходится учитывать при разработке новых приложений, интегрируемых в существующую информационную среду. Другим препятствием на пути применения объектно-ориентированных подходов в информационной технологии (ИТ) является необходимость в организации запросов к базе данных. Структурированный язык запросов (SQL) - это широко распространенный стандарт, от котoрoгo сильно зависят как многочисленные интерфейсы прикладного программирования, так и использующие их разработчики. SQL стал неотъемлемой частью таких важных функций ИТ, как генерация отчетов п анализ данных и обычно является компонентом высокопроизводительных систем обработки транзакций (OLTP).
Поэтому многие архитекторы баз данных и разработчики приложений оказываются перед выбором: либо SQL, либо объекты. Либо принимается решение, что объектная база данных лучше отвечает постановке задачи (с практически неизбежным началом разработки приложения «с нуля»), либо сохраняются инвестиции в реляционные СУБД (в этом случае преимущества объектной технологии ограничиваются изначально).
Для разрешения этой дилеммы в Cache предлагается новый способ интеграции двух миров на основе единой архитектуры данных. В рамках этой архитектуры существует единое описание объектов и таблиц, отображаемых непосредственно в многомерные структуры ядра базы данных, ориентированного на обработку тpaнзакций. Имеющиеся серверы Cache Objects и Cache SQL предоставляют в распоряжение разработчика все наиболее популярные интерфейсы, посредством которых и унаследованные реляционные, и новые объектно-ориентированные прикладные системы получают равноправный доступ к данным.
Объектная модель Cache соответствует стандарту ОDMG (Object Data Мапаgеmепt Group). При этом основные операции Cache Objects базируются на определении классов объектов в Cache Object Architect [или непосредственно на языке CDL (Class Dеfiпitiоп Lапguаgе)] и последующей компиляции в исполняемый код (Ruп Time). При создании, сохранении, загрузке и манипулировании экземплярами объектов Cache в полном объеме поддерживает все основные
концепции современной объектной технолоrии:
Наследование означает способность к порождению класса объектов из другого клаcca. Новый унаследованный класс находится с родительским классом в отношении «Х есть Super Х» ("Х is а Super Х» ) и наследует все общие свойства и мeтоды. Унаследованные элементы могут в дальнейшем конкретизироваться, более тoгo, к ним мoгут добавляться новые методы и свойства, действующие лишь в рамках производных классов. Cache; Objects обладает также множественным
наследованием, при котором класс происходит одновременно от нескольких poдительских классов.
О полиморфизме говорят, когда один и тот же метод применяется в отношении объектов различных классов и может быть выполнен ими по-разному. Полиморфизм позволяет сделать приложения Сасhе Objects целиком и полностью независимыми от внутренней реализации методов объектов.
И наконец, xpaнимость - важнейшее свойство объектной базы данных означает, что объекты длительное время хранятся в дисковой памяти и при необходимости могут оттуда извлекаться. Система СасЬе поддерживает несколько видов xрaнения объектов: автоматическое хранение в мноrомерной базе данных Cache, xpaнение в любых структурах, определенных пользователем, и храпение в таблицах внешних реляционных баз данных, доступных через шлюз Cache SQL Gateway.
Разработчик всегда может выбрать оптимальный способ хранения для каждого класса.
Основные компоненты СУБД Caché:
• Многомерное ядро системы, ориентированное на работу с транзакциями, позволяет реализовать развитую технологию обработки транзакций и разрешения конфликтов. Блокировка данных производится на логическом уровне. Это позволяет учитывать особенность многих транзакций, производящих изменения небольшого объема информации. Кроме этого, в Caché реализованы атомарные операции добавления и удаления без проведения блокировки, в частности, это применяется для счетчика идентификаторов объектов.
• Сервер Caché Objects. Представление многомерных структур данных ядра системы в виде объектов, инкапсулирующих как данные, так и методы их обработки. Позволяет реализовать объектный доступ к данным.
Сервер Cache SQL. Представление многомерных структур данных в виде реляционных таблиц. Позволяет реализовать реляционный доступ к данным.
Сервер прямого доступа (Cache Direct). Предоставление прямого чрезвычайно эффективного доступа к многомерным структурам данных ядра системы.
Саche Objects состоят из следующих компонентов (см. рис. ):
Сасhе Object Architect - интегрированная GUI - среда разработчика для определения классов, включая их свойства и методы. Эти определения могут быть экспортированы в файлы в формате CDL, который может использоваться также и напрямую для описания классов Cache.
Библиотека классов (Class Dictionary) - универсальный репозиторий, coдepжащий определения всех классов Cache. Остальные компоненты Cache Objects взаимодействуют с библиотекой классов через API. Библиотека классов может пополняться с помощью Сасhe Object Architect либо путем импорта из файлов в формате CDL, DDL и др. Точно так же она может экспортироваться в различные форматы. .
Компилятор классов компилирует определения классов в программный код, который может выполняться в виде модуля Run-Time.
Макропроцессор обрабатывает каждую строку исходноuо кода на языке Саche ObjectScript, заменяя все макровызовы и предложения встроенного SQL на выполняемый код Сасhе ObjectScript.
СасЬе ObjectServer lдля ActiveX - сервер автоматизации ActiveX, предоставляющий объект Cache
внешнему миру в виде обычных объектов ActiveX. Это позволяет работать с объектами Сасhе из внешних инструментальных сред разработки, таких как Visual Basic, С++ и др., получая доступ к их свойствам и возможность выполнения их методов.
СасЬе ObjectServer для Java открывает доступ к объектам: Сасhе приложениям, написанным на языке Java.
|
Среда разработки Caché Для разработки приложений и работы с базами данных система Caché предлагает следующий набор утилит:
Все утилиты запускаются из Caché-куба, который располагается в правой части экрана, щелчком правой кнопки мыши. Утилита «Редактор конфигурации» предназначена для задания и просмотра следующих параметров конфигурации:
Большинство параметров конфигурации выполняются динамически и не требуют перезапуска системы Caché. «Редактор конфигурации» может использоваться для создания базы данных. База данных Caché это файл с именем Cache.dat. По умолчанию база данных Caché располагается в директории C:\CacheSys\MGR\User. Для создания своей базы данных в другой директории на вкладке «Базы данных» Редактора конфигурации по кнопке «Мастера…» выбирается соответствующий мастер. По умолчанию начальный размер базы равен 1 МБ. На рис.1 изображено окно «Редактора конфигурации».
На рис. 2 изображено окно выбора мастеров.
Созданная база данных связывается со своей рабочей областью (namespace), которая так же может быть создана с помощью Редактора конфигурации, для этого необходимо выбрать мастер «Создание области». По умолчанию разработка ведется в рабочей области User. Caché Studio это интегрированная, визуальная среда создания объектно-ориентированных баз данных и Web-приложений. Она имеет следующие особенности для обеспечения быстрой разработки:
Исходный код приложения Caché оформляется в виде проекта. Проект может содержать следующие компоненты: классы, программы, CSP-файлы. Можно создавать новые проекты, открывать и изменять существующие. Также существует возможность добавления или удаления компонентов из проекта. Внешний вид среды разработки Caché Studio приведен на рис.3.
Утилита Caché Terminal может быть использована для отладки программ, процедур, функций, проверки работы отдельных операторов. Работа ведется в режиме командной строки. Утилита чрезвычайно проста. После приглашения набирается команда и нажимается ENTER. Здесь же выводится результат выполнения команды. Окно утилиты приведено на рис.4.
Для доступа к многомерным структурам ядра СУБД Caché можно воспользоваться утилитой Caché Проводник. Утилита Caché Проводник предоставляет ряд интерфейсов для просмотра, импорта/экспорта, печати на принтер глобалов, классов Caché, программ Caché. Внешний вид утилиты приведен на рис.5.
Утилита SQL-менеджер позволяет работать с объектами как с реляционными таблицами, это типичный проводник для работы со схемой реляционной базы данных. Окноутилиты приведено на рис.6.
Caché Terminal Caché Terminal – это программа эмуляции ASCII терминала, поставляемая вместе с Caché. Эта программа может быть с успехом использована для изучения моделей данных, поддерживаемых Caché, особенностей использования языка Caché ObjectScript, так как она немедленно выполняет любую команду Caché ObjectScript, записанную в командной строке с приглашением типа: USER> где USER – это имя области Caché (NameSpace), в которой вы работаете. Вы можете сменить имя области, использовав команду Caché ObjectScript: ZNSPACE выражение или ZN выражение Например, команда USER>ZN "SAMPLES" выполняемая в области USER, немедленно приводит к смене области: SAMPLES> то есть вы теперь будете работать в области SAMPLES. Можно запустить на выполнение фрагмент из нескольких команд Caché ObjectScript, но все они должны быть записаны в одной строке. Редактировать команды в окне терминала достаточно сложно. Поэтому записывать приказы в строке длиннее, чем 80 символов, не рекомендуется. Если вы хотите выполнить какую-то последовательность команд, то лучше оформить их как программу, используя средство Caché Studio Например, создадим и откомпилируем в Caché Studio пользовательскую функцию Random(min,max): Random(min,max) New diff,zz Set diff=max-min,zz=$Random(diff)+1+min Quit zz Если функция откомпилирована в области USER как отдельная программа, то обращаться к ней в командной строке терминала можно следующим образом: USER>Set st=$$^Random(100,1000) Write st 784 // результат или USER>write $$^Random(10,1000),"****",$$^Random(10,1000) 287****376 Заметим, что вызов пользовательской функции осуществляется в соответствии с синтаксисом: $$Name(список параметров) а циркумфлекс ^ перед именем нужен в том случае, если функция сохраняется как отдельная программа. Если программа прерывается по ошибке, то в заголовке приглашения появляется указание на место ошибки в тексте программы, например USER 3e1> Чтобы восстановить прежний вид приглашения, выполните команду q (quit), которая завершит программу, а вид приглашения восстановится USER> Клавиатурный интерфейс Caché Terminal Клавиатурный интерфейс программы Caché Terminal весьма примитивен. В режиме эмуляции реального терминала VT 320 работают следующие клавиши:
|
7.5. Виды классов В Caché имеется принципиальное различие между классами типов данных и классами объектов. Классы типов данных позволяют представлять константы в виде строк символов (Strings), целых чисел (Integer) и других типов данных, в том числе определенных пользователем.
Классы объектов содержат объекты и подразделяются далее на зарегистрированные и незарегистрированные классы. Незарегистрированные классы не несут в себе какого-либо предопределенного поведения; все их методы разработчик определяет сам. В противоположность этому зарегистрированные классы Caché автоматически обеспечены обширным набором встроенных функций, таких как метод $New() для создания нового экземпляра класса либо %Close() для его удаления из памяти Зарегистрированный класс является временным; он не обладает кодом для хранения в базе данных. Для встраиваемых и для хранимых классов Caché создает методы хранения автоматически При этом объект встраиваемого класса может храниться, только будучи встроен в некоторый хранимый объект, тогда как хранимый объект, имея собственный идентификатор, может храниться в базе данных независимо. 1. Классы типов данных Классы типов данных — это специальные классы, определяющие допустимые значения констант и позволяющие их контролировать. В противоположность классам объектов типы данных не имеют независимой идентификации и от них не могут образовываться экземпляры. Они просто приписываются атрибутам объектов, получающим константы соответствующего типа в качестве значений. Классы типов данных содержат предопределенный набор методов проверки и преобразования значений атрибутов. Эти классы не могут содержать свойств. 2. Классы объектов Класс объектов определяет структуру данных и поведение объектов одного типа. Эти объекты называют экземплярами соответствующего класса, а создание объекта называют порождением экземпляра класса. Каждый класс объектов обладает однозначным именем класса, а также свойствами, методами и ключевыми словами, определяющими общее поведение класса. 3. Незарегистрированные классы объектов Caché не осуществляет автоматического управления объектами незарегистрированных классов. Разработчик сам отвечает за назначение и поддержку уникальности идентификаторов объектов (OID) и объектных ссылок (OREF). Из-за того что управление объектными ссылками не реализовано на уровне Caché, незарегистрированные классы обнаруживают ряд ограничений:
4. Зарегистрированные классы объектов Зарегистрированные классы объектов располагают полным набором методов управления поведением объектов в памяти. Они автоматически наследуют эти методы от системного класса %Library.RegisteredObject. Экземпляры зарегистрированных классов существуют лишь временно в памяти процесса, поэтому их называют временными объектами. Противоположность им составляют встраиваемые и хранимые классы объектов, которые могут храниться в базе данных длительное время. Создание новых объектов зарегистрированных классов и управление их размещением в памяти осуществляется Caché. В распоряжение программиста предоставляется объектная ссылка (OREF), по которой можно ссылаться на объект в памяти. Зарегистрированные классы поддерживают полиморфизм. 5. Встраиваемые классы объектов Экземпляры встраиваемых классов могут храниться не только временно в памяти, но и продолжительное время в базе данных. Эти классы наследуют свое поведение от системного класса Caché %Library. Serial Object. Главным в их поведении является то, что их экземпляры в памяти существуют как независимые объекты, однако могут быть сохранены в базе данных, лишь будучи встроены в другие объекты. Для этого Caché оснащает встраиваемые классы объектов следующими функциональными возможностями:
Встроенные объекты представляются в памяти и базе данных совершенно по-разному:
В качестве примера рассмотрим класс объектов Производитель. У производителя имеются не только такие простые свойства, как Наименование и Отрасль, но также и адрес, содержащий Индекс и Город. Несомненно, атрибуты адреса можно было бы определить напрямую в виде нескольких свойств класса Производитель. Поначалу это кажется осмысленным, ведь адрес представляет собой свойство производителя, а значит, не должен существовать независимо от него. Однако и другие объекты — поставщики, клиенты, персоны — также имеют адреса. Поэтому крайне желательно, определив понятие Адрес лишь единожды, многократно применять его в различных классах объектов. Именно это и происходит, когда при определении класса Производитель обращаются к ранее определенному классу объектов Адрес и встраивают его в новый класс. С одной стороны, этот класс может быть также использован в классах Поставщик, Клиент и Персона, что позволяет создать стандарт для разработки приложений. С другой стороны, сводятся к минимуму издержки, связанные с возможным в будущем изменением формата почтового индекса или с добавлением к адресу нового свойства «e-mail». 6. Хранимые классы объектов Хранимые (в переводе с латыни — длительные) классы объектов обладают обширными функциональными возможностями, обеспечивающими длительное хранение их экземпляров в базе данных. Эти возможности наследуются от системного класса %Library.Persistent. Экземпляры хранимых классов обладают однозначными объектными идентификаторами (OID) и могут независимо храниться в Caché. Когда хранимый объект используется как свойство класса, говорят о ссылке на хранимый объект. Пусть производитель транспортного средства определен в виде хранимого класса Производитель. Если свойству Производитель класса Транспортное средство назначить тип Производитель, будет образована ссылка на хранимый объект. Каждый экземпляр класса Транспортное средство может теперь ссылаться на экземпляр класса Производитель, причем каждый производитель существует независимо от того, ссылаются ли на него транспортные средства и в каком количестве.
С точки зрения класса Транспортное средство свойства и методы производителя, на которого делается ссылка, могут применяться аналогично собственным свойствам и методам. При этом Caché автоматически загружает в память объекты, на которые делается ссылка, осуществляя подкачку (swizzling). |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
