Предложения по добавлению возможностей плагинов?

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

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

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

11.08.2008 19:48:52
6 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

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

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

3
11.08.2008 20:08:36
Да, я боялся, что это будет такой ответ. Тем не менее, плюс в том, что это означает, что у вас есть полный контроль над тем, что плагины могут делать, я думаю.
kaybenleroll 15.09.2008 22:25:35
  1. Узнайте, какие минимальные требования вы хотите поставить на автора плагина. Затем создайте один или несколько интерфейсов, которые автор должен реализовать, чтобы ваш код знал, когда и где выполнять код.

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

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

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

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

1
11.08.2008 19:59:34

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

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

4
11.08.2008 20:06:53

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

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

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

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

2
11.08.2008 20:15:06

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

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

1
11.08.2008 20:40:44

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

Проект системы должен быть расширяемым (шаблоны проектирования, инверсия управления и другие архитектурные аспекты) ( 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
18.09.2008 20:06:35