Plugins 增加插件功能的建议?

Plugins 增加插件功能的建议?,plugins,extensibility,Plugins,Extensibility,是否有将可扩展性功能编程到代码中的一般过程 我想知道在您正在编写的系统中添加扩展类型功能的一般过程是什么,这样就可以通过某种插件API扩展功能,而不必修改系统的核心代码 这样的事情是否倾向于依赖于系统所用的语言,或者是否有一种通用的方法允许这样做 找出你想对插件编写器提出的最低要求。然后创建一个或多个接口,编写器必须实现这些接口,以便代码知道何时何地执行代码 制作一个API,编写者可以使用它来访问代码中的一些功能 您还可以创建编写器必须继承的基类。这将使连接API变得更容易。然后使用某种反射来扫

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

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

这样的事情是否倾向于依赖于系统所用的语言,或者是否有一种通用的方法允许这样做

  • 找出你想对插件编写器提出的最低要求。然后创建一个或多个接口,编写器必须实现这些接口,以便代码知道何时何地执行代码

  • 制作一个API,编写者可以使用它来访问代码中的一些功能

  • 您还可以创建编写器必须继承的基类。这将使连接API变得更容易。然后使用某种反射来扫描目录,并加载您找到的符合需求的类

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

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

    祝您好运。

    这通常是您必须公开的内容,因此是的,它将取决于您的系统所用的语言(尽管通常也可以为其他语言编写包装器)

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

    如果你在C++中,你将使用DLL系统,除非你可能会通过一个对象指针而不是一个Stutt,并且这个对象将实现一个提供功能的接口(完成与结构相同的事情,但不那么丑陋)。对于Java,您可以按需加载类文件,而不是DLL,但基本思想是一样的

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


    如果你想看到一个C++插件系统的好例子,请查看。我已经有一段时间没用了,但它曾经做得很好。我想现在仍然如此。

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


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

    我想让您看看设计模式书,了解这个一般性问题:p

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

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


    在我看来,它还有助于使用动态语言——使在运行时调整核心代码成为可能(在绝对必要时)。我理解Mozilla的扩展性在编写Firefox扩展时是这样的。

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


    如果使用C++,请检查Boost Python库。否则,python附带了可以在C中使用的头文件,并且很好地记录了C/python API。对于Lua来说,文档似乎不太完整,但我可能还没有仔细查看。无论哪种方式,您都可以提供一个相当可靠的脚本平台,而无需进行大量的工作。这仍然不是小事,但它为您提供了一个很好的工作基础。

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

    系统的设计是可扩展的(设计模式、控制反转和其他架构方面)()。而且,至少对我来说,是的,这些模式/技术与平台/语言无关,可以看作是一个“通用过程”

    现在,它们的实现依赖于语言和平台(例如,在C/C++中,您有动态库之类的东西)

    已经开发了几个“框架”来为您提供一个可插拔/可扩展的编程环境,但正如其他一些人所提到的,不要太疯狂地将所有东西都变成可插拔的


    在Java世界中,一个很好的规范是OSGi(),它有几个实现——最好的一个是Equinox()

    是的,我担心它会是这样的答案。不过,好处是,我想这意味着你完全可以控制插件的功能。