nsutextbook (1037554), страница 12
Текст из файла (страница 12)
Например, так можно определить свойство Doc, являющееся ссылкой на хранимыйобъект типа Doctor:Property Doc As Doctor;5.5.9. Встроенные объектыВстроенные объекты функционируют аналогично ссылкам на объекты. Существенное различие состоит в том, что в качестве типа данных теперь задается не хранимый объект, а встраиваемый класс объектов. Следовательно, значение этого свойства – не ссылкана некий самостоятельный экземпляр объекта, а, напротив, сам этот объект, встраиваемыйв объект, который на него ссылается. С точки зрения синтаксиса определение идентичноссылке на хранимый класс объектов.
НапримерProperty Adr As Address;Где Adr это имя свойства, Address – это встроенный объект.5.5.10. Свойства коллекцииСвойство коллекция состоит из набора элементов одного типа. Caché поддерживаетдва типа коллекций: списки (List) и массивы (Array). Коллекция список состоит из упоря53доченного набора элементов, т.е. каждому элементу ставится в соответствие его порядковый номер. Коллекция массив состоит из набора пар вида: <ключ> <значение>, упорядоченных по ключу. Например, массив прививок:КлючЗначение2.04.1999От гриппа10.05.2001От клещевого энцефалита20.11.2002От дифтерииКоллекции могут содержать константы, встроенные объекты и ссылки на объекты.Например, следующий код задает свойство Colors как коллекцию список типа%String:Property Colors As %String [collection = list];Аналогично, Caché поддерживает коллекции объектов, как, например, в следующемпримере свойство Doctors является коллекцией ссылок типа массив на объекты Doctor:Property Doctors As Doctor [collection = array];5.5.11.
Потоки данныхПотоком данных называют большое неструктурированное множество данных, которое нужно хранить в базе данных. 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.54По умолчанию потоки типа GLOBAL сохраняются в глобале ^PackageClassS. Файловые потоки по умолчанию сохраняются в текущей директории.5.5.12. Многомерные свойстваСвойство может быть объявлено как многомерное.
Многомерное свойство ведет себякак многомерная переменная, для которой могут использоваться такие функции как $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 таблицах.5.6. МетодыМетоды – это операции, ассоциированные с объектом.
Метод выполняется внутриCaché процесса. Каждый метод может иметь имя, список формальных параметров, возвращаемое значение и программный код. Имя метода должно быть уникально внутрисвоего класса. Как правило, методы реализованы в виде функций или процедур на языкеCaché Object Script (COS). Параметры методу могут передаваться как по ссылке, так и позначению. Тип возвращаемого значения может быть каким угодно, но, как правило, этотип %Library.Status, который возвращает информацию о статусе завершения метода.Есть методы классов и методы экземпляров.
Для задания метода класса используетсяключевое слово ClassMethod, для задания метода экземпляра используется ключевое слово Method. Например, следующий синтаксис используется для задания метода класса:ClassMethod <имя метода> (список параметров) [ключевые слова]{ код}Такой синтаксис используется для задания метода экземпляра:Method <имя метода> (список параметров) [ключевые слова]{ код}5.6.1. Аргументы методаМетод может иметь любое число аргументов. При определении метода задаются аргументы со своими типами данных. Можно задать значение по умолчанию для некоторыхаргументов, так же как и аргументы, передаваемые по ссылке (по умолчанию аргументыпередаются по значению).
Например, метод Calculate имеет три аргумента:Method Calculate(count As %Integer, name, state As%String = "CA"){// ...}55где count и state объявлены как %Integer и %String, соответственно. По умолчанию, типомданных необъявленного аргумента является тип %String, в нашем случае name имеет тип%String. Т.е.
можно неявно задавать типы аргументов.5.6.2. Определение значений по умолчанию для аргументов методаНапример:Method Test(flag As %Integer = 0){}При вызове метода без аргументов, он будет использовать значение по умолчанию.5.6.3. Передача аргументов по ссылкеПо умолчанию, аргументы передаются методу по значению.
Можно использоватьпередачу по ссылке, используя модификатор ByRef. Например:Method Swap(ByRef x As %Integer, ByRef y As %Integer){Set temp = xSet x = ySet y = temp}Можно также определить аргументы, которые возвращаются по ссылке, но не имеютвходного значения, используя модификатор Output. Это эквивалентно ByRef, за исключением того, что входное значение аргумента игнорируется.Method CreateObject(Output newobj As MyApp.MyClass) As%Status{Set newobj = ##class(MyApp.MyClass).%New()Quit $$$OK}В Caché Object Script при вызове метода, аргументы которого передаются по ссылке(ByRef или Output), нужно ставить точку перед каждым аргументом:Do obj.Swap(.arg1, .arg2)5.6.4.
Возвращаемое значение методаПри определении метода задается, возвращает ли метод значение и если да, то задается его тип. Тип, возвращаемый методом, есть класс. Если возвращаемый тип есть класстипа данных, метод возвращает литеральное значение (такое как число или строка). Впротивном случае, метод возвращает ссылку (OREF) на экземпляр класса. Синтаксис:Method MethodName() As ReturnType{}где MethodName это метод, ReturnType задает имя класса, возвращаемого методом.Например, следующий метод возвращает значение типа %Integer:Method Add(x As %Integer, y As %Integer) As %Integer{Quit x + y}Пример метода, который создает и возвращает экземпляр объекта:Method FindPerson(id As %String) As Person{Set person = ##class(Person).%OpenId(id)Quit person }565.6.5. Видимость методовМетод может быть public или private.
Private-метод может использоваться только методами класса, которому принадлежит. Public-метод может использоваться любыми внешними методами. В Caché private-методы наследуются и являются видимыми внутри подклассов данного класса. В других языках данные методы носят название «защищенных»(protected).5.6.6. Язык методаПри создании метода можно использовать следующие языки: “Caché” (CachéObjectScript), “Basic”, и “Java”.
По умолчанию, метод использует язык, определенный включевом слове его класса. Можно его перекрыть, используя ключевое слово классаLanguage. Например:Class MyApp.Test {/// метод BasicMethod TestB() As %Integer [ Language = basic]{'код BasicPrint "Это тест"Return 1}/// метод Cache ObjectScriptMethod TestC() As %Integer [ Language = cache]{// код Cache ObjectScriptWrite "Это тест"Quit 1}}Внутри класса можно использовать для реализации методов и другие языки.
Все методы взаимодействуют, не взирая на конкретный язык реализации.Методы, написанные на языке Caché ObjectScript и Basic, компилируются в выполнимый Caché-код. Java-методы выполняются по-другому. Когда создается Java-представление класса (с использованием Caché Java Binding), все Java-методы генерируютсянепосредственно в Java-код. Это означает, что все Java-методы выполняются внутри родной JVM (виртуальной Java машины) и получают доступ к полноценной Java-среде.5.6.7. Ключевые слова методаМожно модифицировать определение метода посредством использования одного илиболее ключевых слов.
Все ключевые слова не являются обязательными, при этом каждоеключевое слово имеет значение по умолчанию, если слово явно не задается.Основные ключевые слова:ClassMethod – определяет метод как метод класса. По умолчанию, методы являютсяметодами экземпляров. Подклассы не могут изменить значение ключевого словаClassMethod.Description – обеспечивает необязательное описание метода, которое используетсядля построения документации класса. По умолчанию, метод не имеет описания. Подклассы не наследуют значение описания.Final – означает, что подклассы не могут перекрыть метод, т.е.