Процесс создания распределенных приложений на основе CORBA весьма прост, если воспользоваться пакетом C++Builder 4. Программист концентрируется на реализации бизнес-логики, не вдаваясь в детали объектной инфраструктуры.
В этой статье мы шаг за шагом рассмотрим, как создаются CORBA-приложения в среде C++Builder 4. Следует отметить, что в этом продукте качественно реализована концепция сокрытия от разработчика технических деталей генерации серверов и клиентов CORBA.
CORBA-калькулятор
Продемонстрировать технологию создания распределенного приложения на примере элементарного калькулятора довольно просто. В этом примитивном вычислительном устройстве имеется всего одна пара методов addem и subtractem, производящих сложение и вычитание соответственно двух аргументов.
Построим сервер CORBA, создающий объект калькулятора, и клиентское приложение, обращающееся к удаленному калькулятору по команде пользователя и отображающее результат математической операции.
Построение CORBA-сервера
Как и в любой среде разработки компании Borland, нужно запустить мастер, который создаст новый проект и добавит в него нечто полезное. В нашем случае такой мастер называется CORBA Server (рис. 1), и найти его можно в диалоговой панели New Items на закладке Multitier, предварительно вызвав диалоговую панель командой File?New.
Когда мастер создания сервера запущен, он ожидает некоторой дополнительной информации от программиста. Во-первых, какого рода CORBA-сервер следует создать: консольное приложение (опция Console Application) или оконное (Window Application). Напомним, что сервер CORBA - это самая обыкновенная программа, "штампующая" экземпляры объектов и уведомляющая об этом все заинтересованные программы. Во-вторых, мастер создания серверов ожидает имена IDL-файлов с описанием интерфейсов объектов (кнопка Add) либо, если отметить кнопку Add New IDL File, мастер сам создаст пустой IDL-файл и добавит его в проект (рис. 2).
После нажатия кнопки OK генерируется новый проект, и в окне редактора открывается пустой IDL-файл. Поэтому следующим действием разработчика будет описание на языке IDL интерфейса объекта калькулятора (рис. 3).
Мы намеренно опускаем описание метода subtractem, чтобы чуть позже показать весьма интересные особенности C++Builder 4. Сохранив полученное описание в файле с именем calculator.idl, запускаем New CORBA Object Implementation, вынесенный на отдельную линейку инструментов под названием CORBA (рис. 4).
Запущенный мастер собирает всю необходимую для генерации кода информацию: название файла описания объекта на языке IDL и имя реализуемого интерфейса. В поле Implementation Class надо ввести имена класса объекта и модуля, который будет сгенерирован мастером New CORBA Object Implementation. Имя самого объекта проставляется в поле Object Names. Много работать руками не придется - все поля панели заполняются самим мастером, поэтому вряд ли вам потребуется изменять какие-то имена. Просто доверьтесь мастеру. В самом низу диалоговой панели в левой ее стороне находится кнопка Show Updates. Странно, что эту опцию разработчики скромно поместили в уголок. По мнению автора, она должна быть на самом видном месте, да еще и выделена цветом. А все потому, что с включенной кнопкой Show Updates вы получаете возможность видеть все изменения в проекте, происходящие при генерации новых файлов и автоматической модификации уже имеющихся исходных текстов.
|
Слева отображается список всех произошедших во время работы мастера действий, тогда как в правой панели находятся исходные тексты, являющиеся результатом подобных действий. Эта панель - полноценный редактор, в котором можно тут же внести изменения. Если то или иное действие мастера вас не устраивает, просто отключите кнопку напротив его названия в левой панели. И действие будет отменено.
Создавая калькулятор, нужно найти действие с именем 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 - самое удобное инструментальное средство разработки распределенных приложений. Интересно, а как отреагируют на этот выпад компании конкуренты?