На главную страницу
Форум txt.version   



Статья :: Сущность технологии СОМ. Библиотека программиста : Дональд Бокс

В этой книге СОМ исследуется с точки зрения разработчика C++. Написанная ведущим специалистом по модели компонентных объектов СОМ, она раскрывает сущность СОМ, помогая разработчикам правильно понять не только методы модели программирования СОМ, но и ее основу. Понимание мотивов создания СОМ и ее аспектов, касающихся распределенных систем, чрезвычайно важно для тех разработчиков, которые желают пойти дальше простейших приложений СОМ и стать по-настоящему эффективными СОМ-программистами. Показывая, почему СОМ для распределенных систем (Distributed СОМ) работает именно так, а не иначе, Дон Бокс дает вам возможность применять эту модель творчески и эффективно для ежедневных задач программирования.

Посвящается Юдит С., которая помогла мне одолеть одну вещь, более устрашающую, чем СОМ, и сделала возможной написание этой книги, и Барбаре, которая оставалась со мной достаточно долго для того, чтобы увидеть, чем все это кончилось.

Предисловие Чарли Киндела

Когда я сел писать это предисловие, мне не давали покоя следующие мысли:

Будет ли портрет Дона на четвертой стороне обложки, и если да, то какой длины будут его волосы?

Осознают ли читатели этой книги, что у Дона есть индивидуализированные (personalized) лицензионные платы, способные читать интерфейс «IUNKNOWN»?

Что за чертовщину нужно писать в предисловии к книге?

У меня было две идеи насчет того, что написать в этом предисловии. Первая – высказать несколько мыслей о конструировании СОМ, которые я уже давно собираюсь записать. Вторая идея – польстить Дону Боксу в той же мере, в какой он польстил мне обращением с просьбой написать предисловие к своей книге. В конце концов я решил осуществить обе идеи.

Что есть СОМ? Зачем его придумали? Дон кратко осветил эти вопросы в первой главе. Вводная часть заканчивается словами «…в этой главе показана архитектура для повторного использования модулей, которая позволяет динамично и эффективно строить системы из независимо сконструированных двоичных компонентов». Остальная часть этой главы ведет вас шаг за шагом сквозь мыслительный процесс, происходивший в умах разработчиков СОМ с 1988 по 1993 годы, когда была выпущена первая версия СОМ.

Я думаю, что существует несколько аспектов конструирования СОМ, которые обеспечили его длительный успех. Первое и основное – это практичность, второе – простота, из которой проистекает его гибкость, или податливость.


Практичность

СОМ относится к разработке программного обеспечения весьма прагматично. Вместо того чтобы искать решение на основе почти религиозной академической догмы объектно-ориентированного программирования, СОМ-конструирование принимает во внимание как человеческую природу, так и капитализм. Команда разработчиков выделила лучшие, наиболее коммерчески убедительные аспекты классического объектного ориентирования (ОО) и объединила их с тем, чему она научилась при попытках добиться повторного использования предыдущих программных разработок – как внутри, так и вне Microsoft.

Большинство классических текстов, посвященных ОО, описывают систему или язык как ориентированный объект, если он поддерживает инкапсуляцию (сокрытие информации), полиморфизм и наследование. Часто подчеркивается, что главной движущей силой повторного использования является наследование. Разработчики СОМ не согласились с таким акцентом. Они поняли, что это слишком упрощенное представление и что в действительности существуют два вида наследования. Наследование реализации предполагает, что наследуется фактическая реализация (поведение). Наследование интерфейсов предполагает, что наследуется только определение (спецификация) поведения. Именно второй вид наследования обеспечивает полиморфизм, и этот вид полностью поддерживается моделью СОМ. С другой стороны, наследование реализации – это просто один из механизмов для повторного использования существующей реализации. Тем не менее, если конечной целью является повторное использование, тогда наследование реализации является просто средством для достижения этой цели, но не является самоцелью.

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

Разработчики СОМ развенчали миф о том, что главную роль при достижении повторного использования играет наследование. Фундаментальное понятие, использующееся в СОМ при моделировании повторного использования, – это инкапсуляция, а не наследование. А принцип наследования СОМ использует при моделировании взаимоотношения типов между объектами, выполняющими сходные функции. Построением СОМ-модели повторного использования на основе инкапсуляции разработчики поддерживали повторное использование в форме черного ящика, устраивающее ожидаемый рынок компонентов. Идея состоит в том, что клиенты должны иметь дело с объектами как с непрозрачными компонентами в смысле того, что находится у них внутри и как они реализованы. Разработчики СОМ полагали, что для проведения этой идеи в жизнь должна быть разработана архитектура. С какой стати любой может разрабатывать систему с другой моделью для повторного использования? Хороший вопрос. Дело, однако, в том, что мир полон «объектно-ориентированных» систем, которые не только не поддерживают инкапсуляцию в стиле черного ящика, но даже затрудняют ее достижение. Классическим примером этого является C++. В первой главе своей книги Дон очень понятно объясняет то, что я подразумеваю под этим.

Следующие уравнения иллюстрируют различия между объектно-ориентированным и компонентно-ориентированным программированием.

Объектно-ориентированное программирование = полиморфизм + (немного) позднее связывание + (немного) инкапсуляции + наследование.

Компонентно-ориентированное программирование = полиморфизм + (истинно) позднее связывание + (действительная, принудительная) инкапсуляция + наследование интерфейсов + двоичное повторное использование.

Во всяком случае для меня эта дискуссия – род забавы. Борцы за чистоту OO, проживающие в comp.object и comp.object.corba, выбились из сил, тыча пальцами в СОМ и говоря: «Но он не по-настоящему объектно-ориентированный». Вы можете оспорить это двумя способами:

1. «Он-то как раз по-настоящему! Это ваше определение ОО неправильное».

2. «Ну и что!?! СОМ имеет феноменальный коммерческий успех и позволяет тысячам независимых разработчиков создавать потрясающее программное обеспечение, которое интерполирует и интегрирует. И они делают деньги. Много денег[1]. Программные компоненты, написанные ими, покупаются, используются и повторно используются. Разве не в этом смысл любой технологии? Кроме того, я всегда могу доказать, что только СОМ является истинно компонентно-ориентированным [2].

Вот так-то!


Простота ведет к податливости (malleability)

mal-le-a-ble (mal'e-e-bel) adjective (прилагательное)

1. Способный быть выкованным или сформированным, как под ударами молота или под давлением: податливый металл.

2. Легко контролируемый или поддающийся влиянию; послушный.

3. Способный подстраиваться под изменяющиеся обстоятельства, легко приспосабливаемый: гибкий ум прагматика[3].

Первое реальное применение СОМ заключалось в том, что он был взят за основу при второй попытке фирмы Microsoft создать сложную структуру документов Object Linking & Embedding 2.0 (связывание и внедрение объектов, OLE 2.0). Если вы рассмотрите всю массу возможностей для приложения СОМ в настоящее время, то сразу поймете, что я имею в виду, называя его податливым. Программисты используют СОМ для обеспечения сменной (plug-in) архитектуры для своих приложений; для конструирования крупномасштабных многоярусных клиент/серверных приложений; для ведения дел и заключения сделок в мире бизнеса; для создания развлекательных сюжетов на Web-страницах; для контроля и мониторинга производственных процессов и даже для выслеживания спутников-шпионов путем дистанционного управления целой армией телескопов.

Эта податливость достигнута благодаря тому, что разработчики СОМ поставили во главу угла принцип: ядро модели будет настолько простым, насколько это необходимо, но не более. Одной из наиболее явных сторон этого подхода является нудность программирования на СОМ на сегодняшний день. Программисты, работающие на С или C++, должны возиться со всей этой ерундой, в том числе с GUID и со счетчиками ссылок. Можно было бы добавить к СОМ всякого рода усовершенствования с целью упрощения работы с ней. Но разработчики вместо этого акцентировали внимание на том, чтобы заставить модель работать. Они считали, что если они достигнут успеха, то сервисную поддержку можно будет обеспечить позднее. И это предположение было подтверждено недавними выпусками простых в употреблении инструментов СОМ, таких как Visual Basic, поддержка СОМ в Visual C++ 5.0, а также Active Template Library. К тому времени, когда вы читаете этот текст, фирма Microsoft должна уже объявить о своих будущих планах радикально упростить разработку СОМ с помощью внедрения общего времени выполнения (runtime), которое будет доступно для всего инструментария: СОМ+.


Фольклор

Любая технология, распространенная так широко, как СОМ, начинает обрастать фольклором. Ради забавы приведу несколько, возможно, неизвестных вам тезисов. Некоторые из них даже правдивы.

Огромное множество людей из различных групп по всей фирме Microsoft внесли серьезный вклад в разработку СОМ, но главными архитекторами СОМ были Боб Аткинсон (Bob Atkinson), Тони Вильямс (Tony Williams) и Крейг Виттенберг (Craig Wittenberg). Все трое по-прежнему в Microsoft за работой над воистину редкостной чепухой.

Боб, Тони и Крейг были частью кросс-группы, получившей привилегию создания базовой технологии, которая позволила бы воплотить в жизнь мечту Билла Гейтса о IAYF (Information at Your Fingertips – информация на кончиках ваших пальцев)[4]. Но хотя эти трое прекрасно осознавали грядущую мощь СОМ, на деле они были обременены выпуском того, что лишь использовало СОМ: OLE 2.0. Это помогает объяснить, почему оформление документации для собственно СОМ заняло столько времени. Жаль.

Первая реализация СОМ была выпущена в свет как часть программного продукта OLE 2.0 в мае 1993 года.

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

В одно время IUnknown не имел метода AddRef. В дальнейшем стало ясно, что запрещение копирования указателей интерфейсов – слишком жесткое ограничение для пользователей.

«Unknown» в «IUnknown» возник как результат создания Тони Вильямсом в декабре 1988 года внутреннего документа фирмы Microsoft под названием Object Architecture: Dealing with the Unknown—or—Type Safety in a Dynamically Extensible Class Library (Архитектура объектов: борьба с неизвестным – или – безопасность типов в динамически расширяемой библиотеке классов).

Решение использовать RPC в качестве механизма межпроцессорного управления (interprocess remoting mechanism) было принято в первые два месяца 1991 года. Служебная записка Боба Аткинсона, озаглавленная IAYF Requirements for RPC (Технические требования IAYF для RPC), документирует требования, предъявленные команде создателей RPC теми, кого впоследствии назвали «командой IAYF». Эта команда отвечала за создание основы того, что осуществило бы мечту Билла Гейтса об «Information at Your Fingertips». Этой основой и была СОМ (хотя тогда она еще так не называлась).

Моникеры (monikers) намного мощнее, чем вы думаете.

Это Марк Райланд (Mark Ryland) виноват в том, что некоторые расшифровывают аббревиатуру СОМ как «Common Object Model» (модель общих объектов). Он глубоко сожалеет об этом и рассыпается в извинениях.

«MEOW» (мяу) в действительности не является сокращением Microsoft Extensible Object Wire (наращиваемый провод для объектов Microsoft). Это шутка Рика (Rick).

Windows NT 3.5 включали в себя первые версии 32-разрядных СОМ и OLE. Кто-то случайно оставил «#pragma optimization off» в одном из основных заголовочных файлов. Упс! (Oops).

Нет ни одной книги (на английском) о СОМ, DCOM, OLE или ActiveX, которую бы я не прочитал. Вы, вероятно, найдете мое имя в качестве технического обозревателя в списке разработчиков. Я также сам написал множество статей об этих технологиях, и был первым издателем СОМ Specification (Спецификация СОМ). Я провел сотни презентаций СОМ для технических и нетехнических аудиторий. Из всего этого должно быть ясно, что я потратил огромное количество времени и энергии, чтобы найти наилучший способ объяснить, что такое СОМ.

А теперь, похоже, весь мой тяжкий труд пропал даром, поскольку после прочтения последнего чернового варианта этой книги мне стало ясно, что никто не объясняет СОМ лучше, чем Дон Бокс.

Надеюсь, что вы насладитесь этой прогулкой в той же мере, как и я.


Чарли Киндел (Charlie Kindel)

СОМовец (СОМ guy), корпорация Microsoft

Сентябрь 1997 г.


Предисловие Грэйди Буча

Порой о книге можно не просто сказать много хорошего, а сказать это дважды. Это одна из причин, по которой к книге Дона написано два предисловия – она заслуживает этого.

Если вы занимаетесь созданием систем для Windows 95 или NT, вы никак не можете обойтись без СОМ. Visual Studio, и особенно Visual Basic, скрывают некоторые сложности СОМ, но если вы: а) действительно хотите понять, что происходит «за кулисами» и/или б) использовать мощность СОМ, то книга Дона – для вас.

Что мне особенно нравится в этой книге, так это путь, которым идет Дон, освещая СОМ для читателя. Сначала перед вами открываются проблемы создания рассредоточенных и действующих одновременно систем; затем вам подробно и тщательно объясняют, как эти проблемы решает СОМ. Даже если вы не знаете абсолютно ничего о СОМ, когда начинаете читать эту книгу, вас проведут по простой и понятной концептуальной модели СОМ, после чего вы поймете все задачи, которые СОМ ставит перед собой, и вам станет ясен характер сил, придающих ему ту структуру и тот образ действий, которыми он обладает. Если же вы – опытный разработчик СОМ, то вы в полной мере оцените предложенные Доном остроумные и нестандартные способы применения СОМ для решения обычных задач.

СОМ – наиболее широко используемая объектная модель для разработки рассредоточенных и действующих одновременно систем. Эта книга поможет вам использовать СОМ для успешного развития такого рода систем.

Грэйди Буч (Grady Booch)





Сущность технологии СОМ. Библиотека программиста : Дональд Бокс

страницы в данном разделе 
Сущность технологии СОМ. Библиотека программиста : Дональд Бокс От автора : Дональд Бокс
Благодарности : Дональд Бокс Глава 1. СОМ как улучшенный C++ : Дональд Бокс
Распространение программного обеспечения и язык С++ : Дональд Бокс Динамическая компоновка и С++ : Дональд Бокс
C++ и мобильность : Дональд Бокс Инкапсуляция и С++ : Дональд Бокс
Отделение интерфейса от реализации : Дональд Бокс Абстрактные базы как двоичные интерфейсы : Дональд Бокс
Полиморфизм на этапе выполнения : Дональд Бокс Расширяемость объекта : Дональд Бокс
Управление ресурсами : Дональд Бокс продолжение 13
Распространение программного обеспечения и язык С++ : Дональд Бокс Динамическая компоновка и С++ : Дональд Бокс
C++ и мобильность : Дональд Бокс Инкапсуляция и С++ : Дональд Бокс
Отделение интерфейса от реализации : Дональд Бокс Абстрактные базы как двоичные интерфейсы : Дональд Бокс
Полиморфизм на этапе выполнения : Дональд Бокс Расширяемость объекта : Дональд Бокс
Управление ресурсами : Дональд Бокс Снова об интерфейсах и реализациях : Дональд Бокс
IDL : Дональд Бокс Методы и их результаты : Дональд Бокс
Интерфейсы и IDL : Дональд Бокс Интерфейс IUnknown : Дональд Бокс
Управление ресурсами и IUnknown : Дональд Бокс Приведение типов и IUnknown : Дональд Бокс
Реализация IUnknown : Дональд Бокс Использование указателей интерфейса СОМ : Дональд Бокс
Оптимизация QueryInterface : Дональд Бокс Типы данных : Дональд Бокс
Атрибуты и свойства : Дональд Бокс Исключения : Дональд Бокс
Где мы находимся? : Дональд Бокс Снова об интерфейсах и реализациях : Дональд Бокс
IDL : Дональд Бокс Методы и их результаты : Дональд Бокс
Интерфейсы и IDL : Дональд Бокс Интерфейс IUnknown : Дональд Бокс
Управление ресурсами и IUnknown : Дональд Бокс Приведение типов и IUnknown : Дональд Бокс
Реализация IUnknown : Дональд Бокс Использование указателей интерфейса СОМ : Дональд Бокс
Оптимизация QueryInterface : Дональд Бокс Типы данных : Дональд Бокс
Атрибуты и свойства : Дональд Бокс Исключения : Дональд Бокс
Где мы находимся? : Дональд Бокс Снова об интерфейсе и реализации : Дональд Бокс
Объекты классов : Дональд Бокс Активация : Дональд Бокс
Использование SCM : Дональд Бокс Классы и серверы : Дональд Бокс
Обобщения : Дональд Бокс Оптимизации : Дональд Бокс
Снова интерфейс и реализация : Дональд Бокс Моникеры и композиция : Дональд Бокс
Моникеры и сохраняемость : Дональд Бокс Время жизни сервера : Дональд Бокс
Классы и IDL : Дональд Бокс Эмуляция классов : Дональд Бокс
Категории компонентов : Дональд Бокс Снова об интерфейсе и реализации : Дональд Бокс
Объекты классов : Дональд Бокс Активация : Дональд Бокс
Использование SCM : Дональд Бокс Классы и серверы : Дональд Бокс
Обобщения : Дональд Бокс Оптимизации : Дональд Бокс
Снова интерфейс и реализация : Дональд Бокс Моникеры и композиция : Дональд Бокс
Моникеры и сохраняемость : Дональд Бокс Время жизни сервера : Дональд Бокс
Классы и IDL : Дональд Бокс Эмуляция классов : Дональд Бокс
Категории компонентов : Дональд Бокс Снова IUnknown : Дональд Бокс
QueryInterface транзитивна : Дональд Бокс QueryInterface рефлективна : Дональд Бокс
Объекты имеют статический тип : Дональд Бокс QueryInterface и IUnknown : Дональд Бокс
Множественные интерфейсы и имена методов : Дональд Бокс Динамическая композиция : Дональд Бокс
Двоичная композиция : Дональд Бокс Снова IUnknown : Дональд Бокс
QueryInterface транзитивна : Дональд Бокс QueryInterface рефлективна : Дональд Бокс
Объекты имеют статический тип : Дональд Бокс QueryInterface и IUnknown : Дональд Бокс
Множественные интерфейсы и имена методов : Дональд Бокс Динамическая композиция : Дональд Бокс
Двоичная композиция : Дональд Бокс Снова интерфейс и реализация : Дональд Бокс
Объекты, интерфейсы и апартаменты : Дональд Бокс Межапартаментный доступ : Дональд Бокс
Вспомогательные средства для внутрипроцессного маршалинга : Дональд Бокс Архитектура стандартного маршалинга : Дональд Бокс
Реализация интерфейсных маршалеров : Дональд Бокс Стандартный маршалинг, потоки и протоколы : Дональд Бокс
Управление жизненным циклом и маршалинг : Дональд Бокс Специальный маршалинг : Дональд Бокс
Маршалер свободной поточной обработки (FreeThreaded Marshaler) : Дональд Бокс Снова интерфейс и реализация : Дональд Бокс
Объекты, интерфейсы и апартаменты : Дональд Бокс Межапартаментный доступ : Дональд Бокс
Вспомогательные средства для внутрипроцессного маршалинга : Дональд Бокс Архитектура стандартного маршалинга : Дональд Бокс
Реализация интерфейсных маршалеров : Дональд Бокс Стандартный маршалинг, потоки и протоколы : Дональд Бокс
Управление жизненным циклом и маршалинг : Дональд Бокс Специальный маршалинг : Дональд Бокс
Маршалер свободной поточной обработки (FreeThreaded Marshaler) : Дональд Бокс Подводные камни внутрипроцессной активации : Дональд Бокс
Активация и SCM : Дональд Бокс Снова о времени жизни сервера : Дональд Бокс
Снова о времени жизни сервера : Дональд Бокс Идентификаторы приложений : Дональд Бокс
COM и защита : Дональд Бокс Программируемая защита : Дональд Бокс
Контроль доступа : Дональд Бокс Управление маркерами : Дональд Бокс
Подводные камни внутрипроцессной активации : Дональд Бокс Активация и SCM : Дональд Бокс
Снова о времени жизни сервера : Дональд Бокс Снова о времени жизни сервера : Дональд Бокс
Идентификаторы приложений : Дональд Бокс COM и защита : Дональд Бокс
Программируемая защита : Дональд Бокс Контроль доступа : Дональд Бокс
Управление маркерами : Дональд Бокс Основы указателей : Дональд Бокс
Указатели и память : Дональд Бокс Массивы : Дональд Бокс
Управление потоками данных : Дональд Бокс Динамический вызов в сравнении со статическим : Дональд Бокс
Двунаправленные интерфейсные контракты : Дональд Бокс Совмещение имен в IDL : Дональд Бокс
Основы указателей : Дональд Бокс Указатели и память : Дональд Бокс
Массивы : Дональд Бокс Управление потоками данных : Дональд Бокс
Динамический вызов в сравнении со статическим : Дональд Бокс Двунаправленные интерфейсные контракты : Дональд Бокс
Совмещение имен в IDL : Дональд Бокс Проиложение А. Эволюция объектов : Дональд Бокс
Приложение Б. Избранный код : Дональд Бокс Использовалась литература : Сущность технологии СОМ. Библиотека программиста

Разделы
Околокомпьютерная литература (375)
Программирование (102)
Программы (75)
ОС и Сети (49)
Интернет (29)
Аппаратное обеспечение (16)
Базы данных (6)


Microsoft Office Журнал Компьютерра № 32 от 5 сентября 2006 года Журнал Компьютерра № 34 от 18 сентября 2006 года