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

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

  •  08-06-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

Меня так и подмывает указать вам на книгу "Шаблоны проектирования" для ответа на этот общий вопрос: p

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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