nsutextbook (1037554), страница 10
Текст из файла (страница 10)
Состояние объекта задают значения его свойств, поведение объекта задают его методы (операции). Интерфейс объекта может иметь одну илинесколько реализаций. Объектная модель Caché представлена на рис. 10.В Caché реализовано два типа классов:• Классы типов данных (литералы).• Классы объектов (объекты).Классы типов данных задают допустимые значения констант (литералов) и позволяют их контролировать. Каждый объект имеет уникальный идентификатор, в то время каклитерал не имеет идентификации, и от него не могут образовываться экземпляры. Классытипов данных имеют предопределенный набор методов проверки и преобразования значений атрибутов. Эти классы не могут содержать свойств.Классы типов данных подразделяются на два подкласса типов:• Атомарные.• Структурированные.Атомарными литеральными типами в Caché являются традиционные скалярные типыданных (%String, %Integer, %Float, %Date и др.).
В Caché реализованы две структуры классов типов данных – список и массив. Каждый литерал уникально идентифицируется индексом в массиве или порядковым номером в списке.Классы типов данныхКлассыКлассыобъектовНезарегистрированные классыЗарегистрированные классыВстраиваемыеклассыХранимыеклассыРисунок 10. Объектная модель CachéКлассы объектов подразделяются на незарегистрированные и зарегистрированныеклассы.Объект может существовать в двух формах: в памяти процесса и в виде хранимойверсии объекта в базе данных.
В соответствии с этим различают два вида ссылок на объект: для идентификации объекта в оперативной памяти используется ссылка OREF (objectreference), если же объект сохраняется в базе данных, ему назначается долговременныйобъектный идентификатор – OID (object ID). Объект получает OID в момент первой записи в базу данных. OID не меняется, пока существует объект. OREF – назначается объекту,когда он попадает в оперативную память.
При каждой новой загрузке в оперативную память объект может получить новую объектную ссылку OREF.44Незарегистрированные классы не несут в себе предопределенного поведения, все ихметоды разработчик делает сам. При этом разработчик сам отвечает за назначение и поддержку уникальных идентификаторов объектов (OID) и объектных ссылок (OREF).
Из-затого, что идентификация не реализована на уровне Caché, незарегистрированные классыобнаруживают ряд ограничений:- Система не выделяет память для значений свойств объектов.- Отсутствует автоматическая подкачка объектов, на которые делаются ссылки.- Полиморфизм не поддерживается.- Переменные, ссылающиеся на незарегистрированные объекты, должны явно декларироваться с указанием соответствующего класса.Зарегистрированные классы, напротив, обеспечены обширным набором встроенныхметодов, например, таких как %New() для создания экземпляра объекта или %Close() –для удаления его из памяти. Это предопределенное поведение наследуется от системногокласса %RegisteredObject.
Экземпляры зарегистрированных классов существуют лишьвременно в памяти процесса, поэтому их называют временными объектами. Противоположность им составляют встраиваемые и хранимые классы, которые могут длительноевремя храниться в базе данных. Создание новых зарегистрированных объектов классов иуправление ими в оперативной памяти выполняет Caché.
При этом программисту предоставляется объектная ссылка на экземпляр объекта, которая позволяет ссылаться на объектв оперативной памяти. Зарегистрированные классы поддерживают полиморфизм.Сериализуемые (встраиваемые) классы наследуют свое поведение от системногокласса %SerialObject и могут длительное время храниться в базе данных. Основной особенностью хранения сериализуемого класса является то, что объекты сериализуемыхклассов существуют в оперативной памяти как независимые экземпляры, однако могутбыть сохранены в базе данных, только будучи встроенными в другой класс. Основнымпреимуществом использования сериализуемых классов является минимум издержек приизменении структуры классов.Встроенные объекты представляются в оперативной памяти и базе данных совершенно по-разному:- В оперативной памяти этот объект ничем не отличается от других объектов.На него указывает объектная ссылка – OREF.- В базе данных встроенный объект хранится как часть объекта, в который онвстроен.
При этом у встроенного объекта отсутствует OID, и он не можетиспользоваться другими объектами без содержащего его объекта.Хранимые классы наследуют свое поведение от системного класса %Persistent.%Persistent предоставляет своим наследникам обширный набор функций, включающий:создание объекта, подкачку объекта из базы данных в память, удаление объекта и т.п. Каждый экземпляр хранимого класса имеет 2 уникальных идентификатора – OID и OREF.OID идентифицирует объект, записанный в базу данных, а OREF идентифицирует объект,который был подкачан из базы данных и находится в памяти.Объектная модель Caché в полном объеме поддерживает все основные концепцииобъектной технологии:Наследование. Объектная модель Caché позволяет наследовать классы от произвольного количества родительских классов.Полиморфизм. Объектная модель Caché позволяет создавать приложения целиком иполностью независимыми от внутренней реализации методов объекта.Инкапсуляция.
Объектная модель Caché обеспечивает сокрытие отдельных деталейвнутреннего устройства классов от внешних по отношению к нему объектов или пользователей. Разделяют интерфейсную часть класса и конкретную реализацию. Интерфейснаячасть необходима для взаимодействия с любыми другими объектами.
Реализация жескрывает особенности реализации класса, т.е. все, что не относится к интерфейсной части.45Хранимость. Система Caché поддерживает несколько видов хранения объектов: автоматическое хранение в многомерной базе данных Caché; хранение в любых структурах,определенных пользователем; хранение в таблицах внешних реляционных баз данных,доступных через шлюз Caché SQL Gateway.Класс объектов в Caché хранится в двух формах:• Описательная форма. Поддерживается развитый язык описания классов объектов UDL (unified definition language), построенный на базе XML (extensiblemarkup language).• Объектная run-time форма. Использование класса возможно только после егокомпиляции в объектный код.46Глава 5.
Работа с классами5.1. Правила идентификацииКаждый идентификатор должен быть уникален внутри своего контекста. Максимальные длины всех идентификаторов приведены в табл.7:Таблица 7ИдентификаторОграниченияИмя пакета<=31 символИмя классаОграничений на длину имени нет, но только первые 25символов используются для идентификации класса.Имя метода<=31 символИмя свойства<=31 символДругие членыкласса<=128 символовВнутри Caché имена преобразуются в верхний регистр, что следует учитывать приназначении имени. Идентификатор должен начинаться с буквы, но может содержать цифры.
Не может содержать пробелы или знаки пунктуации, за исключением имен пакетов,которые могут содержать символ «.» (точку). Идентификаторы, начинающиеся со знака%(процент) являются системными элементами. Например, многие методы и пакеты, обеспечивающиеся библиотекой Caché, начинаются со знака «%».5.2. Элементы классовПолный список элементов определения класса охватывает:• Однозначное имя класса• Ключевые слова – несколько ключевых слов, позволяющих модифицироватьопределение класса• Свойства (состояния) – элементы данных для хранения в экземплярах класса.Могут быть константами, встроенными объектами и ссылками на хранимые объекты.Классы типов не содержат свойств.• Методы – программный код, определяющий поведение объекта.• Параметры класса – константы, осуществляющие настройку функциональныхвозможностей класса во время его компиляции (обычно с использованием генераторов методов).• Запросы – операции с множеством экземпляров класса• Индексы – структуры в долговременной памяти, оптимизирующие доступ к объектам.Работа с классами выполняется в Caché Studio с помощью мастеров, которые позволяют в режиме диалога создавать классы, параметры класса, свойства, методы, запросы,индексы.
Перед использованием класс необходимо откомпилировать.Синтаксис определения класса:Class <Пакет.Имя класса> Extends <Список суперклассов>[ ключевое слово=значение, …]{код47}Пример 1:Class Cinema.TicketConfirm Extends (%CSP.Page, Cinema.Utils){}где Cinema – имя пакета, TicketConfirm – класс, %CSP.Page, Cinema.Utils – суперклассы, наследником которых является класс TicketConfirm.Пример 2:Class Im.Class1 Extends %Persistent [classType = persistent, procedureBlock]{…}где Im – имя пакета, Class1 – имя класса, %Persistent – суперкласс, classType и procedureBlock – ключевые слова.5.3. Имя классаИмя класса – уникальный идентификатор класса, для облегчения восприятия допускается использование обоих регистров букв. Внутри Caché имена преобразуются в верхний регистр, что следует учитывать при назначении имени.
Имена, начинающиеся со знака %(процент) – зарезервированы для элементов системных классов.Ограничений на длину имени нет, но только первые 25 символов используются дляидентификации класса.5.4. Ключевые словаОпределение класса может быть модифицировано посредством нескольких ключевых слов. Все ключевые слова необязательны и имеют стандартное значение на тот случай, если они не заданы. Ключевые слова необходимы, прежде всего, при разработке определений классов. Примеры ключевых слов:Abstract – означает, что нельзя создать экземпляр данного класса, используется дляклассов типов данных.ClassType – определяет поведение класса.
Допустимые значения: datatype, persistent,и serial. Например:1. ClassType = datatype – означает, что это класс типа данных.2. ClassType = persistent – хранимый класс3. ClassType =serial – сериализуемый классFinal – означает, что это финальный класс, т.е. от него невозможно образованиеподклассов.Super – задает один или несколько суперклассов для данного класса. По умолчаниюкласс не имеет суперкласса.5.5. СвойстваСвойства представляют состояние объектов. Существует два типа свойств:• Свойства, содержащие значения• Свойства-связи, задающие связи между объектами.Свойство имеет однозначное имя, тип, необязательный список ключевых слов, необязательный список параметров, определенных для соответствующего типа данных.Синтаксис:Property <Имя свойства> as <тип> (параметры) [ключевые слова]Примеры свойств, содержащих значения:48Property Total As %Float (SCALE = 2);Property Description As %Library.String (MAXLEN = 300);Property PlayingNow As %Library.Boolean [ InitialExpression = 1 ];Property Rating As %Library.String (VALUELIST = ",G,PG,PG-13,R");Property Pr As %String [ Required ];Property SALARY As %Integer (MINVAL = "0", MAXVAL = "1000000");Property SecretName As %String (MAXLEN = "20") [ Private, Required ];Пример свойства связи:Relationship Chapter As Chapter [Inverse = Book, Cardinality = Many];Для свойств в Caché справедливы следующие утверждения:• Свойства могут быть константами, ссылками на хранимые объекты, встроеннымиобъектами, потоками данных (CLOB’ы), либо коллекциями констант или объектов.• Со свойствами непосредственно связан набор автоматически выполняемых методов проверки и сохранения значений.• При осуществлении доступа к значениям свойств, а также при их сохранении,возможно прозрачное изменение формата и другие изменения данных.• Объекты, на которые делаются ссылки, равно как и встроенные объекты, при обращениях к соответствующим свойствам автоматически загружаются в память (подкачиваются).5.5.1.