Предложения по добавлению возможностей плагинов? - PullRequest
15 голосов
/ 11 августа 2008

Существует ли общая процедура программирования возможностей расширения в вашем коде?

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

Как правило, такие вещи зависят от языка, на котором написана система, или существует общий метод для этого?

Ответы [ 6 ]

4 голосов
/ 12 августа 2008

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

Например, если вы писали приложение для ведения блога, вы можете вызвать событие непосредственно перед тем, как новое сообщение будет сохранено в базе данных, и предоставить HTML-код плагину для изменения по мере необходимости.

3 голосов
/ 12 августа 2008

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

Если, например, у вас есть программа, написанная на C, для Windows, плагины будут написаны для вашей программы как DLL. Во время выполнения вы должны вручную загрузить эти библиотеки DLL и предоставить им некоторый интерфейс. Например, библиотеки DLL могут предоставлять функцию gimme_the_interface(), которая может принимать структуру, заполненную указателями на функции. Эти указатели функций позволят DLL выполнять вызовы, регистрировать обратные вызовы и т. Д.

Если бы вы были в C ++, вы бы использовали систему DLL, за исключением того, что вы, вероятно, передали бы указатель объекта вместо структуры, а объект реализовал бы интерфейс, обеспечивающий функциональность (выполняя ту же функцию, что и структура, но менее некрасиво). Для Java вы бы загружали файлы классов по требованию вместо DLL, но основная идея была бы такой же.

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

P.S. Если вы хотите увидеть хороший пример системы плагинов C ++, посмотрите foobar2000 SDK . Я давно этим не пользовался, но раньше это было действительно хорошо сделано. Я предполагаю, что это все еще.

2 голосов
/ 19 сентября 2008

Я думаю, что у вашего вопроса есть два аспекта:

Дизайн системы должен быть расширяемым (шаблоны проектирования, инверсия управления и другие архитектурные аспекты) (http://www.martinfowler.com/articles/injection.html). И, по крайней мере для меня, да, эти шаблоны / методы не зависят от платформы / языка и могут рассматриваться как «общая процедура».

Теперь их реализация зависит от языка и платформы (например, в C / C ++ у вас есть динамическая библиотека и т. Д.)

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

В мире Java хорошей спецификацией является OSGi (http://en.wikipedia.org/wiki/OSGi) с несколькими реализациями, лучшая из которых IMHO - Equinox (http://www.eclipse.org/equinox/)

)
2 голосов
/ 12 августа 2008

Я испытываю желание указать вам книгу «Шаблоны проектирования» для этого общего вопроса: p

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

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

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

1 голос
/ 12 августа 2008

Если вы используете скомпилированный язык, такой как C или C ++, было бы неплохо взглянуть на поддержку плагинов через языки сценариев. И Python, и Lua - отличные языки, которые используются для написания сценариев для большого числа приложений (Civ4 и блендер используют Python, Supreme Commander использует Lua и т. Д.).

Если вы используете C ++, проверьте библиотеку Boost Python. В противном случае, Python поставляется с заголовками, которые можно использовать в C, и делает довольно хорошую работу по документированию C / python API. Документация для Луа казалась менее полной, но, возможно, я не выглядел достаточно усердно. В любом случае, вы можете предложить довольно солидную скриптовую платформу без огромного количества работы. Это все еще не тривиально, но дает вам очень хорошую базу для работы.

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

  2. Создайте API, который писатель может использовать для доступа к некоторым функциям в вашем коде.

Вы также можете создать базовый класс, который должен наследовать писатель. Это облегчит подключение API. Затем используйте какое-то отражение для сканирования каталога и загрузите найденные классы, которые соответствуют вашим требованиям.

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

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

...