Parser Generator
Инструментарий для построения компиляторов.
   

Главная

О сайте

Документация

Download

Ссылки

Библиография

О нас


Архитектура системы

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

Важную роль в построении любой программы имеет ее архитектура- способы и механизмы которые определяют передачу данных между блоками, сохранение информации, сохранение программы в работоспособном состоянии после сбоев, передачу сообщений от одних объектов другим, способы расширения системы. Для написания большой и сложной программы не обойтись без серьезного продумывания всех этих вопросов.

В последнее время очень много стали говорить о повторном использовании кода, об интеграции программ, об универсальных форматах хранения информации... Собрав и изучив материал по этим вопросам, была разработана и внедрена на данной программе специальная система, которая позволяет создавать расширяемые программы. Эта система состоит множества механизмов и наборов компонент, реализующих эти механизмы. Другими словами создана целая спецификация, описывающая то, как необходимо создавать программу, чтобы она была расширяемой, умела встраиваться в существующую программу, была в состоянии получать и принимать данные из других частей программы.

Введение. Основные идеи.

Основное требование, которое предъявлялось к архитектуре системы- динамическая расширяемость. Т.е. возможность добавлять к программе дополнительные модули. Можно сказать, что уже созданы подобные системы- COM, ActiveX. Однако, эти технологии не подразумевают, что все произойдет без участия программиста или оператора- для того, чтобы добавить новый блок в программу необходимо либо внедрить новый объект в документ программы, либо добавить новый блок при помощи средства разработки. В нашей разработке все происходит автоматически- при появлении нового модуля на жестком диске компьютера основная программа самостоятельно его находит, распознает его и встраивает в общую систему. Таким образом, основной запускаемый файл системы вообще может не представлять для пользователя интереса, вся полезная для него логика скрыта в этих самых подключаемых модулях. Основной же файл лишь подключает все модули и управляет их работой.

Основное удобство при использовании такого подхода является его ориентированность на использование в настольных приложениях Win32. Для каждого модуля определяется какие пугнкты меня должны быть добавлены в основное меню, какие сообщения должны ему передаваться.

Менеджер компонентов.

Основой всего механизма является менеджер компонентов, который управляет всеми компонентами подключенными в систему. Он реализован в виде класса CompMgr.

CompMgr
void  FindComponents ( char* p_Path , char* p_Mask ) // Осуществляет поиск компонентов в определенном каталоге на диске.
ClassFactory::ptr GetClassFactory ( long p_ind ) // Возвращает фабрику класса по ее номеру.
void  LoadComponent ( char* p_Path ) // Загружает компонент находящийся по определенному пути на диске.

Важную роль играет класс ClassFactory- фабрика классов. Фактически каждый компонент содержит в себе фабрику классов, через которую происходит общение с компонентом.

ClassFactory
Interface::Ptr CreateInterface ( InterfaceId p_Id ) // Содзает интерфейс по его идентификатору, если возвращает 0, значит компонент не реализует данный интефейс и нет необходимости производить определяемые этим интерфейсом действия.
void  UnregisterInterface ( InterfaceId p_Id ) // Прекращает использование интерфейса.

Входная точка в компонент. Через нее создаются все интерфейсы компонентов.

Теперь рассмотрим абстрактный класс Interface. Этот класс является для всех интерфейсов, которые существую в системе. Каждый интерфейс определяет специальное взаимодейтсвие между компонентом и ядром программы. Например интерфейс INotifyRecipient (получатель сообщений) определяет, что данный интерфейс заиентересован в получении сообщений от системы. С помощью другого интерфейса- IComponentInfo происходит передача информации о компоненте.

Теперь можно вкратце описать работу системы. После запуска стартует менеджер компонентов. В своих специальных папках он находит все динамические библиотеки, регистрирует их и через соответствующие интерфейсы определяет все настройки, которые необходимо произвести с окружением (добавляет пункты меню, кнопки на панели инструментов, после этого он ожидает воздействия пользователя. При нажатии на определенные кнопки или при выборе пунктов меню ядро передает соответствующие сообщения компонентам. Компоненты запускают свои окна, осуществляя необходимы действия, передают свои результаты ядру. Ядро определяет, какой компонент заинтересован в этих данных и отсылает их ему. Вся пересылка данных ведется в основном с помощью XML строк, что позволяет не думать об общих структурах данных. Это вообще позволяет использовать различные инструментальные средства. Например Visual C, Visual Basic, Delphi, Borland C Builder...


 
   
© С. Григорчук 2001, Содержание, дизайн

ukman@yandex.ru
Hosted by uCoz