Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
19
Добавлен:
18.06.2017
Размер:
882.7 Кб
Скачать

Соединение

Область

Имя пользователя

Пароль

Рис.4. Авторизация пользователя. При успешном завершении процедуры авторизации становится активной

основная среда разработки. На рис.5. приведен внешний вид Caché Studio, а также названия основных составных частей.

 

 

Стандартная панель

 

Панель мастеров

 

 

Главное меню

Панель отладки

 

 

 

 

 

 

 

Область

 

 

 

 

редактирования

 

 

 

 

 

Область

Область

 

 

 

 

 

 

инспектора

 

 

проекта

 

 

 

 

 

 

 

 

 

Область

информации

11

Caché Studio обладает широкими возможностями, однако рассмотрим только те, которые являются отличными от стандартных возможностей Windows-приложений, на примере создания приложения Семья.

Создадим класс Человек и добавим его в проект. Класс в Caché Studio можно создать либо вручную, используя конструкции UDL, либо автоматически, используя Class Wizard. Для вызова Class Wizard необходимо выбрать пункт меню File->New; нажать комбинацию клавиш Ctrl-n; либо нажать на пиктограмме, изображенной ниже:

Затем, в появившемся окне NEW необходимо выбрать элемент проекта, подлежащий созданию:

Выбираем Caché Class Definition и нажимаем ОК. На экране появляется первый шаг мастера классов.

На первом шаге мастера классов указываются общие сведения о создаваемом классе – имя пакета, имя класса и комментарии. Если имя пакета не определено в БД, тогда Caché создаст новый пакет автоматически.

Указываем имя пакета – Family, имя класса – Human, комментарии – Общие данные о человеке и переходим к следующему шагу.

На втором шаге мастера классов указывается вид класса. Виды классов, поддерживаемые объектной моделью Caché, описаны выше. Следует только выделить класс CSP page, при помощи которого можно создавать Web приложения для работы с данными из БД Caché. Особенности этого класса будут рассмотрены подробнее ниже. Класс Человек является встраиваемым, поэтому выбираем вид Serial и переходим на следующих шаг.

В Caché реализована возможность популяции класса, т.е. реализованы методы для генерации тестовых данных объектов класса. Эти методы наследуются из системного класса %Populate. Кроме этого, в Caché 5. включена поддержка импорта данных из XML документов в Caché и наоборот экспорта объектов Caché в XML документы. Методы, реализующие работу с XML данными, определены в системном классе %XML.Adaptor и будут рассмотрены

12

подробнее ниже. Следующий шаг мастера классов позволяет включить поддержку популяции класса и поддержку XML импорта/экспорта. Завершаем создание класса нажатием кнопки “Finish”. Окна мастера классов приведены в приложении 1.

По завершению создания класса рекомендуется сохранить его в БД. Это осуществляется путем нажатия клавиш Ctrl-S, либо выбором пункта меню Files- >Save.

Описание только что созданного класса, записанное в конструкциях языка UDL, находится в Области Редактирования. Создадим свойства класса Человек и на примере созданного класса рассмотрим основные конструкции языка UDL.

Для создания новых свойств в Caché Studio имеется мастер свойств, который вызывается либо из пункта меню Class->Add->New Property; либо нажатием на следующую пиктограмму:

На первом шаге мастера свойств указываются общие сведения о создаваемом свойстве – имя свойства и комментарии. Вводим FIO в поле имени

и«ФИО человека» в качестве комментария.

Спомощью следующего шага мастера свойств можно указать вид создаваемого свойства. В Caché поддерживаются несколько видов свойств:

Константы. Простые типы данных (%String, %Integer, %Date и т.д.), которые наследуют свое поведение от класса типов данных.

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

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

Потоки данных (Binary or Character Large Object – BLOB or CLOB) -

большое неструктурированное множество данных. В Caché различают два типа потоков данных – BINARYSTREAM

(состоящие из двоичных данных) и CHARACTERSTREAM (состоящие из символов). При этом двоичный поток данных может быть использован для хранения больших объемов двоичных данных (>32Kb), таких как картинок, а символьный поток данных может быть использован для хранения больших объемов текстовых данных (>32Kb), таких как главы в книге.

Коллекции. Достоинством объектно-ориентированных БД является возможность хранить множество значений в одном свойстве. В Caché поддерживаются два типа коллекций – массив и список. Каждый элемент массива обладает индексом, который уникально характеризует элемент в массиве, в то время как в списке элемент уникально определяется по номеру позиции в списке.

Связи. Связи представляют собой двунаправленные зависимости между хранимыми объектами. В Caché реализовано 2 типа связей – Parent – Child (зависимая связь, т.е. при удалении предка, автоматически удаляются наследники) и One-Many (независимая связь - удаление предка при существовании наследников приводит к ошибке).

13

В нашем классе ФИО является простым типом данных или константой, хранящей данные в виде строки символов. Поэтому определим тип как Single value of type: %String и перейдем на следующий шаг.

На следующем шаге мастера свойств определяются характеристики свойства. Required – свойство с такой характеристикой обязательно должно иметь значение. Indexed - на основе этого свойства создается индекс в таблице БД. Unique – значения такого свойства должны быть уникальны в БД.Calculated

– данное свойство является вычисляемым (производным) и его значение не хранится перманентно в БД, а рассчитывается из значений других свойств. SQL Field Name – данная характеристика не обязательна, она служит для определения имени свойства в запросе SQL (по умолчанию принимается имя свойства). Свойство FIO не имеет этих характеристик, поэтому переходим к следующему шагу.

На следующем шаге определяются параметры свойства. С помощью параметров можно контролировать допустимые значения свойств. К примеру, MAXLEN или MINLEN задают соответственно максимально допустимую или минимально допустимую длину значения свойства. Зададим для свойства FIO

MAXLEN=200.

На следующем шаге мастера свойств можно переопределить методы работы со значением свойства, соответственно метод Get и метод Set. Нет необходимости переопределять методы для свойства FIO, воспользуемся стандартными методами предоставляемыми Caché.

Завершаем работу мастера свойств нажатием кнопки Finish. Самостоятельно создайте оставшиеся свойства класса Human, а также

другие классы предметной области Семья. Характеристики свойств и классов приведены в табл.1.

Класс Человек

Характеристики класса

Пакет

Family

 

Имя класса

Human

 

Комментарии

Общие данные о человеке

 

Класс-предок (вид

%SerialObject

Встраиваемый класс, может

класса)

 

быть сохранен только внутри

 

 

хранимого (%Persistent)

 

 

класса

Свойства класса

 

 

Имя свойства

FIO

 

Комментарии

ФИО человека

 

Вид свойства

%String

Константа, хранящая строку

 

 

символов.

Параметр

MAXLEN=200

Максимально допустимая

 

 

длина хранимой строки

 

 

 

Имя свойства

Passport

 

Комментарий

Паспортные данные или

 

 

данные заменяющего

 

 

документа.

 

Вид свойства

%String

 

Параметр

MAXLEN=200

 

 

 

 

Имя свойства

DofB

 

14

Комментарий

Дата рождения

 

Вид свойства

%Date

Дата хранится в Caché в виде

 

 

количества дней прошедших

 

 

с 31.12.1840. Получить

 

 

текущую дату можно с

 

 

помощью $zdt(+$h).

 

 

 

Имя свойства

Sex

 

Комментарий

Пол человека

 

Вид свойства

%Boolean

Булева переменная может

 

 

принимать два значения 0 и

 

 

1. 0 – мужской, 1 – женский.

Класс Ребенок

 

 

Характеристики класса

 

Пакет

Family

 

Имя класса

Baby

 

Комментарии

Данные о детях

 

Класс-предок (вид

%Persistent

Хранимый класс. Данные

класса)

 

хранятся непосредственно в

 

 

БД.

Свойства класса

 

 

Имя свойства

Adopt

 

Комментарии

Усыновлен ?

 

Вид свойства

%Boolean

 

 

 

 

Имя свойства

Personal

 

Комментарий

Персональные данные

 

Вид свойства

Family.Human

Ссылка на встраиваемый

 

 

объект

Класс Свидетель

 

 

Характеристики класса

 

Пакет

Family

 

Имя класса

Witness

 

Комментарии

Сведения о свидетелях.

 

Класс-предок (вид

%Persistent

 

класса)

 

 

Свойства класса

 

 

Имя свойства

Address

 

Комментарии

Контактные данные

 

Вид свойства

Character Stream

Неструктурированные

 

 

символьные данные (BLOB).

 

 

 

Имя свойства

Personal

 

Комментарий

Персональные данные

 

Вид свойства

Family.Human

Ссылка на встраиваемый

 

 

объект

 

 

 

Имя свойства

Related

 

Комментарии

Кем приходится?

 

Вид свойства

%String

 

15

Параметр

VALUELIST =

Список допустимых

 

",мать,отец,друг мужа,

значений. Первый символ

 

друг жены, друг"

определяет разграничитель

 

 

(,)

Класс Семья

 

 

Характеристики класса

 

Пакет

Family

 

Имя класса

Family

 

Комментарии

Сведения о семье.

 

Класс-предок (вид

%Persistent

 

класса)

 

 

Свойства класса

 

 

Имя свойства

CreationDate

 

Комментарии

Дата создания семьи

 

Вид свойства

%Date

 

Параметр

InitialExpression = {+$h}

По умолчанию дата создания

 

 

семьи равна системной дате

 

 

 

Имя свойства

RegistratedIn

 

Комментарий

Орган,

 

 

зарегистрировавший брак.

 

Вид свойства

%String

 

Параметр

MAXLEN=200

 

 

 

 

Имя свойства

Address

 

Комментарии

Адрес местожительства

 

Вид свойства

%String

 

Параметр

MAXLEN=200

 

 

 

 

Имя свойства

Witnesses

 

Комментарии

Свидетели брака

 

Вид свойства

Array of Family.Witness

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

 

 

хранимых объектов. В

 

 

массиве хранятся ссылки на

 

 

объекты (OID) класса

 

 

Family.Witness

 

 

 

Имя свойства

Father

 

Комментарии

Отец семейства

 

Вид свойства

Family.Human

 

 

 

 

Имя свойства

Mother

 

Комментарии

Мать семейства

 

Вид свойства

Family.Human

 

 

 

 

Таблица. 1. Рассмотрим процесс определения отношений между классами, с использованием мастера свойств. Отношение – это двусторонняя связь между классами, поэтому определить отношение в Caché можно из любого класса –

будь то класс-родитель или класс-потомок.

16

Для примера создадим отношение между классами Семья и Ребенок. Отношения, как было сказано ранее, могут быть либо независимыми (один-ко- многим), либо зависимыми (родитель-потомок). Каждая сторона в отношении имеет мощность. В Caché реализованы мощность типа 1:М(независимое) и Parent-Children(зависимое), однако предоставляется возможность самостоятельного создания отношений любой мощности. В нашем случае отношение зависимое Parent-Children.

Перед созданием отношения нет необходимости создавать оба класса – класс-предок(Family.Family) и класс-потомок (Family.Child), мастер свойств предложит создать несуществующий класс автоматически.

Создадим отношение со стороны класса-предка, для это открываем описание класса Family.Family из области проекта.

Отношение определяется на этапе «Выбор типа свойства» мастера свойств. На данном этапе необходимо выбрать тип свойства=Relationship и перейти на следующий этап. Здесь, в поле имя класса вводится имя класса на другой стороне отношения (Family.Baby), определяется его свойство (Parent), ответственное за отношение и мощность отношения (1:М или Parent-Children). Следующий этап мастера свойств предлагает при необходимости создать требуемый класс, свойство или индекс.

Необходимо преобразовать описательную форму класса в объектную. Для этого вызываем компилятор класса путем нажатия комбинации клавиш Ctrl-F7 или выбора пункта меню Build->Compile.

Необходимо также сохранить проект. Для этого выберите пункт меню File- >Save Project, введите имя проекта(Family) и нажмите кнопку ОК.

Основные конструкции UDL.

Язык описания классов UDL - это новая разработка корпорации Intersystems, анонсированная в версии 5. Конструкции UDL и CDL не совместимы, однако Caché обеспечивает интерфейсы для работы с обоими языками описания классов.

В проектах рекомендуется использовать UDL.

Рассмотрим основные конструкции языка UDL. Для описания классов используется следующая конструкция:

Class Package.Class1 Extends (PCl1, PCl2,…) [ Param1 = value, Param2 =value]

{

}

Ключевое слово Class задает начало определения класса Class1 пакета Package. В круглых скобках, следующих за ключевым словом Extends, через запятую перечисляются классы-предки. В квадратных скобках перечисляются параметры класса, к примеру [ClassType = persistent, Owner = _SYSTEM, SqlTableName = _class1].

Для начала определения свойства используется ключевое слово Property:

Property P1 As %String(P1 = value,…) [charact1=value,…];

P1 – имя свойства. Ключевое слово As служит для указания класса данных свойства. В круглых скобках определяются параметры свойства

(MAXLEN=100), а в квадратных – характеристики (Calculated).

Для определения метода класса используется конструкция, которая начинается с ключевого слова Method:

17

Method Method1(Arg1 As %Library.String) As %Integer [ Private ]

{

q

}

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

Для редактирования элементов класса, а также характеристик самого класса можно воспользоваться возможностями, предоставляемыми инспектором классов. Для удобства в Caché Studio реализована контекстная и синтаксическая подцветка основных конструкций языка UDL.

Использование экземпляров класса.

Рассмотрим основные принципы работы с объектами классов Caché. Для этого воспользуемся утилитами Caché Terminal и Caché Explorer. Caché Terminal

– это программа эмуляции ASCII терминала и обычно используется для целей тестирования правильности работы приложения.

Хранимый класс (наследуемый от системного класса %Persistent) Caché предоставляет набор методов для работы с объектами. Эти методы включают: метод %New() – для создания нового объекта класса в памяти, метод %OpenId(OID) – для подкачки существующего объекта в память, метод %Delete(OID) – удаление объекта из БД, метод %Save() – сохранение объекта в БД, %Close() – удаление проекта из памяти. Рассмотрим использование методов на примерах работы с классами пакета Family.

Для создания нового экземпляра семьи воспользуемся методом %New класса Family, наследуемым из системного класса %Persistent.

USER> set cl=##Class(Family.Family).%New()

USER> – это приглашение Caché Terminal, указывающее имя активной области (USER).

set – команда COS(Caché Object Script), предназначенная для присваивания значения переменной.

cl – имя локальной переменной, которой присваивается OREF нового объекта класса.

##Class(Family.Family) – макровызов, служащий для создания ссылки на методы класса или на объекты.

%New() – Символ % определяет принадлежность метода New к системному классу.

С помощью предыдущей команды мы создали новый экземпляр класса Family.Family, OREF которого хранится в локальной переменной сl. Далее присвоим свойству класса Family Address адрес местожительства:

USER>set cl.Address="ул.Юных Ленинцев, 35"

Для обращения к свойствам и методам объекта в Caché используется точечный синтаксис. Присваиваемое свойству Address значение должно быть заключено в двойные кавычки.

Далее определим отца семейства. Свойство Father является встроенным объектом, для обращения, к свойствам которого необходимо использовать каскадный точечный синтаксис:

USER>set cl.Father.FIO="Иван Иванович Иванов" USER>set cl.Father.DofB=$zdh("12/26/1970")

18

Первой командой присваиваем свойству FIO встроенного объекта строку символов. Второй командой, используя встроенную функцию преобразования строки символов во внутреннее представление даты $zdh(), свойству DofB присваиваем дату рождения Ивана Ивановича – 26 декабря 1970 года.

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

Определим свидетелей свадьбы. Свойство Witnesses является массивом объектов. Системный класс %AbstractArray предоставляет ряд функций для работы с элементами массива: Count() – возвращает количество элементов массива, SetAt(value,index) – добавляет новый элемент в ячейку массива с индексом index, GetAt(index) – извлекает элемент массива с индексом index, Next(index) – возвращает индекс следующего элемента массива и т.д. В нашем примере индексом массива будет принадлежность свидетеля к жениху или невесте. Массив объектов не хранит сами объекты, хранению подлежат ссылки на эти объекты (OID). Поэтому необходимо создать объект Witness, сохранить его в БД и записать OID созданного объекта в ячейку массива.

USER>set wit=##Class(Family.Witness).%New()

USER>do wit.Address.Write("Россия, Москва, Ленинский проспект, д.10, кв.10")

USER>set wit.Related="друг"

USER>set wit.Personal.FIO="Петр Петрович Петров" USER>write $$DisplayError^%apiOBJ(wit.%Save()) 1

Первой строкой создан новый экземпляр класса. Вторая строка добавляет в СLOB данные об адресе свидетеля, для этого используется метод Write() системного класса %AbstractStream. Свойство Related имеет ограниченное параметром VALUELIST количество допустимых значений, указание значений, не определенных параметром VALUELIST приведет к ошибке при сохранении объекта. Далее, используя точечный синтаксис, происходит обращение к свойствам встроенного объекта Human. Последней строкой мы сохраняем созданный экземпляр в БД, используя метод %Save() и декодируем результат операции с помощью системной функций $$DisplayError^%apiOBJ.

Добавляем экземпляр класса Witness в список свидетелей свадьбы и удаляем его из памяти с помощью метода %Close():

USER>do cl.Witnesses.SetAt(wit,"Жених") USER>do wit.%Close()

Далее добавим ребенка в семью. Как вы помните, между классом Family и Baby определена двунаправленная связь. Множественная сторона отношения в памяти ведет себя так же, как и коллекции объектов. Рассмотрим добавление связанного объекта:

USER>set child=##Class(Family.Baby).%New()

USER>set child.Personal.FIO="Василий Иванович Иванов" USER>set child.Adopt=0

USER>set child.Parent=cl

Последняя команда определяет принадлежность объекта-ребенка объектуродителю. Ту же операцию можно сделать и со стороны объекта-родителя:

USER>do cl.Children.Insert(child)

Далее сохраняем объект Family в БД и удаляем его из памяти (НЕ ЗАБЫВАЙТЕ УДАЛЯТЬ ОБЪЕКТЫ ИЗ ПАМЯТИ):

USER>write $$DisplayError^%apiOBJ(cl.%Save()) 1

USER>do cl.%Close()

19

Следующим образом можно открыть объект БД и подкачать его, а также связанные с ним объекты в память:

USER>set cl=##Class(Family.Family).%OpenId(1)

%OpenId(OID) – это метод класса %Persistent, аргументом которого является OID объекта в БД. Локальной переменной cl теперь присвоено значение OREF объекта в памяти.

Далее выводим значения свойств открытого объекта в окне Caché Terminal:

USER>write cl.Address

ул.Юных Ленинцев, 35 USER>write $zdt(cl.CreationDate) 08/26/2001

Caché автоматически подкачивает связанные объекты, как встраиваемые:

USER>write cl.Father.FIO

Иван Иванович Иванов

так и объекты по ссылке:

USER>write cl.Witnesses.GetAt("Жених").Related friend

USER>write cl.Witnesses.GetAt("Жених").Personal.FIO

Петр Петрович Петров

так и объекты связанные двунаправленной связью (отношением):

USER>write cl.Children.GetAt(1).Adopt 0

USER>write cl.Children.GetAt(1).Personal.FIO

Василий Иванович Иванов

Закрываем открытый объект:

USER>do cl.%Close()

Удалить объект из БД Caché можно с помощью метода %DeleteId():

USER>write ##Class(Family.Family).%DeleteId(2) 1

Рассмотрим особенности хранения объектов БД Caché. Объекты в БД Caché хранятся в виде многомерных структур.

Многомерность данных в Caché реализуется через индексы переменных. Существует два типа переменных в Caché – локальные и глобальные. Локальные переменные доступны только в том процессе, где они инициированы. Глобальные переменные или глобали носят смысловую нагрузку, отличную от глобальных переменных во многих языках программирования (С++, JAVA). Глобальные переменные в Caché доступны всем процессам, однако, они не являются временными переменными, а являются длительно хранимыми структурами данных или единицами хранения данных. Наличие знака циркумфлекса (^) определяет глобаль.

Рассмотрим примеры локальных переменных и глобалей: Определяем скалярную локальную переменную:

USER>set var1=”abc”

Переменную var1 можно использовать в текущем процессе, однако она не будет доступна другим процессам:

USER>set var1=”abc”_”def”

С помощью write без аргументов можно вывести все локальные переменные текущего процесса:

USER>write

var1=”abc”

Удалить локальную переменную можно с помощью комманды kill:

20

Соседние файлы в папке Инфа