添加插件功能的建议?

时间:2008-08-11 19:48:52

标签: plugins extensibility

是否有将可扩展性功能编程到代码中的一般过程?

我想知道将扩展类型功能添加到您正在编写的系统的一般过程是什么,以便可以通过某种插件API扩展功能,而不必修改系统的核心代码。

这些事情是否会依赖于编写系统的语言,还是有一种通用的方法来实现这一目标?

6 个答案:

答案 0 :(得分:4)

我过去曾为插件使用基于事件的API。您可以通过调度事件并提供对应用程序状态的访问来插入插件的挂钩。

例如,如果您正在编写博客应用程序,则可能需要在将新帖子保存到数据库之前引发事件,并将插件HTML提供给插件以根据需要进行更改。

答案 1 :(得分:3)

这通常是你必须暴露自己的东西,所以是的,它将取决于你的系统编写的语言(尽管通常也可以为其他语言编写包装器。)

例如,如果你有一个用C编写的程序,对于Windows,插件将作为DLL编写给你的程序。在运行时,您将手动加载这些DLL,并向它们公开一些接口。例如,DLL可能会暴露gimme_the_interface()函数,该函数可以接受填充了函数指针的结构。这些函数指针允许DLL进行调用,注册回调等等。

如果您使用的是C ++,那么您将使用DLL系统,除非您可能传递对象指针而不是结构,并且该对象将实现一个提供功能的接口(完成与结构相同的操作,但更少丑陋)。对于Java,您可以按需加载类文件而不是DLL,但基本思想是相同的。

在所有情况下,您都需要在代码和插件之间定义标准接口,以便初始化插件,以便插件可以与您进行交互。

P.S。如果您想看一个C ++插件系统的好例子,请查看foobar2000 SDK。我已经有很长一段时间没用过它了,但过去做得还不错。我认为它仍然是。

答案 2 :(得分:2)

我认为你的问题有两个方面:

可扩展系统的设计(设计模式,控制反演和其他建筑方面)(http://www.martinfowler.com/articles/injection.html)。而且,至少对我来说,是的,这些模式/技术是独立于平台/语言的,可以被视为“一般程序”。

现在,他们的实现是语言和平台依赖(例如在C / C ++中你有动态库的东西等)。

已经开发了几个“框架”来为您提供一个编程环境,为您提供可插拔性/可扩展性,但正如其他人提到的那样,不要太疯狂使一切都可插入。

在Java世界中,一个好的规范是OSGi(http://en.wikipedia.org/wiki/OSGi),有几个实现最好的一个IMHO是Equinox(http://www.eclipse.org/equinox/

答案 3 :(得分:2)

我很想指出这个通用问题的设计模式书:p

说真的,我认为答案是否定的。你不能在默认情况下编写可扩展的代码,它既难以编写/扩展又非常低效(Mozilla以非常可扩展的思想开始,到处使用XPCOM,现在他们意识到这是一个错误并开始删除它它没有任何意义)。

有意义的是识别可以有意义地扩展的系统部分,并为这些情况支持适当的API(例如编辑器中的语言支持插件)。您将使用相关模式,但具体实现取决于您的平台/语言选择。

IMO,它也有助于使用动态语言 - 可以在运行时调整核心代码(绝对必要时)。我很欣赏Mozilla在编写Firefox扩展时的可扩展性。

答案 4 :(得分:1)

如果您使用的是C或C ++等编译语言,那么通过脚本语言查看插件支持可能是个好主意。 Python和Lua都是用于编写大量应用程序脚本的优秀语言(Civ4和blender使用Python,Supreme Commander使用Lua等)。

如果您使用的是C ++,请查看boost python库。否则,python附带了可以在C中使用的头文件,并且可以很好地记录C / python API。 Lua的文档似乎不太完整,但我可能看起来不够努力。无论哪种方式,您都可以提供相当可靠的脚本平台而无需大量工作。它仍然不是微不足道的,但它为您提供了一个非常好的工作基础。

答案 5 :(得分:1)

  1. 找出您想要在插件编写器上添加的最低要求。然后创建一个或多个编写器必须为您的代码实现的接口,以了解执行代码的时间和位置。

  2. 创建一个API,编写者可以使用它来访问代码中的某些功能。

  3. 您还可以创建作者必须继承的基类。这将使API的连接更容易。然后使用某种反射来扫描目录,并加载您找到的符合您要求的类。

    有些人还为他们的系统制作脚本语言,或者为现有语言的子集实现解释器。这也是一条可行的途径。

    底线是:当您获得要加载的代码时,只有您的想象力才能阻止您 祝你好运。