Основные концепции объектно-ориентированной методологии



Лабораторная 1. Создание локальной базы данных в Caché Постреляционная СУБД Caché

Основные положения стандарта ODMG                                    

Объектно-ориентированные СУБД (ООСУБД) отличает ряд обязательных свойств.

Эти свойства продекларированы в «Манифесте систем объектно-ориентированных баз данных», а впоследствии закреплены в документах ODMG (Object Data Management Group), организации, объединяющей ведущих производителей объектно-ориентированных СУБД. Основной целью эта организация ставит задачу выработки единых стандартов ООСУБД, соблюдение которых обеспечило бы переносимость приложений.

Рассмотрим основные положения стандарта ODMG.

Модель данных

В соответствии со стандартом ODMG 2.0 объектная модель данных характеризуется следующими свойствами.

• Базовыми примитивами являются объекты и литералы. Каждый объект имеет уникальный идентификатор, литерал не имеет идентификатора.

• Объекты и литералы различаются по типу. Состояние объекта характеризуется его свойствами, поведение объекта характеризуется его методами (операциями). Все объекты одного типа имеют одинаковое поведение (набор операций) и одинаковый диапазон изменения свойств.

• Свойствами могут быть атрибуты объекта или связи между объектом и одним или несколькими другими объектами.

• Поведение объекта определяется набором операций, которые могут быть выполнены над объектом или самим объектом. Операции могут иметь список входных и выходных параметров строго определенного типа. Каждая операция может также возвращать типизированный результат.

• База данных хранит объекты, позволяя совместно использовать их различным пользователям и приложениям. База данных основана на схеме данных, определяемой языком определения данных, и содержит экземпляры типов, определенных схемой.

Тип также является объектом. Поддерживается иерархия супертипов и подтипов, реализуя тем самым стандартный механизм объектно-ориентированного программирования — наследование. Тип имеет набор свойств, а объект характеризуется состоянием в зависимости от значения каждого свойства. Операции, определяющие поведение типа, едины для всех объектов одного типа. Свойство едино для всего типа, а все объекты типа также имеют одинаковый набор свойств. Значение свойства относится к конкретному объекту.

На рис. схематично изображены основные элементы ООСУБД.

Рисунок Основные элементы ООСУБД

Идентификатор объекта

Как следует из модели данных, каждый объект в базе данных уникален. Существует несколько подходов для идентификации объекта.

Первый самый простой — объекту присваивается уникальный номер (OID — object identificator) в базе, который никогда больше не повторяется, даже если предыдущий объект с таким номером уже удален. Недостаток такого подхода состоит в невозможности перенести объекты в другую базу без потери связности между ними.

Второй подход состоит в использовании составного идентификатора. Например, в ООСУБД Versant идентификатор OID имеет формат xxxxxxxx:yyyyyyyy, где xxxxxxxx — идентификатор базы данных, yyyyyyyy — идентификатор объекта в базе. Составленный таким образом OID позволяет переносить объекты из базы в базу без потери связи междуобъектами или без удаления объектов с перекрывающими номерами.

Третий подход, который применяется в ООСУБД Jasmine и Caché, состоит в том, чтоOID формируется из имени класса объекта и собственно номера объекта. Идентификаторимеет вид classnamexxxxxxxx, где classname — имя класса, а xxxxxxxx — номер объектаэтого класса. Недостаток такого подхода заключается в том, что проблема переноса объектов не решена олностью. В разных базах могут оказаться объекты одного класса, ауникальность номеров соблюдается только в пределах одной базы. Преимущество подхода — в простоте извлечения объектов нужного класса: объекты одного класса будут иметьидентификатор, имеющий общую часть.

Четвертый вариант, самый лучший, состоит в использовании OID, состоящего изтрех частей: номер базы, номер класса, номер объекта. Однако и при этом остается вопросо том, как обеспечить уникальность номеров баз и классов на глобальном уровне — прииспользовании ООСУБД на различных платформах, в разных городах и странах.

Новые типы данных

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

В ООСУБД для объектов, которые предполагается хранить в базе (постоянные объекты), требуется, чтобы их предком был конкретный базовый тип, определяющий все основные операции взаимодействия с сервером баз данных. Концептуально объект характеризуют поведение и состояние. Тип объекта определяется через его поведение, т.е. черезоперации, которые могут быть выполнены объектом.

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

Пример на рис. иллюстрирует возможность наращивания типа «человек» (Person),который может быть «мужчиной» (MalePerson), «женщиной» (FemalePerson), «взрослым»(Adult) или «ребенком» (Child). Соответственно возможны попарные пересечения этихтипов. Каждый из этих типов может иметь свой набор свойств и операций. Любой объекттипа MalePerson, FemalePerson, Adult или Child является объектом типа Person. Аналогично объект подтипа MaleAdult, полученного наследованием типов MalePerson и Adult, является человеком, мужского пола, взрослым и, соответственно, может пользоваться свойствами и операциями всех своих супертипов.

Рисунок Пример наследования типов

Оптимизация ядра СУБД

В отличие от объектно-реляционных СУБД, где ядро остается реляционным, а «объектность» реализуется в виде специальной надстройки, ядро ООСУБД оптимизированодля операций с объектами и производит операции кэширования объектов, ведение версийобъектов, разделение прав доступа к конкретным объектам.

Поэтому ООСУБД имеет более высокое быстродействие на операциях, требующихдоступа и получения данных, упакованных в объекты, по сравнению с реляционнымиСУБД, для которых необходимость выборки связных данных ведет к выполнению дополнительных внутренних операций.

Язык СУБД и запросы

Варианты языков запросов можно разделить на две группы. Первая объединяет языки, унаследованные от SQL и представляющие собой разновидность OQL (Object QueryLanguage), языка, стандартизованного ODMG. Объектно-реляционные СУБД используютразличные варианты ограниченных объектных расширений SQL.

Вторая, сравнительно новая группа языков запросов базируется на XML. Собирательное название языков этой группы — XML QL (или XQL). Онимогут применяться в качестве языков запросов в объектных и объектно-реляционных базах данных. Использование в чисто реляционных базах не целесообразно, поскольку языком предусматривается объектная структура запроса.

Физические хранилища

Как правило, база данных объединяет несколько хранилищ данных, каждое из которых ассоциируется с одним или несколькими файлами. Хранятся как метаданные (класс,атрибут, определения операций), так и пользовательские данные. Выделяют три типа хранилищ:

системное хранилище, используется для хранения системы классов, создается на этапе формирования базы данных и содержит информацию о классах, о наличии и месторасположении пользовательских хранилищ;

пользовательское хранилищепредназначено для хранения пользовательских объектов;

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

Основные концепции объектно-ориентированной методологии

Важнейшим понятием объектной технологии является прежде вcero сам объект, определяемый как инкапсулированная сущность, обладающая свойствами и мeтодами. Инкапсуляция означает, что для внутренней реализации справедлив принцип сокрытия информации, соrласно которому ни проrраммный код, ни переменные не выставляются на всеобщее обозрение и не могorут использоваться за пределами объекта. В противоположность этому объекты имеют открытый интерфейс, описываемый в виде набора свойств и методов. Методы определяют поведение объекта, а свойства ero «знания», иными словами, данные. Строгоговоря, свойства не могут использоваться непосредственно (а только через методы доступа к данным). Однако во мноrих современных OO - cрeдax методы доступа к данным предоставляются в распоряжение пользователя автоматически и вызываются неявно. Поэтому, придерживаясь праrматическоrо подхода, можно рaссматривать свойства подобных объектных систем как составную часть открытого интерфейса.

Если необходимо выполнить метод, то ero код во избежание противоречий с принципом  сокрытия не вызывают напрямую. Вместо этоrо объекту посылают сообщение с требованием выполнить определенный метод с заданными параметрами.

Получив сообщение, объект сам выбирает соответствующий внутренний код для выполнения, вызывает его и передает ему значения параметров.

В объектных системах объекты одноrо типа принято объединять в классы объектов. Отдельные сущпости этих классов индивидуальные объекты называют экземплярами класса. Например, с точки зрения объектной технолоrии, каждый человеческий индивидуум это экземпляр класса Человек.

Класс объектов определяет свойства и методы, то есть тот интерфейс, который является единым для всех ero экземпляров. Это определение устанавливает свoeго рода рамки, которые каждый экземпляр заполняет своими индивидуальными значениями. Стало быть, экземпляры имеют тип соответствующего класса. Помимо этоrо, экземпляры обладают объектной индивидуальностью вне зависимости от значений их свойств. Так, два экземпляра одноrо класса даже при идентичных

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

Экземпляры одноrо класса мorут отличаться лишь значениями своих свойств, но не своими методами. Методы устанавливаются для всех экземпляров при определении класса. Отсюда следует, что все члены одноrо класса обнаруживают не только идентичный интерфейс, но и идентичное «поведение». При этом различают методы экземпляров и методы класса, понимая под этим, что соответствующий метод либо относится к определенным экземплярам класса, либо действует независимо от них.

В качестве примера представим себе класс Треуrольник, обладающий такими мeтодами, как Нарисовать, Удалить, Переместить, а также свойствами Позиция, Размеры, Цвет. Для этоrо класса определены методы и написан соответствующий код, с помощью которого треуrольник рисуется, удаляется или перемещается с одной  rroзиции на друrую. Отдельные экземпляры обладают значениями свойств: опре

деленной поз!щией, размерами и цветом. Если требуется удалить какой

значениями свойств: определенной позицией, размерами и цветом. Если требуется удалить какой-

либо Tpeуrольник, пользуются его методом Удалить. Хотя этот метод и определен в классе

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

О наследовании rоворят, коrда класс объектов порождается из друrоrо класса. Порожденный класс (подкласс) находится со своим родптельским классом (суперклассом) в отношении «подкласс есть суперкласс» и наследует все ero свойства и методы. А значит, подкласс обладает интерфейсом, подобным интерфейсу суперкласса, и может применяться вместо кero. Этот принцип называется замещением и означает, что каждое сообщение, принимаемое экземплярами класса, применимо

также и к экземплярам ero подкласса.

Далее подкласс конкретизируется путем добавления новых свойств и методов, отсутствующих в суперклассе. Кроме тoro, переписывая унаследованные методы, можно изменять «поведение» подкласса по сравнению с его суперклассом.

Однако возможности удалять свойства и методы, принадлежащие классу, не предоставляется, поскольку она вступила бы в противоречие с принципом замещения. Подкласс, в свою очередь, может породить следующий подкласс и так далее. Глубина наследования лоrически не оrраничена. Зачастую в объектной системе все классы происходят от единственноrо базовоrо класса, предоставляющeго весьма общую объектную функциональность. Hа каждой ступени иерархии наследования класс постепенно конкретизируется. При множественном наследовании, поддерживаемом далеко не всеми объектными системами, у одного подкласса может быть несколько суперклассов. Это придает дополнительную гибкость создаваемой иерархии классов, но таит в себе нeкоторую опасность. Так, должны каким-то образом разрешаться конфликты, возникающие при попытке наследования от нескольких суперклассов различных методов с одинаковыми именами.

Попробуем расширить наш пример Треугольник еще несколькими гeoметрическими формами. Тогда имеет смысл обобщить состоящую пока что из одного единственного класса иерархию таким образом, чтобы она позволяла описывать любые формы. Это достигается введением суперкласса Форма. В нем могут  быть определены уже используемые для треугольника методы Нарисовать, Удалить и Переместить. Разумеется, не стоит и мечтать о написании кода, рисующего любые геометрические формы. Вместо этого, опуская код метода Нарисовать в суперклассе Форма, мы просто включаем соответствующий специализированный код в подклассы Треугольник, Эллипс и Прямоугольник.

Несмотря на кажущуюся простоту, сделав (пустое) определение метода в суперклассе, мы совершили нечто очень важное. А именно мы определили интерфейс, посредством которого может быть нарисована любая геометрическая форма. Teперь на основе замещения мы можем отправить сообщение Выполни метод «Нарисовать» любому объекту любого подкласса Форма. Возможность наполнять методы с помощью кода лишь в подклассах (и добавлять методы и свойства в подклассах) позволяет нам, таким образом, увеличивать степень конкретизации в нашей иерархии классов. Действуя подобным образом, становится нетрудно расширять приложение: если оно в состоянии оперировать объектами класса Форма, то оно aвтоматически

 сможет использовать и все его подклассы. Например, Пятиуrольник поддерживается сразу же после включения в иерархию классов без каких-либо дополнительных действий.

Теперь рассмотрим классы Крyг и Квадрат как подклассы Эллипса и Прямоугольника, оба являются особыми случаями соответствующих суперклассов и мoгут coдepжать дополнительные правила, справедливые лишь в этих особых случаях. Речь идет о таких правилах, как «длина всех сторон квадрата одинакова». Итак, в иерархии классов достаточно, один раз описав общий случай, реализовать исключения лишь в подклассах. В предыдущем примере мы ввели суперкласс Форма, содержащий все определения геометрических форм. Определив этот класс, не имело бы большого смысла заниматься созданием eгo экземпляров, не зная, о какой геометрической форме идет

речь. Классы, которые, подобно классу Форма, могут служить лишь основой для определения подклассов, называются абстрактными (abstract); экземпляры абстрактных классов создавать нельзя.

Далее, иногда встречаются классы, от которых нельзя порождать подклассы. Haзовем их финальными (final). Однако чаще как финальные определяются отдельные методы и свойства классов. Тогда в дальнейшем в создаваемых подклассах изменить соответствующие методы и свойства будет уже нельзя.

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

Таким образом, полиморфизм является важнейшей основой для безболезненной адаптации объектно-ориентированного приложения, а также для его расширения с наименьшим риском возникновения ошибок

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

Так, в коммерческом приложении мы имеем дело с клиентами, которых хотим отобразить в классе Клиент. Последний обладает не только простыми свойствами строкового или целочисленного типа, но и свойством Имя. Предположим, оно состоит из фамилии, имени, отчества, а также, возможно, из званий и ученых степеней. Такие составные (либо производные) типы данных в прогрессивных системах определяются как расширенные типы данных (Advaпced Data Types) и могут использоваться точно так же, как и поставляемые вместе с системой базовые типы данных. При этом определение типа данных является особым случаем определения класса.

С другой стороны, каждый класс о6ъектов одновременно может рассматриваться и как некоторый тип данных. Предположим, что в рассматриваемом примере коммерческого приложения необходимо управлять сетью агентов по сбыту, информация о которых хранится в классе Агент. Тогда объект класса Клиент может иметь свойство типа Агент для отражения факта наличия ссылки на агента, обслуживающего данного клиента.

В отличие от агента по сбыту адрес не должен идентифицироваться независимо отклиента, поэтому eгo естественно представить как встроенный объект. В этом случае eгo свойства Улица и Город будут существовать лишь в контексте объекта Клиент, однако адрес будет иметь собственное определение класса, которое, возможно, удастся использовать повторно (к примеру, при определении класса Поставщик).

Встроенный объект, в свою очередь, может содержать другой встроенный объект;

глубина встраивания логически неограничена.

Большие неструктурированные множества данных, как правило, хранятся в виде потоков данных (BiпaryLargeObjectsBLOBs). В нашем примере этим механизмом можно было бы воспользоваться для хранения графического изображения маршрута проезда к клиенту.

Наконец, свойство может повторяться многократно (независимо от eго типа дaнных). В этом случае говорят о коллекции. Так, в объекте Клиент может содержаться неограниченное число счетов в виде встроенных объектов; с тем же успехом коллекция может содержать и простые значения, такие как строки символов, расширенные типы данных или ссылки на объекты.

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. Представление многомерных структур данных ядра системы в виде объектов, инкапсулирующих как данные, так и методы их обработки. Позволяет реализовать объектный доступ к данным.

• Сервер CacheSQL. Представление многомерных структур данных в виде реляци­онных таблиц. Позволяет реализовать реляционный доступ к данным.

• Сервер прямого доступа (CacheDirect). Предоставление прямого чрезвычайно эф­фективного доступа к многомерным структурам данных ядра системы.

Саche Objects состоят из следующих компонентов (см. рис. ):

 

· Сасhе Object Architect - интегрированная GUI - среда разработчика для определения классов,включая их свойства и методы. Эти определения могут быть экспортированы в файлы в формате CDL, который может использоваться также и напрямую для описания классов Cache.

· Библиотека классов (Class Dictionary) - универсальный репозиторий, coдepжащий определения всех классов Cache. Остальные компоненты CacheObjects взаимодействуют с библиотекой классов через 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é предлагает следующий набор утилит: · Редактор конфигурации · Studio · Terminal · Проводник · Панель управления · SQL-менеджер Все утилиты запускаются из Caché-куба, который располагается в правой части экрана, щелчком правой кнопки мыши. Утилита «Редактор конфигурации» предназначена для задания и просмотра следующих параметров конфигурации: · системной информации · рабочих областей · баз данных · сетевых соединений · CSP-приложений · лицензии Caché Большинство параметров конфигурации выполняются динамически и не требуют перезапуска системы Caché. «Редактор конфигурации» может использоваться для создания базы данных. База данных Caché это файл с именем Cache.dat. По умолчанию база данных Caché располагается в директории C:\CacheSys\MGR\User. Для создания своей базы данных в другой директории на вкладке «Базы данных» Редактора конфигурации по кнопке «Мастера…» выбирается соответствующий мастер. По умолчанию начальный размер базы равен 1 МБ. На рис.1 изображено окно «Редактора конфигурации». На рис. 2 изображено окно выбора мастеров. Созданная база данных связывается со своей рабочей областью (namespace), которая так же может быть создана с помощью Редактора конфигурации, для этого необходимо выбрать мастер «Создание области». По умолчанию разработка ведется в рабочей области User. Caché Studio это интегрированная, визуальная среда создания объектно-ориентированных баз данных и Web-приложений. Она имеет следующие особенности для обеспечения быстрой разработки: · Возможность редактирования определений классов, CSP-страниц, программ на Caché Object Script(COS) в единой интегрированной среде; · Полнотекстовое редактирование с подсветкой команд, а также проверкой синтаксиса на следующих языках: Caché Object Script, Basic, Java, SQL, JavaScript, HTML, и XML; · Поддержка команды разработчиков, работающих с общим репозиторием кода приложения; · Наличие отладчика; · Организация кода в проект; · Наличие мастеров, позволяющих создавать классы, методы, свойства, связи, 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) Newdiff,zz Setdiff=max-min,zz=$Random(diff)+1+min Quit zz Если функция откомпилирована в области USER как отдельная программа, то обращаться к ней в командной строке терминала можно следующим образом: USER>Setst=$$^Random(100,1000)  Writest 784 // результат или USER>write $$^Random(10,1000),"****",$$^Random(10,1000) 287****376 Заметим, что вызов пользовательской функции осуществляется в соответствии с синтаксисом: $$Name(список параметров) а циркумфлекс ^ перед именем нужен в том случае, если функция сохраняется как отдельная программа. Если программа прерывается по ошибке, то в заголовке приглашения появляется указание на место ошибки в тексте программы, например USER 3e1> Чтобы восстановить прежний вид приглашения, выполните команду q (quit), которая завершит программу, а вид приглашения восстановится USER> Клавиатурный интерфейс Caché Terminal Клавиатурный интерфейс программы Caché Terminal весьма примитивен. В режиме эмуляции реального терминала VT 320 работают следующие клавиши:
Клавиша Действие
<Insert> insert/overrite
<Delete> Уничтожить литеру под курсором
<Home> Перейти в начало строки
<End> Перейти в конец строки
<Up Arrow> Вниз по стеку команд сеанса
<Down Arrow> Вверх по стеку команд сеанса
<Left Arrow> Влево на символ
<Right Arrow> Вправо на символ
<Ctrl>,I Вставить пробел
<Ctrl>,L Уничтожить от курсора до конца строки
<Ctrl>,U Уничтожить от курсора до начала строки
<Ctrl>,W Уничтожить от курсора до конца слова
<Ctrl>,G Уничтожить от курсора до начала слова
<Ctrl>,X Очистить строку
<Ctrl>,S Заблокировать вывод на экран
<Ctrl>,Q Разблокировать вывод на экран
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é оснащает встраиваемые классы объектов следующими функциональными возможностями: · Создавать строку символов, отражающую полное состояние объекта (значения всех его свойств). Создание такой строки символов называется преобразованием объекта в последовательную форму, или сериализацией объекта. · Автоматически считывать эту последовательную строку из базы данных и представлять в памяти в виде самостоятельного объекта. Автоматическую загрузку в память связанных объектов будем называть подкачкой (по-английски swizzling). Встроенные объекты представляются в памяти и базе данных совершенно по-разному: · В памяти встроенный объект существует как отдельный объект, ничем не отличающийся от объектов других видов. Значение встроенного объекта в памяти — это объектная ссылка (OREF) на представления объекта в памяти. · В базе данных встроенный объект сохраняется в последовательной форме как часть объекта, в который он встроен. У встроенного объекта отсутствует идентификатор (OID), и он не может использоваться другими объектами без содержащего его объекта. В качестве примера рассмотрим класс объектов Производитель. У производителя имеются не только такие простые свойства, как Наименование и Отрасль, но также и адрес, содержащий Индекс и Город. Несомненно, атрибуты адреса можно было бы определить напрямую в виде нескольких свойств класса Производитель. Поначалу это кажется осмысленным, ведь адрес представляет собой свойство производителя, а значит, не должен существовать независимо от него. Однако и другие объекты — поставщики, клиенты, персоны — также имеют адреса. Поэтому крайне желательно, определив понятие Адрес лишь единожды, многократно применять его в различных классах объектов. Именно это и происходит, когда при определении класса Производитель обращаются к ранее определенному классу объектов Адрес и встраивают его в новый класс. С одной стороны, этот класс может быть также использован в классах Поставщик, Клиент и Персона, что позволяет создать стандарт для разработки приложений. С другой стороны, сводятся к минимуму издержки, связанные с возможным в будущем изменением формата почтового индекса или с добавлением к адресу нового свойства «e-mail». 6. Хранимые классы объектов Хранимые (в переводе с латыни — длительные) классы объектов обладают обширными функциональными возможностями, обеспечивающими длительное хранение их экземпляров в базе данных. Эти возможности наследуются от системного класса %Library.Persistent. Экземпляры хранимых классов обладают однозначными объектными идентификаторами (OID) и могут независимо храниться в Caché. Когда хранимый объект используется как свойство класса, говорят о ссылке на хранимый объект. Пусть производитель транспортного средства определен в виде хранимого класса Производитель. Если свойству Производитель класса Транспортное средство назначить тип Производитель, будет образована ссылка на хранимый объект. Каждый экземпляр класса Транспортное средство может теперь ссылаться на экземпляр класса Производитель, причем каждый производитель существует независимо от того, ссылаются ли на него транспортные средства и в каком количестве. С точки зрения класса Транспортное средство свойства и методы производителя, на которого делается ссылка, могут применяться аналогично собственным свойствам и методам. При этом Caché автоматически загружает в память объекты, на которые делается ссылка, осуществляя подкачку (swizzling).
 
Типы данных Caché поддерживает неограниченное количество типов данных для свойств классов, причем каждый тип данных представляет собой класс. Вы можете реализовать ваши собственные типы данных (Advanced Data Types — ADTs), определяя соответствующие классы типов данных. Кроме того, классы типов данных управляют поведением свойств объектов, когда они посредством SQL представляются в виде столбцов реляционных таблиц. Являясь особой формой классов, типы данных имеют принципиальные отличия от классов объектов: · от классов типов данных невозможно образование экземпляров; · классы типов данных не могут содержать свойств; · методы классов типов данных предоставляются программисту через интерфейс типов данных. Классы типов данных обладают следующими функциональными возможностями: · Отвечают за проверку значений, которая в дальнейшем может конкретизироваться с помощью параметров классов типов данных · Они определяют преобразования между форматом хранения (в базе данных), логическим (в памяти) и форматом отображения значений. · Обеспечивают взаимодействие с SQL, ODBC, ActiveX и Java, предоставляя в их распоряжение необходимые в каждом случае операции и методы преобразования данных. Классы типов данных, поддерживаемые Caché, приведены в следующей таблице.
Тип данных Назначение Аналогичный SQL-тип Поддерживаемые параметры
%Binary Двоичное значение BINARY, BINARY VARYING,RAW, VBINARY MAXLEN, MINLEN
%Boolean Логическое значение (0- ложь, 1- истина) Не определен  
%Currency Валюта MONEY, SMALLMONEY DISPLAYLIST, FORMAT, MAXVAL, MINVAL, VALUELIST
%Date Дата (внутренний формат) DATE DISPLAYLIST, FORMAT, MAXVAL, MINVAL, VALUELIST
%Float Число с плавающей точкой DOUBLE, DOUBLE PRECISION, FLOAT, REAL DISPLAYLIST, FORMAT, MAXVAL, MINVAL, SCALE, VALUELIST, XSDTYPE
%Integer Целое число BIT, INT, INTEGER, SMALLINT, TINYINT DISPLAYLIST, FORMAT, MAXVAL, MINVAL, VALUELIST, XSDTYPE
%List Данные в формате $List, специфическом для Caché не определен ODBCDELIMITER
%Name Имя в формате "Фамилия.Имя" не определен COLLATION, INDEXSUBSCRIPTS, MAXLEN, XSDTYPE
%Numeric Число с фиксированной точкой DEC, DECIMAL, NUMBER, NUMERIC DISPLAYLIST, FORMAT, MAXVAL, MINVAL, SCALE, VALUELIST
%Status Код ошибки не определен  
%String Строка символов CHAR, CHAR VARYING, CHARACTER, CHARACTER VARYING, NATIONAL CHAR, NATIONAL CHAR VARYING, NATIONAL CHARACTER, NATIONAL CHARACTER VARYING, NATIONAL VARCHAR, NCHAR, NVARCHAR, VARCHAR, VARCHAR2 COLLATION, DISPLAYLIST, MAXLEN, MINLEN, PATTERN, TRUNCATE, VALUELIST, XSDTYPE
%Time Время во внутреннем представлении TIME DISPLAYLIST, FORMAT, MAXVAL, MINVAL, VALUELIST
%TimeStamp Отметка времени, состоящая из даты и времени TIMESTAMP DISPLAYLIST, MAXVAL, MINVAL, VALUELIST

 

Параметры

Классы типов данных поддерживают различные параметры, которые меняются от типа к типу и выполняют различные действия.

Примеры параметров:

MAXLEN — задает максимальное число символов, которое может содержать строка.
MAXVAL— задает максимальное значение MINLEN — задает минимальное число символов, которое может содержать строка.MINVAL — задает минимальное значение.
FORMAT — задает формат отображения. Значение параметра соответствует опции форматирования функции $FNUMBER, которая выполняет форматирование.
SCALE — определяет число цифр после десятичной точки.

PATTERN — задает шаблон, которому должна соответствовать строка. Значение параметра PATTERN должно быть правильным выражением шаблона Caché.

TRUNCATE — если значение равно 1, то строка символов должна обрезаться до длины, указанной в параметре MAXLEN (умолчание), если равно 0, то нет.
ODBCDELIMITER — задает символ-разделитель в списке %List, когда он передается через ODBC.
VALUELIST–задает список значений для перечислимых свойств

DISPLAYLIST – определяет дополнительный список значений перечислимого свойства, задает формат отображения для перечислимого свойства, используется вместе с параметром VALUELIST.

Форматы данных и методы преобразования классов типов данных

Оперируя с константами, Caché, распознает различные форматы данных. В следующей таблице содержится их обзор.

Формат данных Назначение
Display Формат отображения данных
Logical Формат внутреннего представления данных в оперативной памяти
Storage Формат хранения данных
ODBC Формат представления данных для ODBC и SQL

Существуют методы для преобразования форматов, представленные в следующей таблице:

Метод Назначение
DisplayToLogical() Преобразует отображаемые значения во внутренний формат
LogicalToDisplay() Преобразует значение из внутреннего формата в формат отображения
LogicalToODBC() Преобразует значение из внутреннего формата в формат ODBC (опциональный метод)
ODBCToLogical() Преобразует значение из формата ODBC во внутренний формат (опциональный метод)
LogicaToStorage() Преобразует значение из внутреннего формата в формат базы данных (опциональный метод)
StorageToLogical() Преобразует значение из формата базы данных во внутренний формат (опциональный метод)

Эти методы служат основой для создания методов свойств в соответствующих классах. В качестве примера рассмотрим класс Person со свойством DateOfBirth типа данных %Library.Date. Тогда для класса Person Caché будет автоматически создавать методы DateOfBirthDisplayToLogical(), DateOfBirthLogicalToDisplay() и т.д. и применять их для соответствующих преобразований.


Дата добавления: 2018-05-12; просмотров: 556; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!