有关增加插件功能的建议?

时间:2020-03-05 18:39:01  来源:igfitidea点击:

是否有用于将扩展功能编程到代码中的通用过程?

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

这样的事情是否倾向于取决于系统所使用的语言,或者是否有通用的方法可以做到这一点?

解决方案

回答

  • 找出我们要放在插件编写器上的最低要求。然后创建一个或者多个编写者必须实现的接口,以使代码知道何时何地执行代码。
  • 使API成为编写者可以用来访问代码中某些功能的API。

我们还可以使作者必须继承一个基类。这将使API的连接更加容易。然后使用某种反射方式扫描目录,并加载找到的符合我们要求的类。

有些人还为其系统编写脚本语言,或者为现有语言的子集实现解释器。这也是一条可行的路线。

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

回答

通常,这是什么?我们必须公开自己,所以,是的,这将取决于系统所使用的语言(尽管通常也可以为其他语言编写包装器)。

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

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

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

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

回答

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

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

回答

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

说真的,我认为答案是否定的。默认情况下,我们无法编写可扩展的代码,很难编写/扩展,而且效率极低(Mozilla最初的想法是非常可扩展,在各处都使用XPCOM,现在他们意识到这是一个错误,因此开始删除它没有意义的地方)。

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

IMO,它还有助于使用动态语言,从而有可能在运行时调整核心代码(在绝对必要时)。我很感谢Mozilla的可扩展性在编写Firefox扩展时能以这种方式工作。

回答

如果我们使用的是C或者C ++之类的编译语言,则最好通过脚本语言查看插件支持。 Python和Lua都是出色的语言,可用于编写大量应用程序的脚本(Civ4和Blender使用Python,Supreme Commander使用Lua等)。

如果我们使用的是C ++,请查看boost python库。否则,python附带了可以在C中使用的标头,并且在记录C / python API方面做得相当好。对于Lua来说,文档似乎还不完整,但是我可能看起来不够努力。无论哪种方式,我们都可以提供一个相当可靠的脚本平台,而无需进行大量工作。它仍然不平凡,但是它为我们提供了一个很好的基础。

回答

我认为问题有两个方面:

系统的设计是可扩展的(设计模式,控制反转和其他体系结构方面)(http://www.martinfowler.com/articles/injection.html)。而且,至少对我而言,是的,这些模式/技术是平台/语言独立的,可以被视为"通用程序"。

现在,它们的实现是语言和平台的依存关系(例如,在C / C ++中,我们拥有动态库内容,等等)。

已经开发了多个"框架",为我们提供了一个可提供可插入性/可扩展性的编程环境,但是正如其他人所提到的那样,不要将所有东西都插入即可。

在Java世界中,看起来不错的规范是OSGi(http://en.wikipedia.org/wiki/OSGi),它具有多种实现,最好的IMHO是Equinox(http://www.eclipse.org/equinox/)