'

О некоторых вопросах компонентной архитектуры программного приложения

Понравилась презентация – покажи это...





Слайд 0

О некоторых вопросах компонентной архитектуры программного приложения Алексей Игнатенко


Слайд 1

Независимый программный модуль, обычно подключаемый на этапе выполнения программы Что такое компонента (plug-in)?


Слайд 2

Преимущества компонентной архитектуры


Слайд 3

Компонентная архитектура


Слайд 4

Отличие обычных DLL от компонент


Слайд 5

DLL: IPlugin *createInstance(const char *); Application: IPlugin* pluginInstance = createInstance(“RendererPlugin”); IRenderer* renderer = dynamic_cast<IRenderer>(pluginInstance) Простое решение


Слайд 6

Одно из трех: Нарушается безопасность типов static_cast Ограничивается применение плагинов dynamic_cast Необходима разработка сложной и ломкой кастомной RTTI QueryInterface Необходимы дополнительные соглашения для поиска однотипных плагинов (по имени, например) Недостатки простого решения


Слайд 7

Интерфейсы определяется в приложении Для интерфейсов применяются соглашения COM Плагины региструются сами в нужном месте системы Предлагаемое решение


Слайд 8

Фабрики для плагинов


Слайд 9

Application: DLL: Вариант 1, локальный


Слайд 10

Система разрабатывается с нуля для поддержки плагинов Вариант 2, глобальный


Слайд 11

А нужно ли поддерживать возможность работы из разных сред? Версии интерфейсов / библиотек Суперклассы - да/нет Приведение типов Подсчет ссылок Как искать плагины? События Проблемы и размышления


Слайд 12

Если нет требований, чтобы плагины и/или основное приложение работали из разных сред, нет смысла поддерживать соглашения COM Не нужны STDMETHODCALLTYPE, BSTR и т.п. Можно выделять и удалять память в разных DLL (это стоит проверить) Более того: можно использовать набор базовых неабстрактных классов и подключать общую библиотеку ко всем плагинам Внимание: но нужно очень четко работать с версиями в этом случае! А нужно ли поддерживать возможность работы из разных сред?


Слайд 13

Проверять версии 1) У библиотеки (DLL) 2) У плагина (интерфейса) Как проверять? Как поддерживать совместимость? Старые плагины должны работать с новыми интерфейсами? Новые плагины должны работать со старыми интерфейсами? Версии интерфейсов / библиотек


Слайд 14

Функции: запрос на информацию без создания экземпляра = статические функции Создание объекта = фабрика Нужны ли? Накладные расохды на создание/поддержку Суперклассы


Слайд 15

Dynamic_cast QueryInterface Приведение типов


Слайд 16

AddRef/Release – единственный вариант. Есть ли другие возможности? Если нет, почему? Подсчет ссылок


Слайд 17

Перебор файлов в папках Конфиг-файл (XML – рекомендуется MS) В реестре (пишется инсталлятором) Как искать плагины?


×

HTML:





Ссылка: