Использование IDL

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

Дизайнеру проекта крайне важно научиться "мыслить" на языке IDL. Он играет для CORBA-проекта роль, во многом схожую с ролью CASE-диаграмм, а именно, позволяет создать достаточно наглядное описание функциональности отдельных составных частей и задать связи между ними на абстрактном уровне. При этом набор IDL-объявлений является скелетом вашей распределенной системы, а не просто описанием, которое нуждается в более детальной проработке на этапе реализации. Большинство изменений, которые вам потребуется внести в систему и которые влияют на характер взаимодействия любого объекта с другими объектами или "внешним миром", должны быть отражены на уровне его IDL-описаний.

IDL является достаточно выразительным языком. Он позволяет определить типы данных, которые необходимы для функционирования вашей системы, включая структуры, объединения, массивы и так называемые "последовательности" (sequences), который можно рассматривать как массивы переменной длины. Главной задачей IDL является определение интерфейсов удаленных объектов, т.е. совокупности удаленных методов, к которым могут обращаться клиенты в процессе работы распределенной системы. IDL позволяет задать списки аргументов, тип возвращаемого результата, а также исключительные ситуации, которые могут быть возбуждены при вызове этого метода.

Вот фрагмент IDL-файла, который является типичным для CORBA-приложения:

	module MyModule {
		typedef struct Str {
			long	key;
			string	description;
			double	value;
		} MyData;

		typedef sequence<MYDATA> MyDataList;

		exception MyException {};

		interface MyInerface {
			MyDataList MyMethod (in long arg) 
				raises (MyException);
                         };
              };

Модуль MyModule позволяет определить новое пространство имен для того, чтобы избежать случайного совпадение имен интерфейсов, типов и т.д., созданных различными разработчиками в рамках одной распределенной системы. Следующие два объявления определяют типы данных и их имена, которые будут использоваться при взаимодействии с удаленным объектом, поведение которого (с точки зрения удаленного взаимодействия) задано интерфейсом с именем MyInterface. Этот интерфейс определяет, что клиент может вызвать единственный метод данного объекта, который в качестве входного аргумента требует наличия значения целого типа, а возвращает 0, 1 или несколько структур, каждая из которых содержит три поля. При этом может быть возбуждена исключительная ситуация MyException.

Что получает разработчик, создав такие IDL-объявления?

Таким образом, с помощью создания IDL-объявлений вы попадаете в мир распределенных, транзакционных, защищенных программ, не зависящих ни от платформ, ни от операционных систем, ни от языков программирования, ни от аппаратных особенностей используемых архитектур. Единственное, что остается сделать - это запустить компилятор idl2xxx (idl2cpp, idl2java, ...), который сгенерирует как основу вашего серверного приложения, так и код взаимодействия вашего клиентского приложения с инфраструктурой CORBA.

Назад

Содержание