2008-11-27 7 views
64

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

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

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

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

UPDATE

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

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

+0

Я думаю, вы обнаружите, что большинство подключаемых модулей среды обеспечивают базовые классы для использования в письменной форме подключаемого модуля. Ваш настраиваемый сторонний плагин будет основываться на базовом классе и расширять его функциональность «plug-in standard». – Kieveli 2008-11-27 20:19:14

+3

Вы обнаружите, что расширяемая природа программного обеспечения, такого как Firefox и Notepad ++, исходит из его корней дизайна OO. Тот же принцип, который расширяет ваши классы, поможет сделать ваше общее программное обеспечение расширяемым. – orokusaki 2010-01-25 21:14:25

ответ

24

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

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

13

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

theory is here.

(free!) book is there.

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

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

What is OSGI for ?

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

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

Экстракт:

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

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

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

+0

Что такое osgi? Я посмотрел на сайт, но я не понимаю, как это связано с моим вопросом! – hasen 2008-11-27 08:51:39

+2

Посмотрите на это http://stackoverflow.com/questions/106222/what-does-osgi-solve – 2009-05-14 04:24:49

-7

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

0

Оформить заказ «CAB» - Microsoft Состав Применение Строительные блоки Рамки. Я думаю, что у них есть «веб-версия» этого тоже ...

0

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

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

Или Smart Client - Composite UI Application Block от Microsoft

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

4

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

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

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

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

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

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

0

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

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

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

1

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

2

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

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

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

0

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

Scripting

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

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

Состав

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

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

Managed Add-in Framework также хорошо читается.

3

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

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

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

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

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

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

StackOverflow вопросы:

Example of Single Responsibility Principle

Is the Open/Closed Principle a good idea?

What is the Liskov Substitution Principle?

Interface Segregation Principle- Program to an interface

What is the Dependency Inversion Principle and why is it important?

0

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

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

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