Дмитрий Рамодин
Процесс создания распределенных приложений на основе CORBA
весьма прост, если воспользоваться пакетом C++Builder 4. Программист
концентрируется на реализации бизнес-логики, не вдаваясь в детали объектной
инфраструктуры.
В этой статье мы шаг за шагом рассмотрим, как создаются
CORBA-приложения в среде C++Builder 4. Следует отметить, что в этом продукте
качественно реализована концепция сокрытия от разработчика технических деталей
генерации серверов и клиентов CORBA.
CORBA-калькулятор
Продемонстрировать технологию создания распределенного
приложения на примере элементарного калькулятора довольно просто. В этом
примитивном вычислительном устройстве имеется всего одна пара методов addem и
subtractem, производящих сложение и вычитание соответственно двух аргументов.
Построим сервер CORBA, создающий объект калькулятора, и
клиентское приложение, обращающееся к удаленному калькулятору по команде
пользователя и отображающее результат математической операции.
Построение CORBA-сервера
Рис. 1 |
Как и в любой среде разработки компании Borland, нужно
запустить мастер, который создаст новый проект и добавит в него нечто полезное.
В нашем случае такой мастер называется CORBA Server (рис. 1), и найти его можно
в диалоговой панели New Items на закладке Multitier, предварительно вызвав
диалоговую панель командой FileNew.
Когда мастер создания сервера запущен, он ожидает некоторой
дополнительной информации от программиста. Во-первых, какого рода CORBA-сервер
следует создать: консольное приложение (опция Console Application) или оконное
(Window Application). Напомним, что сервер CORBA - это самая обыкновенная
программа, "штампующая" экземпляры объектов и уведомляющая об этом все
заинтересованные программы. Во-вторых, мастер создания серверов ожидает имена
IDL-файлов с описанием интерфейсов объектов (кнопка Add) либо, если отметить
кнопку Add New IDL File, мастер сам создаст пустой IDL-файл и добавит его в
проект (рис. 2).
Рис. 2 |
Рис. 3 | После нажатия кнопки 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"<<endl;
return x+y;
Осталось активизировать утилиту Smart Agent из меню Tools и
запустить проект на компиляцию и выполнение. Если ошибки отсутствуют, примите
поздравления - вы только что создали настоящий сервер CORBA.
Построение CORBA-клиента
Рис. 8 | Действия, необходимые
для получения клиентского приложения, обращающегося к серверу, также не сложны.
Обратившись к команде FileNew и выбрав закладку Multitier, вы обнаружите
пиктограмму мастера CORBA Client, с него и следует начинать. В появившейся
панели нужно ввести имя IDL-файла объекта, к которому будет обращаться
программа-клиент. Можно и не указывать этого имени, а просто добавить IDL-файл в
проект.
Рис. 7 | Сохранив в группе
проектов только что полученный проект под названием clientProj и модуль под
именем client, переходите к следующей фазе. В панели инструментов CORBA нажмите
кнопку Use CORBA Object (рис. 7).
В возникшей диалоговой панели определите, из какого места
программы будет производиться связывание клиентской программы с удаленным
объектом (рис. 8).
В вашем распоряжении три варианта хранения ссылки на объект:
внутри вызова метода main (WinMain), в классе или же в виде свойства формы
клиентской программы. Последний способ наиболее удобен, поэтому им мы и
воспользуемся. Нужно только не забыть выбрать интерфейс calculator в поле
Interface Name.
Рис. 9 | Форму программы нужно
слегка усовершенствовать, добавив кнопку с текстом Add и три поля
редактирования. Два из них необходимы для введения аргументов математических
операций, а третье - для отображения результата (рис. 9).
В обработчике нажатия на кнопку Add помещают исходный текст,
производящий вызов метода удаленного объекта и передачу ему аргументов
вычисления:
Рис. 10 | Edit3->Text = Form1->calculator_->addem(
StrToInt(Edit1->Text),
StrToInt(Edit2->Text)
;
Заметьте, вы избавлены от необходимости вручную писать код для
связывания с удаленным объектом и для инициализации - все делается
автоматически. Вам же остается только запустить клиент и посмотреть, как он
справляется со своей работой (рис.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 |
От нас требуется дописать в каркас метода исходный текст,
выводящий сообщение в консоль и производящий собственно операцию вычитания:
Рис. 14 | cout<<"subtractem method called"<<endl;
return x-y;
Заодно надо добавить в форму клиентского приложения кнопку
Subtract и написать обработчик ее нажатия: Edit3->Text = Form1->calculator_->subtractem(
StrToInt(Edit1->Text),
StrToInt(Edit2->Text)
);
Завершается разработка перекомпиляцией группы проектов и
запуском калькулятора серверной и клиентской части (рис. 14).
* * *
Похоже, сегодня Borland C++Builder 4 - самое удобное
инструментальное средство разработки распределенных приложений. Интересно, а как
отреагируют на этот выпад компании конкуренты?
Литература по Borland C++ Builder
|