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

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

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

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

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

обновление

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

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

13 ответов



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

на теории.

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

расширяемость и возможность написания плагина должны иметь дело с жизненный цикл ИТ-услуги

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

для чего OSGI ?

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

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

выдержка:

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

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

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


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

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

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

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

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

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


конечно, есть знаменитый открытый закрытый принцип -http://en.wikipedia.org/wiki/Open/closed_principle


реализовать твердый принципы в приложении.

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

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

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

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

5. Принцип инверсии зависимостей: надо Зависит от абстракций. Не зависите от конкреций

вопросы Stackoverflow:

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

является ли принцип открытия/закрытия хорошей идеей?

что такое принцип подстановки Лискова?

принцип сегрегации интерфейса-программа к интерфейсу

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


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

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

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


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


проверка "такси" - Microsoft состав приложения строительные блоки Framework. Я думаю, что у них есть "веб-версия" тоже...


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

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

или умный клиент -составной блок приложений пользовательского интерфейса из Microsoft

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


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

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

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


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

сценарии

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

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

состав

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

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

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


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

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

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


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