Опубликован: 18.03.2010 | Доступ: свободный | Студентов: 839 / 85 | Оценка: 4.48 / 4.33 | Длительность: 12:01:00
Лекция 2:

Технология CORBA

Простые типы

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

Булев тип boolean отвечает за хранение логических значений TRUE и FALSE.Символьные типы могут описывать обычные 8-битовые символьные данные (тип char) или "широкие" символьные данные (тип wchar),размер которых более 8 бит. В процессе передачи символьных данных по сети они могут быть переконвертированы так, что изменится их представление, но значение символа будет сохранено. Такая ситуация может возникнуть при передаче данных между компьютерами с отличающимися кодировками. Целочисленные типы - это short, long, long long,а также их беззнаковые разновидности с префиксом unsigned.Обратите внимание, что тип int в IDL отсутствует.

Таблица 2.3. Диапазоны допустимых хранимых значений для целочисленных типов
Short от -2 15 до 2 15 - 1
Long от 2 31 до 2 31 - 1
long long от -2 63 до 2 63 - 1
unsigned short от 0 до 2 16 - 1
unsigned long от 0 до 2 32 - 1
unsigned long long от 0 до 2 64 - 1

К типам чисел с плавающей точкой относятся float, double и long double.Тип float соответствует IEEE-числу с плавающей точкой одинарной точности. Тип double - IEEE-числу с плавающей точкой двойной точности. И последний тип, long double,используется для описания IEEE-числа с плавающей точкой двойной расширенной точности. Более полные данные о числах с плавающей точкой IEEE можно узнать из документа "IEEE Standard for Binary Floating-Point Arithmetic", ANSI/IEEE Standard 754-1985. В IDL есть два специальных простых типа: octet и any. Первый служит для передачи по коммуникационным системам 8-битовых чисел так, чтобы они в процессе пересылки не подверглись изменениям. Тип octet - хорошая альтернатива типу char в тех случаях, когда передается маленькое число.

В объектах типа any могут храниться значения любого типа, позволенного IDL, any можно сравнить с универсальным типом void* в языке C или с классом java.lang.Object в языке Java.

Константы

Описание констант начинается с ключевого слова const,за которым указываются: тип константы, ее имя, символ присвоения = и константное выражение, состоящее из литералов и математических операторов. Константа может иметь любой из простых типов.

Математические операторы IDL соответствуют аналогичным операторам C/C++.

Конструируемые типы

Для начала отметим, что ключевое слово typedef используется в IDL так же, как и в C/C++:для присвоения синонима имени типа.

К конструируемым типам IDL относятся перечислимые типы, дискриминируемые объединения и структуры.

Перечислимые типы

Перечислимые типы знакомы большинству программистов. Общая схема их описания:

enum < Имя энумератора >  {< Список элементов >};

В качестве списка элементов выступают идентификаторы, разделенные запятыми:

enum Semaphore  {red,  yellow,  green};

Дискриминируемые объединения

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

union < Имя объединения > switch
(< Тип дискриминатора >)
{
< Список элементов выбора >
};

Здесь <Тип дискриминатора> может быть любым интегральным типом (символьным, целочисленным, булевым или перечислимым).

Со списком элементов выбора дело обстоит несколько сложнее. Каждый элемент состоит из ключевого слова case и следующего за ним константного выражения, после которого ставится двоеточие и производится собственно описание хранимого типа. Константное выражение должно возвращать тип, совпадающий с типом дискриминатора. При записи в объединение некоторого значения объединение принимает тип, совпадающий с типом сохраняемого значения. Заодно запоминается дискриминатор. В дальнейшем, если будет произведена попытка считать значение под типом, отличающимся от того, под которым это значение было сохранено, произойдет генерация исключения org.omg.CORBA.BAD_OPERATION. Однако для программиста все-таки предусмотрено некоторое облегчение: объединение обладает значением по умолчанию, которое на языке IDL описывается ключевым словом default.Объединение может содержать только один такой элемент.

Рассмотрим короткий пример описания дискриминируемого объединения:

union MyType switch   (short)
{
case 13:   short alpha;
case 0x0C << 3:   long beta;
default:   arr alphabet;
};

В этом случае тип MyType имеет дискриминатор типа short.Числа, стоящие после case,представляют собой значения дискриминатора. Именно от них зависит, какой член объединения будет использован. Если значение дискриминанта равняется 13,то под именем alpha будет храниться значение short.При дискриминанте 0X0C << 3 (конечное значение этого константного выражения - 96) хранимое значение будет иметь тип long и носить имя beta.И наконец, по умолчанию значение, хранящееся в объединении, будет иметь тип arr и к нему можно обращаться по имени alphabet.

Структуры

Структуры служат для определения сложных типов, призванных хранить наборы разнородных данных. Типичная структура описывается следующим образом (аналогично структурам C/C++ ):

struct < Имя структуры >
{
< Список членов >
};

Список членов - это разделенный точкой с запятой набор элементов, являющихся комбинацией из имени типа и идентификатора. Имя типа может быть любым типом IDL (допускается использование массивов с обязательным указанием числа элементов).

Шаблонные типы

К шаблонным типам можно отнести строки ("узкие" и "широкие"), последовательности и числа с фиксированной точкой.

Строки.

Строки в IDL - это 8-битовые "узкие" string и "широкие" wstring.Первые могут содержать любые символы типа char за исключением '\0'.Второй тип строки состоит из символов, подпадающих под базовый тип wchar,и заканчивается "широким" нулевым символом. Длина строки может быть как ограниченной, так и неограниченной. Ограниченные (bounded) строки можно сравнить с символьным массивом заданной длины.

Типичное описание подобного типа: typedef wstring <28> boundedString ; В угловых скобках задается размер строки в символах. Неограниченные же (unbounded) строки содержат в себе символов столько, сколько потребуется:

typedef string unboundedString ;

Описание строчных типов должно предваряться ключевым словом typedef.

Последовательности.

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

typedef sequence unboundedSequence ;

А вот пример описания типа ограниченной последовательности:

typedef sequence boundedSequence ;

Последовательности могут быть рекурсивно вложены друг в друга:

typedef sequence< sequence > recursedSequence ;

Числа с фиксированной точкой.

Тип данных fixed представляет собой десятичное число с фиксированной точкой, имеющее до 31 значащей цифры. К сожалению, на данный момент, тип fixed только описан в спецификации CORBA,но не реализован.

Прочие типы

К оставшимся типам относятся массивы и native -типы. Массивы описываются ключевым словом typedef,за которым следуют тип, идентификатор и размерность массива. Допускаются многомерные массивы:

typedef double someArray[100][100] ;

Тип native служит для введения новых типов данных, которые реализованы на языке программирования, отличном от IDL. Следующая строка исходного текста на IDL: native NonIDLType; говорит компилятору, что где-то имеется тип NonIDLType,реализованный непонятным для него образом, но, тем не менее, к нему нужно сделать определенный интерфейс.

Исключения

Описание типов-исключений практически полностью совпадает с описанием структур. Минимальное различие состоит в замене ключевого слова struct на exception:

exception < Имя исключения >
{
< Список членов >
};
Интерфейсы

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

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

Описания требуются в том случае, если необходимо обратиться к интерфейсу еще до его определения. Чтобы получить подобное описание, достаточно написать ключевое слово interface и его имя:

interface < Имя интерфейса >;

При определении после имени добавляются двоеточие и имена интерфейсов-предков:

interface <Имя интерфейса> [ :<Имя интерфейса-предка 1 > ... [ ,< Имя интерфейса-предка n >]...]
{
<Описания типов, констант, исключений, атрибутов и операций >
};

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

Операции

Операции - это единственное средства манипулирования внутренним состоянием объекта.

Описываются операции по схеме, показанной ниже:

{  oneway void  |   < Возвращаемый тип >  }
< Имя операции > ({in | out | inout } <Параметр>  ...
[, { in | out | inout } <Параметр>]... )
[ raises ( < Имя исключения > ... [, <Имя исключения> ] ... )];

Если определяется операция, возвращающая некоторое значение, то слева от ее имени необходимо написать тип возвращаемого значения. Исключением являются операции, определенные как oneway,они должны возвращать тип void,т. е. не возвращать никакого значения. Ключевое слово oneway говорит, что при вызове операции программа не ждет, пока эта операция завершится, а продолжает выполнение. Параметры операции могут быть входными (in), выходными (out) или комбинированными (inout).Если операция может возбудить исключения, то они должны быть перечислены в скобках через запятую после ключевого слова raises.

Атрибуты

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

В IDL атрибуты описываются следующим образом:

[readonly] attribute < Тип атрибута > < Имя атрибута >;

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

Модуль

Модуль - самая "старшая" единица языка IDL. Он служит для группировки типов, интерфейсов и т. д., логически связанных друг с другом. У модуля есть имя и тело:

module < Имя модуля >
{
< Тело модуля >
};

Можно считать, что модули являются прямым отображением пакетов языка Java и пространств имен в C++.

Антон Зубеков
Антон Зубеков

Здравствуйте, подскажите пожалуйста где можно достать материалы по курсу Кросс-платформенные и многозвенные технологии, о которых говориться, к примеру, в Лекции 2. Пример "Служба мгновенных сообщений"