- •107 Методические указания «Программное обеспечение сетей эвм. Часть 4. Версия 2. Развитие схемы «клиент-сервер» в com и corba»
- •Введение
- •1.1. Необходимость использования компонент
- •1.2. Методы встраивания компонентов
- •1.3. Основы com
- •1.4. Типы компонентов
- •1.5. Размещение управляющих элементов при помощи cWnd
- •1.6. Использование директивы #import
- •1.7. Компоновка тестовой программы
- •1.7.1 О компонентах
- •1.7.2 Регистрация компонентов
- •1.7.3 Импортирование библиотеки типов
- •1.7.4 Определение членов cDemoClientView
- •1.7.5 Создание компонентов
- •1.7.6 Создание точек взаимодействия
- •1.7.7 Синхронизация параметров
- •1.7.8 Обработка событий от компонентов
- •1.7.9 Очистка
- •1.7.10 Шаблонный код
- •1.9. Индивидуальные задания на работу
- •2.1. Проект. Основные принципы
- •2.2. Как создать компонент
- •Шаг 2: Создание компонента:
- •2.3. Значения по умолчанию
- •2.5. Индивидуальные задания на работу
- •3.1. Cоздание сервера com
- •3.2. Использование com-объектов
- •3.3. Индивидуальные задания на работу
- •Лабораторная работа № 4. Использование atl
- •4.1 Создание dcom-сервера с использованием atl
- •4.1.1 Введение в atl
- •4.1.2 Что такое atl?
- •4.1.3 Разделение труда
- •4.1.4 Создание хранилища компонентов с помощью atl Com AppWizard
- •4.1.5 Вставка кода заглушки/прокси-объекта.
- •4.1.7 Atl com-карта
- •4.1.9 Класс cComModule
- •4.1.10 Язык скриптов реестра в atl
- •4.1.11 Распределенная com (dcom)
- •4.1.12 Dcom и службы nt
- •4.1.13 Структура службы nt
- •4.1.14 Основанный на службах nt сервер сом
- •4.1.15 Создание проекта при помощи atl
- •4.1.16 Добавление функциональных средств
- •4.1.17 Функция CacheQuotes (dcomServiceXdcomService.Cpp)
- •4.1.18 Функция GetQuote (dcomServiceXdcomService.Cpp)
- •4.2 Создание dcom сервера
- •4.3 Создание dcom клиента
- •4.4 Индивидуальные задания на работу
- •Лабораторная работа № 5. Разработка corba приложений
- •5.1. Конфигурирование
- •5.2. Порядок действий
- •5.3. Объектно-ориентированный анализ и моделирование
- •5.4. Описание и трансляция объектов
- •5.5. Создание сервера
- •5.6. Создание клиента
- •5.7. Отладка объектов
- •5.8. Индивидуальные задания на работу
- •Лабораторная работа № 6. Адаптер роа
- •6.1. Архитектура poa
- •6.2. Политики poa
- •Политика обработки запросов
- •6.3. Создание серверов на основе poa
- •6.4. Индивидуальные задания на работу
- •Лабораторная работа № 7. Прикладная задача связи
- •7.1. Постановка задачи
- •7.1.1. Сотовая станция
- •7.1.2. Телефоны
- •7.1.3. Система
- •7.2. Функционирование системы
- •7.3. Индивидуальные задания на работу
- •Лабораторная работа № 8. Работа по умолчанию
- •8.1. Сервер с сервантом по умолчанию
- •8.2. Индивидуальные задания на работу
- •Лабораторная работа № 9. Создание менеджеров сервантов
- •9.1. Менеджеры сервантов
- •ServantActivator
- •ServantLocator
- •9.2. И снова практика
- •9.3. Индивидуальные задания на работу
- •Лабораторная работа № 10. Сервис именования
- •10.1. Сервис для именования (Naming Service)
- •10.2. Индивидуальные задания на работу
5.2. Порядок действий
Создавая CORBA-приложения, нужно помнить, что их модель отличается от модели традиционных монолитных программ и даже клиент-серверных систем, хотя с последними есть и нечто общее. Связку объектов CORBA и клиентов трудно назвать приложением как таковым. Подобные системы похожи на паутину, где все переплетено: клиент может в любую минуту стать сервером, и пользователь вряд ли узнает, с каким сервером объектов он работает в данный отрезок времени, а если проект выполнен грамотно, может даже и не заметить сбоя. Типичная тактика действий программы, использующей технологию CORBA, такова: соединиться с нужным объектом, использовать его функции и отсоединиться от него. И таких атомарных циклов могут быть сотни. Схожая схема принята и в Microsoft COM+, где также приложения как такового нет. Длямонолитныхприложенийвсе функции зашиты внутри.
Добиться хороших результатов в создании программ на основе CORBA можно, придерживаясь определенного порядка действий:
объектно-ориентированный анализ и моделирование;
описание и трансляция объектов;
создание сервера;
создание клиента;
отладка объектов.
Это не аксиома, но опыт подтверждает эффективность данного подхода. Скорее всего, в проекте объекты будут весьма зависеть друг от друга, так что иной раз следует продумать порядок их реализации.
5.3. Объектно-ориентированный анализ и моделирование
Технология CORBA рассчитана на реализацию таких систем, которые будут работать не один год, и поэтому именно хороший объектно-ориентированный анализ и моделирование могут стать залогом того, что в недалеком будущем не придется подвергать приложения радикальной переделке.
В принципе для обдумывания модели проекта достаточно острого карандаша и нескольких листов бумаги. Однако чтобы идея была понятна и разработчикам, нужно задокументировать ее. Построить IDL-описания по моделям поможет пакет Rational Rose, нацеленный на создание UML-моделей (UML — универсальный язык описания моделей).
Создавая модели будущих объектов, следует помнить, что любой объект CORBA наследуется от CORBA::Object, поэтому проектируемыеобъекты всегда могут быть приведены к этому типу. Можно рекомендовать создать еще одного промежуточного предка. Пусть это будет некоторый абстрактный объект с некоторыми базовыми функциями. Это упростит внесение глобальных изменений в будущую систему. На любом этапе реализации, внедрения и эксплуатации можно добавить ко всем объектам новые функции, заменив описание промежуточного родителя. Это преимущество компонентно-ориентированного ПО.
Следует разрабатывать порядок действий, в соответствии с которым будут создаваться реализации объектов. Надо выделить в готовой модели атомарные объекты, не зависящие от других, они и станут кандидатами на первоочередное создание и отладку.
CORBA — новая технология, и это привносит в процесс разработки некоторые расширения. К примеру, неплохо подумать о размещении объектов в сети, согласуясь с топологией последней. В итоге образуется четкая последовательность инсталляции готового кода, определятся виртуальные домены.
5.4. Описание и трансляция объектов
Готовая модель содержит объекты (точнее было бы сказать «классы»), которые должны быть описаны с помощью языка IDL, что необходимо не только для трансляции этих описаний в базовые исходные тексты на конкретном языке программирования, но и для последующего добавления IDL-описаний в репозитарий интерфейсов (о репозитарии — ниже).
В каждой версии VisiBroker имеется свой компилятор IDL: VisiBroker for C++ оснащен компилятором idl2cpp, а VisiBroker for Java — idl2java. Первый на основе IDL-описания объектов генерирует исходные тексты на языке Cи++ и включаемые заголовочные файлы, а второй делает описания классов на языке Java и пакетную структуру имен.
VisiBroker for Java обладает еще парочкой компиляторов java2iiop и java2idl, иначе называемых технологией Caffeine. Однако пока они реализованы лишь в Java-версии VisiBroker да и больше подходят для переноса в среду CORBA старых классов Java, а не для создания новых объектов.
Пустьуже есть готовое описание некоего объекта, представляющего собой абстрактный предок для компонентов системы,называемого —AbstractComponent. Пусть каждый компонент возвращает свое краткое текстовое описание для того, чтобы сетевой администратор мог выбрать из списка объектов самый подходящий. Кроме того, по запросу программы компонент должен возвратить некий интерфейс, с помощью которого его клиент сможет получить дополнительную информацию нижнего уровня: например, к какой категории относится объект, какова его логическая модель. Еще одна операция присваивает объекту уникальный идентификатор, который может быть ключом поиска в базе данных объектов:
Файл component.idl
#pragma prefix ”pcworld.ru”
module AbstractComponent
{
// Опережающее описание некоего интерфейса
// для получения информации о компоненте
interface ComponentInfo;
interface ServiceProvider
{
// Компонент возвращает строку со своим
// кратким текстовым описанием
string getDescription();
// Операция получения информации о компоненте
// в машинном виде
ComponentInfo getComponentInfo();
// Операция присвоения компоненту
// уникального идентификатора
void setUniqueID(in long id);
};
};
Дальнейшие действия для программистов на Java и Cи++ будут несколько различаться. Трансляция на Cи++ должна быть запущена командой:
idl2cpp -src_suffix cpp component.idl
а трансляция на Java — командой:
idl2java corba.idl
Если ошибок в IDL не было, то в результате на диске появятся всего четыре файла для Cи++, в то время как для Java файлов может оказаться гораздо больше, да и размещаться они будут в каталогах со сложной структурой. Об именах полученных файлов и их назначении будет сказано в следующих разделах.