Select ID, Name from SQLUser.Person



Встроенныепакеты

Для совместимости с ранними версиями используются «встроенные» пакеты:

· "%Library" – любой %class без имени пакета это просто часть пакета "%Library"

· "User" – любой не-%class без имени пакета принадлежит пакету "User"

Элементы классов

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

· однозначное имя класса;

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

· свойства (известные также как состояние) — элементы данных для хранения в экземплярах класса. Свойства могут быть константами, встроенными объектами и ссылками на хранимые объекты. Классы типов данных не содержат свойств;

· методы — код, реализующий те или иные функциональные возможности;

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

· запросы — операции с множеством экземпляров класса;

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

Работа с классами выполняется в Caché Studio с помощью мастеров, которые позволяют в режиме диалога создавать классы, параметры класса, свойства, методы, запросы, индексы. Перед использованием класс необходимо откомпилировать.
Синтаксис определения класса:

Class <Пакет.Имя класса> Extends <Список суперклассов>
[ ключевое слово=значение, …]
{код}

Пример:

Class Im.Class1 Extends %Persistent [classType = persistent, procedureBlock]
{ …
}

гдеIm – имяпакета, Class1 – имякласса, %Persistent – суперкласс, classTypeиprocedureBlock – ключевыеслова.

Имя класса

Имя класса – уникальный идентификатор класса , для облегчения восприятия допускается использование обоих регистров букв. Внутри Caché имена преобразуются в верхний регистр, что следует учитывать при назначении имени. Имена, начинающиеся со знака %(процент) – зарезервированы для элементов системных классов. Ограничений на длину имени нет, но только первые 25 символов используются для идентификации класса.

Ключевые слова

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

Примеры ключевых слов:

· Abstract – означает, что нельзя создать экземпляр данного класса, используется для классов типов данных.

· ClassType – определяет поведение класса. Допустимые значения: datatype, persistent,и serial.
Например:

1. ClassType = datatype – означает, что это класс типа данных.

2. ClassType = persistent – хранимый класс

3. ClassType = serial – сериализуемый класс

· Final – означает, что это финальный класс, т.е. от него невозможно образование подклассов.

· Super – задает один или несколько суперклассов для данного класса. По умолчанию класс не имеет суперкласса.

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

 
Мастер создания классов Мастер создания класса, несомненно, предоставляет наиболее легкий путь к созданию определения нового класса в Cache, направляя разработчика на протяжении нескольких первых шагов Вызвать его можно либо через меню Файл/Создать/Класс Cache, либо выбрав опцию Создание класса контекстного меню Классы в окне проекта В поле Имя пакета введите имя пакета, которому должен принадлежать новый класс. Возможен как выбор имени существующего пакета, так и ввод нового имени. В следующем поле введите имя класса, не забывая о том, что имена, начинающиеся с процента (%), зарезервированы для системных классов Cache. Имеется возможность поместить описание класса в поле Описание, в тексте допустимы теги HTML. Документировать класс не обязательно, но настоятельно рекомендуется, особенно когда над проектом трудятся несколько программистов. Созданные на этом этапе описания используются Cache при автоматическом создании системной документации класса. На практике иерархия классов нередко целиком составлена и документирована уже на ранней стадии проекта, до того, как началась фаза программирования, в процессе которой постепенно, шаг за шагом реализуется функциональность объекта. Далее укажите тип класса, как правило, для хранимых классов — Persistent, а для встраиваемых — Serial. Классы типа Registered являются временными, у них отсутствуют методы загрузки и сохранения значений в базе данных. Abstract (абстрактные) классы служат шаблонами для порождения производных классов. Классы типа Data Type являются носителями набора методов (заранее известного состава), так называемого интерфейса типов данных, определяющего поведение свойств данного типа. Классы CSP используются в Cache Server Pages. От родительского класса, заданного в поле Имя Суперкласса, класс наследует свои элементы. Если поле содержит имена нескольких классов, разделенные запятой, то имеет место множественное наследование. От перечисленных классов могут быть унаследованы все элементы класса (свойства, методы и т.д.), а при совпадении имен действует определение элемента из последнего класса в списке. Некоторое исключение составляют ключевые слова класса, которые наследуются от первого суперкласса в списке.   Если класс определен как хранимый, мастер предложит ввести ряд дополнительных характеристик. Вы можете указать владельца класса, если желаете воспользоваться средствами безопасности SQL. В поле Имя таблицы SQL вводится имя, под которым класс будет отображаться в таблицу SQL, в противном случае в качестве имени таблицы используется имя класса. Необходимость в переопределении имени возникает в том случае, когда оно является зарезервированным словом SQL или содержит знак подчеркивания, недопустимый в именах SQL. Следующие два флажка управляют наследованием поведения от некоторых важных системных классов. Первый из них, будучи установлен, указывает на необходимость автоматического включения методов XML-отображения. Если установить второй флажок, будут добавлены методы, позволяющие автоматически заполнять класс псевдослучайными тестовыми данными. Определение класса создано. Появится окно редактирования Cache Studio с его представлением на языке CDL и окно Инспектора с табличным представлением. Свойства Свойства представляют состояние объектов. Если это осуществляется посредством хранения некоторых значений (как это имеет место в Cache), но в этом случае говорят об атрибутах объектов. Возможность доступа к свойствам и операций над ними базируется на объектной модели Cache и определениях классов. Во многих объектно-ориентированных языках, таких, как Java и C++, не существует целостной концепции свойства. Вместо неё используется комбинация закрытых переменных и открытых методов, делающих эти переменные доступными. Существует два типа свойств: · Свойства, содержащие значения · Свойства-связи, задающие связи между объектами. Свойство имеет однозначное имя, тип, необязательный список ключевых слов, необязательный список параметров, определенных для соответствующего типа данных. Синтаксис: Property <Имя свойства> as <тип> (параметры) [ключевые слова] Примеры свойств, содержащих значения: Property 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’ы), либо коллекциями констант или объектов. · Со свойствами непосредственно связан набор автоматически выполняемых методов проверки и сохранения значений. · При осуществлении доступа к значениям свойств, а также при их сохранении, возможно прозрачное изменение формата и другие изменения данных. · Объекты, на которые делаются ссылки, равно как и встроенные объекты, при обращениях к соответствующим свойствам автоматически загружаются в память (подкачиваются). Видимость свойств Свойства могут быть определены как открытые (public) или как закрытые (private). Если свойство является закрытым, оно может быть использовано лишь методами класса, к которому оно относится. Открытые свойства (каковыми они и являются по умолчанию) могут применяться без ограничений. Закрытые свойства наследуются и внутри подклассов являются видимыми. В других языках программирования свойства с подобным поведением нередко называются защищенными (protected). Поведение свойств Со свойствами автоматически связано несколько методов, Эти методы не создаются простым наследованием. Каждое свойство наследует свой набор методов от двух различных источников: · От класса – в зависимости от вида свойства – наследуется общее поведение. Это, например, методы Get(), Set(), а также методы проверки. · От класса типа данных – в зависимости от класса типа данных наследуется поведение, зависящее от типа данных. Многие из этих методов являются генераторами методов, которые, например, позволяют задать минимальное и максимальное значение свойства целочисленного типа. Все классы, наследуют свое поведение от системных классов. Для пользовательских типов данных поведение, унаследованное от системных классов, может быть переопределено. Ключевые слова Можно изменять определение свойства, используя одно или несколько ключевых слов. Все ключевые слова являются необязательными и имеют значение по умолчанию, если ключевое слово явно не задано. Используются следующие ключевые слова: · Calculated – задает вычисляемое свойство, которое не сохраняется. Подклассы наследуют это ключевое свойство и не могут его перекрывать. · Description – описание свойства, которое Caché использует для построения документации класса. Подклассами не наследуется. · Final – свойство, которое не может перекрываться в подклассах. По умолчанию, свойства не являются финальными. Наследуется подклассами. · InitialExpression – задает начальное значение для свойства. По умолчанию свойство не имеет начального значения. Наследуется подклассами и может перекрываться. · Private – задает свойство типа private. По умолчанию, свойства не является private. Наследуется подклассами и не может перекрываться. · Required – свойство должно получить значение перед сохранением на диске. По умолчанию свойства не являются required. Наследуется подклассами и может перекрываться. · Transient – определяет временное свойство, которое не сохраняется в базе данных.По умолчанию свойства не являются transient. Наследуется подклассами и не может перекрываться. · Type – задает имя класса, ассоциированного со свойством, это может быть класс типа данных, хранимый или встроенный класс. По умолчанию это строка (%String). Наследуется подклассами. Виды свойств Существует несколько видов свойств: · Свойства типов данных · Свойства ссылки на объекты · Встроенные объекты · Потоки данных · Многомерные свойства · Свойства коллекции Хранение свойств Объектная модель Cache дает пользователю возможность управлять хранением значений свойств объектов. По умолчанию, значение каждого свойства — будь то константа, встроенный объект либо ссылка на хранимый объект — хранится как часть представления объекта в базе данных, но в равной степени является и частью представления объекта в памяти. В базе данных значение представляется в формате базы данных (storage value), а в памяти — во внутреннем формате (logical value). Обе эти формы, как правило, идентичны. Однако представление экземпляра объекта в базе данных может полностью отличаться от представления в памяти. Посредством использования различных ключевых слов, определенных для свойств, можно воздействовать на оба эти формата представления значений свойств.
Тип свойства В памяти В базе данных
Простое Внутренний формат Формат базы данных
Временное (transient) Внутренний формат Недоступно
Вычисляемое (calculated) Недоступно Недоступно
Многомерное (multidimensional) Многомерный массив Многомерный массив

Временные свойства

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

Вычисляемые свойства

Можно добиться того, чтобы свойство вычислялось только во время выполнения, если объявить его как вычисляемое (calculated). В этом случае разработчик сам должен предоставить в распоряжение Cache соответствующий метод Get(). Например, можно определить свойство Age, не имеющее хранимого значения, при каждом обращении к которому будет вычисляться текущий возраст лица, исходя из даты его рождения и сегодняшней даты. Тогда это свойство должно обладать методом AgeGet(), производящим соответствующие вычисления.

 
Виды свойств Константы (Свойства типов данных) В простейшей форме свойство может быть типа %Integer, %Date, %String или любого другого базового типа для Cache либо самостоятельно определенного программистом класса типа данных. Поведение этих констант управляется классом типа данных, связанным со свойством. В дополнение к этому большинство классов типов данных содержат параметры, которые в дальнейшем конкретизируют тип данных. Например, целочисленное свойство Number с наибольшим значением 100 вы можете определить следующим образом, используя язык определения классов Cache (CDL): Property Count As %Integer(MAXVAL=100); Ссылки на объекты (Однонаправленая ассоциация) Вообще говоря, в Cache каждый класс можно рассматривать и как тип данных. Если при определении свойства вместо класса типа данных указать хранимый класс, тем самым будет образована ссылка на хранимый объект. В этом случае значениями свойства будут ссылки на экземпляры соответствующего класса. Например, так можно определить свойство Manufacturer, являющееся ссылкой на хранимый класс объектов User.Manufacturer: Property Manufacturer As User.Manufacturer; Встроенные объекты Встроенные объекты функционируют аналогично ссылкам на объекты. Существенное различие состоит в том, что в качестве типа данных теперь задается не хранимый, а встраиваемый класс объектов. Следовательно, значение этого свойства — не ссылка на некий самостоятельный экземпляр объекта, а, напротив, сам этот объект встраивается в объект, который на него ссылается. С точки зрения синтаксиса, определение идентично ссылке на класс объектов: Property Address As User.Address; Потоки данных Потоком данных называют большое неструктурированное множество данных, которое нужно хранить в базе данных. Caché SQL обеспечивает хранение данных типа BLOBs (Binary Large Objects) и CLOBs (Character Large Objects) в базе данных. BLOBs используются для хранения двоичных данных, таких как рисунки, изображения, в то время как CLOBs используются для хранения символьной информации. Например, потоки данных могут применяться для хранения документов, технических чертежей или рисунков. Поскольку они могут быть очень велики, Caché не оперирует с потоками данных как с атомарной информацией, а предоставляет прикладным программам методы блочной записи и считывания данных. В соответствии с содержимым различают потоки данных типа CHARACTERSTREAM (состоящие из символов) BINARYSTREAM(состоящие из двоичных данных). Дляманипулированияпотокамииспользуютсяметодыкласса%STREAM. Например: Class MyApp.JournalEntry Extends %Persistent [ClassType = persistent] { Property ItemDate As %Date; Property PictureOfTheDay As %Stream [ Collection = binarystream ]; Property EventsOfTheDay As %Stream [ Collection = characterstream ]; } Класс MyApp.JournalEntry имеетдвасвойстватипапотока: PictureOfTheDay – двоичныйпоток, EventsOfTheDay – символьныйпоток. В зависимости от того, как определено соответствующее свойство, потоки данных автоматически сохраняются в базе данных Caché либо файлах операционной системы. Это различие достигается путем присвоения параметру STORAGE значения GLOBAL, либо FILE. Следующий параметр LOCATION применяется, когда требуется задать имя глобала либо имя каталога файловой системы, в котором должен храниться поток данных. При этом поток данных всегда представляет собой поток данных, а не какой-либо самостоятельный объект. Например: Property GMemo As %Stream (STORAGE="GLOBAL", LOCATION="^MyStream") [collection= binarystream]; Property FMemo As %Stream (STORAGE="FILE", LOCATION="C:\Stream") [collection= binarystream]; В примере значения свойства GMemo будут сохранено в глобале ^MyStream, в то время как значения свойства FMemo будут сохраняться в файле с автоматически генерируемым именем в директории C:\Stream. По умолчанию потоки типа GLOBAL сохраняются в глобале ^PackageClassS. Файловые потоки по умолчанию сохраняются в текущей директории. Подробнее о работе с потоками можно прочитать в разделе "работа с объектами в COS"   Коллекции Свойства, обладающие множеством значений, могут быть представлены в Cache в виде коллекций. Caché поддерживает два типа коллекций: списки (List) и массивы (Array). Коллекции могут содержать константы, встроенные объекты и ссылки на объекты. Основы своего поведения коллекции наследуют от специальных системных классов, зависящих от типа коллекции и типа ее содержимого:
Тип Коллекция-массив Коллекция-список
Константа %ArrayOfDataTypes %ListOfDataTypes
Встроенный объект %ArrayOfObjects %ListOfObjects
Ссылка на объект %ArrayOfObjects %ListOfObjects

Коллекция-массив

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

Ключ Значение
Иванов А.Б. 22.04.1960
Иванов А.В. 29.02.1972
Иванов А.Г. 21.12.1950
... ...

Предыдущему примеру соответствует следующее определение:

Property DateOfBirth As %Date [ Collection = array];

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

PropertyPersonAsUser.Person [ Collection = array ];

Элементы этой коллекции-массива отнюдь не константы, а ссылки на объекты (хранимого) класса Person:

Ключ Значение
Иванов А.Б. Person 5
Иванов А.В. Person 1
Иванов А.Г. Person 2
... ...

Коллекция-список

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

Позиция Значение
1 Иванов А.Б.
2 Иванов А.В.
3 Иванов А.Г.
... ...

В основе предыдущей таблицы лежит следующее определение:

Property Name As %String [ Collection = list ];

Используя соответствующие методы, можно вставлять новые элементы в любые позиции списка или же добавлять их в конец. Также присутствуют методы, которые возвращают элемент, находящийся в определенной позиции, находят последующий или предыдущий элемент и, наконец, определяют позицию заданного элемента. Элементы коллекции-списка могут представлять собой встроенные объекты или ссылки на хранимые объекты. Ниже — пример списка ссылок на хранимые объекты:

PropertyPersonAsUser.Person [ Collection = list ];

Подробнее о работе со свойствами-списками можно прочитать в разделе "работа с объектами в COS"

Многомерные свойства

Свойство может быть объявлено как многомерное. Многомерное свойство ведет себя как многомерная переменная, для которой могут использоваться такие функции как $Order.
Например, свойство abc задано как многомерное:

Property abc [ MultiDimensional ];

Следующий пример демонстрирует работу со свойством abc:

Set x = $DATA(obj.abc)

Set x = $DATA(obj.abc(3))

Set x = $GET(obj.abc(3))

Set x = $ORDER(obj.abc("hello",3))

KILL obj.abc

где obj – это oref-ссылка на объект.

Для работы с многомерными свойствами не используются методы, характерные для классов типов данных. Таким образом, для многомерного свойства с именем Kids не существует методов KidsGet, KidsSet, или KidsLogicalToDisplay. Многомерные свойства не могут отображаться в SQL таблицах.

Двунаправленная ассоциация или отношение (Relationship)

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

Отношения определяются между двумя хранимыми классами:

· Свойство в одном классе имеет указатель на другой класс.

· Класс может также иметь указатель на себя.

Отношения используются вместо списков или массивов объектов, когда необходимо обеспечить ссылочную целостность.

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

Один-ко-многим (One-To-Many)

Используйте этот тип отношений, когда:

· Более чем один объект класса B (сторона много) может ссылаться на объект класса A (сторона один)

· Объекты класса B могут также существовать независимо от объектов класса A

Попытка удаления объекта класса A будет неуспешна, если имеется ссылка хотя бы на один объект класса B.

Для удаления объекта класса A, необходимо удалить ссылки на него из всех объектов класса B.

Пример:

Class User.Company Extends %Persistent [ ClassType = persistent]
{
Relationship Clients As User.Client [ Cardinality = many, Inverse = MyCompany ];
Property OfficeNumber as %Integer;
}

Class User.Client Extends %Persistent [ ClassType = persistent]
{
Relationship MyCompany As User.Company [ Cardinality = one, Inverse = Clients ];
Property Name as %String;
}


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

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






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