чем текст функций, которые считаем своей интеллектуальной соб-
ственностью, начинается самое интересное. Теперь мы можем опи-
сать сколько угодно новых типов фигур - многоугольников, звездо-
чек, эллипсов - производных от класса "геометрическая фигура" и
объяснить, как их рисовать, увеличивать и поворачивать. Как дви-
гать - объяснять не надо. Это уже есть в базовом классе. Функции
нашей библиотеки могут работать собъектами вновь созданных типов,
для них это варианты геометричесой фигуры. Следует отметить, что
в производных классах могут (и, как правило, должны) появлятся
данные и функции, которых нет в базовом классе. Однако ни одна из
функций, обрабатывающих "геометрические фигуры", никогда не уз-
нает о специфических свойствах многоугольника или эллипса, кроме
того, что они по-своему рисуются, увеличиваются и поворачиваются.
Производный класс сам может быть базовым для других классов, а
поздние версии С++ позволяют сделать один класс производным от
нескольких других.
При написании программы часто допускаются досадные оплошнос-
ти, обнаруживающиеся только на стадии выполнения и, увы, слишком
поздно. Например, если переменная по смыслу - знаменатель дроби,
хотелось бы получить сообщение об ошиюке тогда, когда ей присваи-
вается ноль, а не тогда, когда на этот ноль что-нибудь делится.
Или, скажем, функция рисования точки. Невозможно удержаться от
соблазна вызвать ее хотя бы раз без проверки выхода за границы
экрана. В то же время , если мы пишем программу рисования линии,
обязательно нужна функция, которая тупо ставит точку - и как мож-
но быстрее. Существует много ситуаций, когда функции и данные
следует разрешить использовать только привилегированным функциям,
над которыми ва "хорошо подумали". В С++ этого можно добиться,
сделав "опасные" данные и функции защищенными членами какого-ни-
будь класса. К ним имеют доступ только функции-члены этого же
класса, а так же друзья класса. Напротив, если данные или фун-
кции-члены объявлены public, они являются общедоступными.
С++ предоставляет в распоряжение программиста сложные типы
данных. Однако ни аппарат классов, ни перегрузка операций не
влияют на эффективность. То, что класс - это класс, известно
только компилятору. Если функции-члены классов объявлены inline,
на их вызов не требуется время. Фактически это не функции, а под-
становки. Лишь виртуальные функции оставляют относительно не-
большой след в оперативной памяти.
Из всего выше сказанного вытекает логичный вывод: С++ наибо-
лее удобный, универсальный и необходимый язык. Но все же возни-
кает вопрос, что же было написано на этом языке, используя прин-
ципы ООП, что можно было бы "потрогать" любому программисту или
пользователю. Ответ очевиден - это Microsoft Windows.
MS Windows и новый метод разработки программ.
Одним из наиболее важных механизмов взаимодействия программ
является обмен данными. В MS Windows существует несколько способов
взаимодействия приложений:
- почтовый ящик;
- динамический обмен данными;
- встраивание объектов.
Специальный почтовый ящик (clipboard) Windows позволяет
пользователю переносить информацию из одного приложения в другое,
не заботясь об ее форматах и представлении.
В отличие от профессиональных операциональных операционных
систем, где механизм обмена данными между программами доступен
только программисту, в Windows это делается очень просто и наг-
лядно для пользователя.
Механизм обмена данных между приложениями - жизненно важное
свойство многозадачной среды. И в настоящее время производители
программного обеспечения пришли уже к выводу, что для переноса
данных из одного приложения в другое почтового ящика уже недоста-
точно. Появился новый, более универсальный механизм - OLE (
Object Linking and Embedding )
- Встроенная объектная связь, который позволяет пе-
реносить из одного приложения в другое разнородные данные. Напри-
мер, с помощью этого механизма данные, подготовленные в системе
сетевого планирования Time Line for Windows ( Symantec ), можно
переносить в текстовый процессор Just Write ( Symantec ), а за-
тем, скажем, в генератор приложений Object Vision (Borland).
Правда, это уже нестандартное средство Microsoft Windows, но тем
не менее реализация OLE стала возможной именно в Windows.
Кроме механизма почтового ящика, предназначенного, в основ-
ном, для пользователя, программисту в Windows доступны спе-
циальные средства обмена данными между приложениями.
Программным путем можно установить прямую связь между зада-
чами, например, принимая данные из последовательного порта, авто-
матически помещать их, скажем, в ячейки электронной таблицы
Excel, средствами которой можно тут же отображать сложные зависи-
мости в виде графиков или осуществлять их обработку в реальном
режиме времени (этот механизм носит название динамического обме-
на данными - Dynamic Data Exchange, DDE ).
Основные термины
Клиентское приложение DDE - приложение, которому необходи-
мо установить диалог с сервером и получить данные от сервера в
процессе диалога.
DDE-диалог - взаимосвязь между клиентским и серверным при-
ложениями.
Сервер-приложение - DDE приложение, которое передает дан-
ные клиенту в процессе диалога.
DDE-Транзакция -обмен сообщениями или данными между клиен-
том и сервером.
Item имя - строка, идентифицирующая некоторое множество
данных, которое сервер в состоянии передать клиенту в процессе
диалога.
Service имя - строка, генерируемая сервером и используе-
мая клиентом для установления диалога.
Строковый указатель - двойное слово, генерируемое опера-
ционной системой, идентифицирующее строку, передающуюся в процес-
се динамического обмена данными.
Topic имя - строка, которая идентифицирует тип данных,
необходимых клиентскому приложению при динамическом обмене данных.
Фильтр транзакции - флаг, который препятствует передаче
нежелательных типов транзакций в функцию обратного вызова.
В Microsoft Windows динамический обмен данных является фор-
мой связи, которая использует общие области памяти для обмена
данными между приложениями. Приложение может использовать DDE в
некоторый момент времени для передачи и получения новых данных от
сервера.
Механизм DDE схож с механизмом почтового ящика, который яв-
ляется частью операционной системы WINDOWS. Существует лишь нез-
начительная разница в том, что почтовый ящик, в большинстве слу-
чае, используется как буфер временного хранения информации. DDE
может быть инициализирован пользователем и в большинстве случаев
продолжать работать без его вмешательства.
Библиотека DDEML обеспечивает пользователя набором средств,
которые упрощают использование механизма DDE в WINDOWS приложе-
ниях. Вместо того, чтобы обрабатывать, получать и передавать DDE
сообщения напрямую, приложения используют функции DDEML библиоте-
ки. Библиотека DDEML также обеспечивает работу со строками и раз-
деляемыми данными, генерируемыми DDE приложениями. Вместо того,
чтобы использовать указатели на общие области памяти, DDE прило-
жения создают и обмениваются строковыми указателями, которые
идентифицируют строки и данные.
Уже существующие приложения, использующие протокол DDE, ос-
нованный на сообщениях полностью совместимы с теми, которые ис-
пользуют библиотеку DDEML. Вот почему приложение, использующее
DDE-протокол могут установить диалог и выполнять транзакции с
приложениями, использующими библиотеку DDEML.
Взаимосвязь между клиентом и сервером.
DDE возникает всегда между клиентским приложением и сервер-
ным. Клиентское приложение инициализирует обмен данными путем ус-
тановления диалога с сервером и передачи транзакции. Транзакция
необходима для данных и обслуживания. Сервер отвечает на транзак-
цию и обеспечивает клиента данными. Сервер может иметь сразу нес-
колько клиентов в одно и тоже время, в свою очередь, клиент мо-
жет получать данные сразу от нескольких серверов. Некоторое при-
ложение одновременно может быть и клиентом и сервером. В добавок
к вышесказанному, клиент и сервер могут оборвать диалог в любое
удобное для них время.
DDE сервер использует три зарезервированных типа имен, рас-
положенных иерархично: service, topic item - уникально идентифи-
цируют некоторое множество данных, которое сервер может передать
клиенту в процессе диалога.
Service имя - это строка, которую генерирует сервер в те
промежутки времени, в которые клиент может установить диалог с
сервером.
Topic имя - это строка, которая идентифицирует логичес-
кий контекст данных. Для сервера, который манипулирует файлами,
topic имена это просто названия файлов; для других серверов - это
специфические имена конкретного приложения. Клиент обязательно
должен указывать topic имя вместе с service именем, когда он хо-
чет установить диалог с сервером.
Item имя - это строка, которая идентифицирует некото-
рое множество данных, которое сервер может передать клиенту в
процессе транзакции. Например, item имя может идентифицировать
ЦЕЛОЕ ( int, integer ), СТРОКУ ( string, char * ), несколько па-
раграфов текста, или BITMAP образ.
Все вышеуказанные имена позволяют клиенту установить диа-
лог с сервером и получить от него данные.
Системный режим
Системный режим работы обеспечивает клиента всей необходи-
мой информцией о сервере.
Для того, чтобы определить, какие серверы доступны в дан-
ный момент времени, а также какой информацией они могут обеспе-
чить клиента, последний, находясь в начальном режиме работы, дол-
жен установить имя устройства, равное NULL. Такой шаблон диалога