Процесс создания распределенных приложений на основе CORBA весьма прост, если воспользоваться пакетом C++Builder 4. Программист концентрируется на реализации бизнес-логики, не вдаваясь в детали объектной инфраструктуры.

В этой статье мы шаг за шагом рассмотрим, как создаются CORBA-приложения в среде C++Builder 4. Следует отметить, что в этом продукте качественно реализована концепция сокрытия от разработчика технических деталей генерации серверов и клиентов CORBA.

CORBA-калькулятор

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

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

Построение CORBA-сервера


Рис. 1

Как и в любой среде разработки компании Borland, нужно запустить мастер, который создаст новый проект и добавит в него нечто полезное. В нашем случае такой мастер называется CORBA Server (рис. 1), и найти его можно в диалоговой панели New Items на закладке Multitier, предварительно вызвав диалоговую панель командой File?New.


Рис. 2

Рис. 3

Когда мастер создания сервера запущен, он ожидает некоторой дополнительной информации от программиста. Во-первых, какого рода CORBA-сервер следует создать: консольное приложение (опция Console Application) или оконное (Window Application). Напомним, что сервер CORBA - это самая обыкновенная программа, "штампующая" экземпляры объектов и уведомляющая об этом все заинтересованные программы. Во-вторых, мастер создания серверов ожидает имена IDL-файлов с описанием интерфейсов объектов (кнопка Add) либо, если отметить кнопку Add New IDL File, мастер сам создаст пустой IDL-файл и добавит его в проект (рис. 2).

После нажатия кнопки OK генерируется новый проект, и в окне редактора открывается пустой IDL-файл. Поэтому следующим действием разработчика будет описание на языке IDL интерфейса объекта калькулятора (рис. 3).


Рис. 4

Мы намеренно опускаем описание метода subtractem, чтобы чуть позже показать весьма интересные особенности C++Builder 4. Сохранив полученное описание в файле с именем calculator.idl, запускаем New CORBA Object Implementation, вынесенный на отдельную линейку инструментов под названием CORBA (рис. 4).


Рис. 5

Запущенный мастер собирает всю необходимую для генерации кода информацию: название файла описания объекта на языке IDL и имя реализуемого интерфейса. В поле Implementation Class надо ввести имена класса объекта и модуля, который будет сгенерирован мастером New CORBA Object Implementation. Имя самого объекта проставляется в поле Object Names. Много работать руками не придется - все поля панели заполняются самим мастером, поэтому вряд ли вам потребуется изменять какие-то имена. Просто доверьтесь мастеру. В самом низу диалоговой панели в левой ее стороне находится кнопка Show Updates. Странно, что эту опцию разработчики скромно поместили в уголок. По мнению автора, она должна быть на самом видном месте, да еще и выделена цветом. А все потому, что с включенной кнопкой Show Updates вы получаете возможность видеть все изменения в проекте, происходящие при генерации новых файлов и автоматической модификации уже имеющихся исходных текстов.


Рис. 6

Слева отображается список всех произошедших во время работы мастера действий, тогда как в правой панели находятся исходные тексты, являющиеся результатом подобных действий. Эта панель - полноценный редактор, в котором можно тут же внести изменения. Если то или иное действие мастера вас не устраивает, просто отключите кнопку напротив его названия в левой панели. И действие будет отменено.

Создавая калькулятор, нужно найти действие с именем calcImpl::add (в левой панели), переключиться на него и внутрь пока еще пустого (в правой панели) метода addem (рис. 6), внести исходный текст, вычисляющий сумму аргументов метода и выводящий строчку уведомления в стандартный поток вывода:

cout<<"addem method called"<

Осталось активизировать утилиту Smart Agent из меню Tools и запустить проект на компиляцию и выполнение. Если ошибки отсутствуют, примите поздравления - вы только что создали настоящий сервер CORBA.

Построение CORBA-клиента


Рис. 8

Действия, необходимые для получения клиентского приложения, обращающегося к серверу, также не сложны. Обратившись к команде File?New и выбрав закладку Multitier, вы обнаружите пиктограмму мастера CORBA Client, с него и следует начинать. В появившейся панели нужно ввести имя IDL-файла объекта, к которому будет обращаться программа-клиент. Можно и не указывать этого имени, а просто добавить IDL-файл в проект.


Рис. 7

Сохранив в группе проектов только что полученный проект под названием clientProj и модуль под именем client, переходите к следующей фазе. В панели инструментов CORBA нажмите кнопку Use CORBA Object (рис. 7).

В возникшей диалоговой панели определите, из какого места программы будет производиться связывание клиентской программы с удаленным объектом (рис. 8).

В вашем распоряжении три варианта хранения ссылки на объект: внутри вызова метода main (WinMain), в классе или же в виде свойства формы клиентской программы. Последний способ наиболее удобен, поэтому им мы и воспользуемся. Нужно только не забыть выбрать интерфейс calculator в поле Interface Name.


Рис. 9

Форму программы нужно слегка усовершенствовать, добавив кнопку с текстом Add и три поля редактирования. Два из них необходимы для введения аргументов математических операций, а третье - для отображения результата (рис. 9).

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

Edit3->Text = Form1->calculator_->addem(
	StrToInt(Edit1->Text),
	StrToInt(Edit2->Text)
;

Рис. 10

Заметьте, вы избавлены от необходимости вручную писать код для связывания с удаленным объектом и для инициализации - все делается автоматически. Вам же остается только запустить клиент и посмотреть, как он справляется со своей работой (рис.10).

Добавление новых методов

Все описанное выше можно рассматривать как прелюдию к описанию самой интересной особенности мастеров CORBA в пакете C++Builder 4, а именно их умение синхронизировать изменения в описании объектной модели с генерируемыми исходными текстами. Каждый раз, когда программист модифицирует IDL-файл, среда разработки исправляет заглушки (stubs) и скелеты (skeletons) приложения, а также переделывает объект. И в этом C++Builder 4 равных просто нет.


Рис. 11

Обратимся снова к нашему примеру - созданию калькулятора. Помните, мы специально опустили описание метода вычитания subtractem 2. Теперь мы можем попробовать, как работает технология синхронизации. Остановив выполнение сервера калькулятора и клиентской программы, переключимся на файл calculator.idl и допишем в интерфейсе calculator шаблон метода subtractem (рис. 11).


Рис. 12

Затем сделаем синхронизацию изменений в приложении, для чего нужно нажать кнопку CORBA Refresh в панели инструментов CORBA (рис. 12).

В ответ на это C++Builder 4 в исходных текстах сервера добавит реализацию метода, что немедленно будет отражено в диалоговой панели Project Updates (рис. 13).


Рис. 13

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

cout<<"subtractem method called"<

Заодно надо добавить в форму клиентского приложения кнопку Subtract и написать обработчик ее нажатия:

Edit3->Text = Form1->calculator_->subtractem(
	StrToInt(Edit1->Text),
	StrToInt(Edit2->Text)
);

Рис. 14

Завершается разработка перекомпиляцией группы проектов и запуском калькулятора серверной и клиентской части (рис. 14).

* * *

Похоже, сегодня Borland C++Builder 4 - самое удобное инструментальное средство разработки распределенных приложений. Интересно, а как отреагируют на этот выпад компании конкуренты?