【问题标题】:Suggestions for Adding Plugin Capability?添加插件功能的建议?
【发布时间】:2008-08-11 19:48:52
【问题描述】:

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

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

这些事情是否往往取决于编写系统所用的语言,或者是否有允许这种情况的通用方法?

【问题讨论】:

    标签: plugins extensibility


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      附:如果您想查看 C++ 插件系统的一个很好的示例,请查看foobar2000 SDK。好久没用了,不过用起来确实不错。我认为它仍然是。

      【讨论】:

      • 是的,我担心会是这样的答案。不过,好处是这意味着你可以完全控制我猜插件可以做什么。
      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        现在,它们的实现取决于语言和平台(例如,在 C/C++ 中,你有动态库的东西等)

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

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

        【讨论】:

          【解决方案5】:
          1. 找出您希望对插件编写器提出的最低要求。然后制作一个或多个接口,编写者必须为您的代码实现一个或多个接口,以了解何时何地执行代码。

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

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

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

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

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-08-08
              • 1970-01-01
              • 2011-02-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多