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

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

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

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

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

UPDATE

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

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

Ответ 1

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

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

Ответ 2

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

Теория (бесплатная!) книга есть.

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

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

Что такое OSGI для?

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

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

Extract:

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

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

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

Ответ 3

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

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

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

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

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

SWT - это хорошая структура для использования и ад для расширения.

Ответ 4

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

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

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

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

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

5. Принцип инверсии зависимостей:. Необходимо учитывать абстракции. Не зависеть от конкреций

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

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

Является ли принцип Open/Closed хорошим?

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

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

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

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

Или Smart Client - Компонентный блок пользовательского интерфейса от Microsoft

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

Ответ 10

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

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

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

Ответ 11

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

Сценарии

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

Некоторые параметры, которые мы обнаружили, стоит изучить:

Состав

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

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

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

Ответ 12

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

Он использует немного XML-конфигурации, чтобы действовать как слой клея между ядром среды IDE и реализацией плагина. Он обрабатывает размещение, загрузку и управление версиями плагинов из коробки. Развертывание новых плагинов - это вопрос простого копирования в новом файле конфигурации xml и необходимых сборках (DLL) и перезапуске приложения. Вы можете прочитать больше об этом в книге "Рассеивание приложения csharp" от оригинального автора (ов) - Христиан Холм, Майк Крюгер, Бернхард Спайда из приложения . Книга, похоже, не доступна на этом сайте, но я нашел копию, которая все еще может быть здесь

Также найден связанный с ним вопрос здесь

Ответ 13

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