添加插件功能的建议?

16

在编写代码时,是否有一般性的编程程序来增加可扩展性的能力?

我想知道向系统中添加扩展型功能的常规过程是什么,以便可以通过某种插件API扩展功能,而不必修改系统核心代码。

这些功能通常是否依赖于系统所使用的语言,还是存在一般性的允许扩展的方法?

6个回答

4

我过去曾经使用基于事件的API来编写插件。你可以通过分派事件并提供对应用程序状态的访问来为插件插入钩子。

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


3
这通常是需要自己暴露的,因此它将依赖于系统所编写的语言(尽管通常也可以为其他语言编写包装器)。
例如,如果您有一个用C编写的Windows程序,则插件将作为DLL为该程序编写。在运行时,您将手动加载这些DLL,并向其公开某些接口。例如,DLL可能会公开一个名为gimme_the_interface()的函数,该函数可以接受填充了函数指针的结构。这些函数指针将允许DLL进行调用、注册回调等操作。
如果您使用C ++,则将使用DLL系统,但您可能会传递对象指针而不是结构,并且该对象将实现提供功能的接口(实现与结构相同,但更少丑陋)。对于Java,您将按需加载类文件而不是DLL,但基本思想将是相同的。
在所有情况下,您都需要定义代码和插件之间的标准接口,以便可以初始化插件,并使插件能够与您交互。
附:如果您想看到一个很好的C ++插件系统示例,请查看foobar2000 SDK。我已经有一段时间没有使用它了,但它曾经做得非常好。我认为它现在仍然是这样。

是的,我就怕会得到这样的答案。不过好处是,这意味着你可以完全控制插件的功能,我想。 - kaybenleroll

2
我认为你的问题有两个方面:
1.设计可扩展的系统(设计模式、控制反转和其他架构方面) (http://www.martinfowler.com/articles/injection.html)。至少对我来说,这些模式/技术是与平台/语言无关的,并且可以被视为一种“通用程序”。
2.它们的实现是语言和平台相关的(例如,在C/C++中,你有动态库等)。
已经开发了几个“框架”,为你提供了一个编程环境,以提供可插拔性/可扩展性,但正如其他人所提到的,不要过于疯狂地使所有东西都可插拔。
在Java世界中,一个好的规范是OSGi(http://en.wikipedia.org/wiki/OSGi),有几个实现,最好的一个是Equinox(http://www.eclipse.org/equinox/)。

2
我很想为这个通用问题指出设计模式书籍:p 但是,认真地说,我的答案是否定的。你不能通过默认方式编写可扩展的代码,因为这样会很难编写/扩展,而且效率非常低(Mozilla最初的想法是非常可扩展的,到处使用XPCOM,现在他们意识到这是一个错误,并开始在不合理的地方删除它)。
有意义的做法是识别系统中可以有意义地扩展的部分,并为这些情况支持适当的API(例如编辑器中的语言支持插件)。你可以使用相关的模式,但具体的实现取决于你选择的平台/语言。
在我看来,使用动态语言也有帮助——可以在运行时调整核心代码(绝对必要时)。在编写Firefox扩展时,我欣赏Mozilla的可扩展性工作方式。

1
  1. 确定您想要在插件编写者上放置的最低要求。然后创建一个或多个接口,编写者必须实现这些接口,以便您的代码知道何时何地执行代码。

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

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

有些人还为其系统制作脚本语言,或者实现现有语言子集的解释器。这也是一种可能的路线。

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


1

如果你使用的是像C或C++这样的编译语言,那么通过脚本语言提供插件支持可能是个好主意。Python和Lua都是非常优秀的脚本语言,被用来编写大量应用程序(如Civ4和Blender使用Python,Supreme Commander使用Lua等)。

如果你正在使用C ++,可以查看Boost Python库。否则,Python附带了可以在C中使用的头文件,并且对C / Python API进行了相当完善的文档记录。我发现Lua的文档似乎不是很完整,但这可能是因为我没有找到正确的方式。无论哪种方式,你都可以提供一个相当稳定的脚本平台,而不需要太多的工作。虽然这仍然不是一件容易的事情,但它为你提供了一个非常好的基础来继续开发。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接