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

StackOverflow https://stackoverflow.com/questions/323202

Вопрос

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

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

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

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

Обновить

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

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

Другие советы

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

Тот самый теория здесь.

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

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

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

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

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

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

Извлечь:

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

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

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

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

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

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

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

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

SWT - хороший фреймворк для использования и, черт возьми, для расширения.

Реализовать ТВЕРДЫЙ принципы в вашем приложении.

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

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

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

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

5.Принцип инверсии зависимостей: Человек должен полагаться на Абстракции.Не зависите от конкреций

Вопросы о Stackoverflow:

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

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

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

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

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

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

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

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

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

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

Оформить заказ "CAB" - Microsoft Композиция Приложения Строительные блоки Фреймворк.Я думаю, у них тоже есть "веб-версия" этого...

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

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

Или Умный Клиент - Составной Блок приложения пользовательского интерфейса от Microsoft

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

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

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

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

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

Написание сценариев

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

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

Состав

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

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

Платформа управляемых надстроек это тоже хорошее чтение.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top