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


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

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

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

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

обновление

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

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

13 65

13 ответов:

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

The теории.

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

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

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

для чего нужен OSGI ?

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

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

выдержка:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Stackoverflow вопросы:

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

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

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

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

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

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

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

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

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

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

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

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

или умный клиент -составной блок Приложения UI из Microsoft

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

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

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

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

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

Scripting

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

некоторые варианты мы нашли стоит исследуя:

состав

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

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

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

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

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

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

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