Основы программирования

Модели реализации объектно-ориентированных программных систем - Организация интерфейса СОМ
Индекс материала
Модели реализации объектно-ориентированных программных систем
Интерфейсы
Компоновка системы
Разновидности компонентов
Моделирование программного текста системы
Основы компонентной объектной модели
Организация интерфейса СОМ
Реализация интерфейса
Серверы СОМ-объектов
Работа с СОМ-объектами
Повторное использование СОМ-объектов
IDL-описаниеи библиотека типа
Диаграммы размещения
Использование диаграмм размещения
Метрики объектно-ориентированных программных систем
Информационная закрытость
Связность объектов
Метрики связности по данным
Метрики связности по методам
Сцепление объектов
Локальность данных
Метрики, ориентированные на классы
Операционно-ориентированные метрики
Метрики для ОО-проектов
Метрики инкапсуляции
Метрики полиморфизма
Все страницы
Организация интерфейса СОМ

 

Каждый интерфейс объекта СОМ — контракт между этим объектом и его клиентами. Они обязуются: объект — поддерживать операции интерфейса в точном соответствии с его определениями, а клиент — корректно вызывать операции. Для обеспечения контракта надо задать:

q       идентификацию каждого интерфейса;

q       описание операций интерфейса;

q       реализацию интерфейса.

Идентификация интерфейса

 

У каждого интерфейса СОМ два имени. Простое, символьное имя предназначено для людей, оно не уникально (допускается, чтобы это имя было одинаковым у двух интерфейсов). Другое, сложное имя предназначено для использования программами. Программное имя уникально, это позволяет точно идентифицировать интерфейс.

Принято, чтобы символьные имена СОМ-интерфейсов начинались с буквы I (от Interface). Например, упомянутый нами интерфейс для работы с файлами должен называться IРаботаСФайлами, а интерфейс преобразования их форматов — IПреобразованиеФорматов.

Программное имя любого интерфейса образуется с помощью глобально уникального идентификатора (globally unique identifier — GUID). GUID интерфейса считается идентификатором интерфейса (interface identifier — IID). GUID — это 16-байтовая величина (128-битовое число), генерируемая автоматически.

Уникальность во времени достигается за счет включения в каждый GUID метки времени, указателя момента создания. Уникальность в пространстве обеспечивается цифровыми параметрами компьютера, который использовался для генерации GUID.

Описание интерфейса

 

Для определения интерфейсов применяют специальный язык — язык описания интерфейсов (Interface Definition Language — IDL). Например, IDL-описание интерфейса для работы с файлами 1РаботаСФайлами имеет вид

[ object.

uuid(E7CDODOO-1827-11CF-9946-444553540000) ]

interface IРаботаСФайлами: IUnknown {

import "unknown.idl"

HRESULT ОткрытьФайп ([in] OLECHAR имя [31]);

HRESULT ЗаписатьФайл ([in] OLECHAR имя [31]);

HRESULT ЗакрытьФайл ([in] OLECHAR имя [31]);

}

Описание интерфейса начинается со слова object, отмечающего, что будут использоваться расширения, добавленные СОМ к оригинальному IDL. Далее записывается программное имя (IID интерфейса), оно начинается с ключевого слова uuid (Universal Unique Identifier — универсально уникальный идентификатор). UUID является синонимом термина GUID.

В третьей строке записывается имя интерфейса — РаботаСФайлами, за ним — двоеточие и имя другого интерфейса — IUnknown. Такая запись означает, что интерфейс РаботаСФайлами наследует все операции, определенные для интерфейса IUnknown, то есть клиент, у которого есть указатель на интерфейс IРаботаСФайлами, может вызывать и операции интерфейса IUnknown. IUnknown является главным интерфейсом для СОМ, все остальные интерфейсы — его наследники.

В четвертой строке указывается оператор import. Поскольку данный интерфейс наследует от IUnknown, может потребоваться IDL-описание для IUnknown. Аргумент оператора import указывает, в каком файле находится нужное описание.

Ниже в описании интерфейса приводятся имена и параметры трех операций — ОткрытьФайл, ЗаписатьФайл и ЗакрытьФайл. Все они возвращают величину типа HRESULT, указывающую корректность обработки вызова. Для каждого параметра в IDL приводится направление передачи (в данном примере in), тип и название.

Считается, что такого описания достаточно для заключения контракта между объектом СОМ и его клиентом.

По правилам СОМ запрещается любое изменение интерфейса (после его публикации). Для реализации изменений нужно вводить новый интерфейс. Такой интерфейс может быть наследником старого интерфейса, но отличен от него и имеет другое уникальное имя.

Значение правила запрета на изменение интерфейса трудно переоценить. Оно — залог стабильности работы в среде, где множество клиентов взаимодействует с множеством СОМ-объектов и где независимая модификация СОМ-объектов — обычное дело. Именно это правило позволяет клиентам старых версий не пострадать при введении новых версий СОМ-объектов. Новая версия обязана поддерживать и старый СОМ-интерфейс.


 
айтюнс