Как разработать расширяемое программное обеспечение (архитектура плагина)?

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

Что вы порекомендуете? Какие-нибудь книги, которые обсуждают тему?
Я бы предпочел что-то короткое и точное; немного теории и кучей конкретных примеров.

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

И по той же причине я предпочитаю не делать этого, используя фреймворк, который кто-то создал (если frameworks не очень высокоуровневые, т. Е. Не скрывают слишком много), на данный момент я только хочу воспитывать себя на субъект и эксперимент с различными способами его реализации. Кроме того, структура обычно предполагает знание пользователем предмета.

ОБНОВИТЬ

Я не спрашиваю об ООП или не позволяю моим classам наследоваться. Я говорю о разработке приложения, которое будет развернуто в системе, чтобы его можно было расширить сторонними надстройками ПОСЛЕ развертывания.

Например, Notepad ++ имеет подключаемую архитектуру, в которой вы можете поместить DLL-файл в папку плагинов и добавляет функциональность к приложению, которое там не было, например, к набору цветов или вставке fragmentов или к многим другим вещам (широкий спектр функций).

    ЕСЛИ мы говорим .NET, попробуйте Scripting .NET-приложения с VBScript над CodeProject. Здесь много конкретных примеров.

    Ниже представлены сайты, реализующие различные методы расширения приложений

    • ClearScript – позволяет использовать V8, VBScript и JScript для приложений .NET
    • CS-Script – C # Script Engine
    • Архитектура плагина с использованием C #
    • Архитектура плагина Opinio
    • Замечания по архитектуре подключаемого модуля Eclipse
    • Плагиновая архитектура для начинающих
    • Архитектура плагина Gecko
    • Архитектура плагина Fungimol

    OSGI – хороший практический пример технической основы, позволяющей делать то, что вам нужно.

    Теория здесь .

    Книга (бесплатно!) Есть .

    Расширяемость и возможность написания плагина должны иметь дело с жизненным циклом службы

    • добавление / удаление службы / плагина на месте
    • управление зависимостями между службами
    • управление состояниями услуг (объявлено, установлено, запущено, остановлено, …)

    Для чего OSGI?

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

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

    Выдержка:

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

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

    Мало того, что услуги минимизируют конфигурацию, они также значительно сокращают количество общих пакетов.

    Вы пытаетесь достичь двух конкурирующих целей:

    1. Компоненты вашего программного обеспечения должны выставлять много из них, поэтому их можно использовать повторно
    2. Компоненты вашего программного обеспечения должны выставлять очень мало о себе, поэтому их можно повторно использовать

    Объяснение: Чтобы поощрять повторное использование кода, вы должны иметь возможность расширять существующие classы и вызывать их методы. Это невозможно, если методы объявлены «частными», а classы «окончательны» (и не могут быть расширены). Поэтому для достижения этой цели все должно быть общедоступным и доступным. Нет личных данных или методов.

    Когда вы выпускаете вторую версию своего программного обеспечения, вы обнаружите, что многие идеи версии 1 были просто неправильными. Вам нужно изменить многие интерфейсы или ваш код, имена методов, методы удаления, сломать API. Если вы это сделаете, многие люди отвернутся. Поэтому, чтобы иметь возможность развивать ваше программное обеспечение, компоненты не должны выставлять ничего, что не является абсолютно необходимым – за счет повторного использования кода.

    Пример: я хотел наблюдать положение курсора (каретки) в SWT StyledText. Карет не должен расширяться. Если вы это сделаете, вы обнаружите, что код содержит такие проверки, как «этот class в пакете org.eclipse.swt», и множество методов являются частными и окончательными, а еще и много. Мне пришлось скопировать около 28 classов из SWT в мой проект, чтобы реализовать эту функцию, потому что все заблокировано.

    SWT – отличная инфраструктура для использования и ад.

    Конечно, существует знаменитый Открытый Закрытый Принцип – http://en.wikipedia.org/wiki/Open/closed_principle

    Внесите в ваше приложение принципы SOLID .

    1. Принцип единой ответственности: class должен иметь только одну ответственность (т.е. только одно потенциальное изменение в спецификации программного обеспечения должно влиять на спецификацию classа

    Принцип 2.Open/closed: объекты программного обеспечения … должны быть открыты для расширения, но закрыты для модификации

    3. Принцип замещения Лискова: объекты в программе должны быть заменены экземплярами своих подтипов без изменения правильности этой программы

    4. Принцип сегрегации интерфейса: многие клиентские интерфейсы лучше, чем один универсальный интерфейс

    5. Принцип инверсии зависимостей. Следует зависеть от абстракций . Не зависеть от конкреций

    Вопросы, связанные с Stackoverflow:

    Пример принципа единой ответственности

    Принцип Open / Closed – хорошая идея?

    Что такое принцип замены Лискова?

    Принцип разделения сечений – программа для интерфейса

    Что такое принцип инверсии зависимостей и почему он важен?

    Ну, это зависит от языка.

    • В C / C ++ я уверен, что есть функция loadlibrary, которая позволяет вам открывать библиотеку во время выполнения и вызывать ее экспортированные функции. Обычно это делается на C / C ++.
    • В .NET существует Reflection, который предлагает похожие (но более широкие) функции loadlibrary. Существуют также целые библиотеки, построенные на Reflection, например Managed Extension Framework, или Mono.Addins, который уже делает большую часть тяжелой работы для вас.
    • В Java есть также Reflection. И есть JPF (Java Plugin Framework), который используется в таких материалах, как Eclipse IIRC.

    В зависимости от того, какой язык вы используете, я мог бы порекомендовать некоторые учебники / книги. Я надеюсь, что это было полезно.

    В статье « Написание приложений на основе плагинов» четко объясняются обязанности различных частей архитектуры с использованием очень простого примера; предоставляется исходный код (VB.Net). Я нашел это очень полезным в понимании основных понятий.

    Оформить заказ «CAB» – Microsoft Application Composition Application Building Block Framework . Я думаю, что у них есть «веб-версия» этого тоже …

    Я только начал разрабатывать смарт-клиентское приложение. Это два варианта, которые я рассматриваю.

    Использование пространства имен Microsoft System.AddIn . Выглядит очень многообещающе, однако это может быть немного сложным для нашего конечного решения.

    Или пакет Smart Client – составной пользовательский интерфейс от Microsoft

    В последнее время я рассмотрел вопрос о том, как собрать компоненты как составной блок приложений пользовательского интерфейса, так и пространство имен System.AddIn для создания собственного. Поскольку исходный код доступен для CAB, его легко расширить. Я думаю, что нашим конечным решением будет небольшая версия CAB, определенно использующая блок приложений Unity

    Архитектура плагина становится очень популярной благодаря своей расширяемости и, следовательно, гибкости.

    Для c ++ сервер Apache httpd на самом деле основан на плагинах, но вместо этого используется концепция модуля. Большинство функций apache реализованы в виде модhive, таких как кеш, переписывание, балансировка нагрузки и даже модель streamовой передачи. Это очень модульное программное обеспечение, которое я когда-либо видел.

    А для java Eclipse определенно основан на плагинах. Ядром Eclipse является система модhive OSGI, которая управляет пакетами, другая концепция для плагина. Bundle может предоставлять точки расширения, на которых мы можем создавать модули с меньшими усилиями. Самая сложная вещь в OSGI – ее динамическая характеристика, что означает, что пакеты могут быть установлены или удалены во время выполнения. Нет синдрома остановки-мира!

    Если вы работаете с .Net, наше исследование дало два подхода: сценарий и композиция.

    Scripting

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

    Некоторые варианты, которые мы нашли, заслуживают изучения:

    • IronPython
    • IronRuby
    • JavaScript: Jint , Jurassic и JavaScript .Net – хорошие отправные точки.
    • Script.Net -> этот был первым, кто обратил наше внимание.

    Состав

    Если вы начинаете проект с .Net 4 или выше, вы должны хорошо взглянуть на Managed Extensibility Framework (MEF). Это позволяет расширять функциональность ваших приложений плагином.

    Рамка Managed Extensibility Framework (MEF) представляет собой составной уровень для .NET, который повышает гибкость, удобство обслуживания и возможности тестирования больших приложений. MEF может использоваться для расширения сторонних плагинов или может привносить преимущества плавно подобранной архитектуры в обычные приложения.

    Управляемая надстройка также хорошо читается.

    Поскольку у меня нет достаточного количества комментариев, чтобы оставить комментарий, я отправляю это как ответ. SharpDevelop – это среда разработки для разработки приложений на C # / VB.NET / Boo. Он имеет довольно впечатляющую архитектуру, которая позволяет расширять ее несколькими способами – прямо от новых элементов меню до поддержки разработки для всех новых языков.

    Он использует немного XML-конфигурации, чтобы действовать как слой клея между kernelм среды IDE и реализацией плагина. Он обрабатывает размещение, загрузку и управление версиями плагинов из коробки. Развертывание новых плагинов – это вопрос простого копирования в новом файле конфигурации xml и необходимых assemblyх (DLL) и перезапуске приложения. Подробнее об этом вы можете прочитать в книге «Рассеивание приложения csharp» оригинального автора (ов) – Christian Holm, Mike Krüger, Bernhard Spuida из приложения отсюда . Книга, похоже, не доступна на этом сайте, но я нашел копию, которая все еще может быть здесь.

    Также был найден связанный с этим вопрос

    Вместо того, чтобы повторно изобретать колесо, используйте frameworks в руке. Eclipse и Netbeans поддерживают расширения на основе плагинов. Вы должны работать на Java, хотя.

    Давайте будем гением компьютера.