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

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

这些事情是否往往取决于系统编写的语言,或者是否有一个通用的方法可以实现这一点?

有帮助吗?

解决方案

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

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

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

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

附:如果您想查看 C++ 插件系统的好示例,请查看 foob​​ar2000 SDK. 。我已经有一段时间没有使用它了,但它曾经做得非常好。我想现在仍然如此。

其他提示

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

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

我很想向您推荐《设计模式》一书来解决这个通用问题:p

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

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

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

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

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

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

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

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

  1. 了解您对插件编写者的最低要求。然后创建一个或多个接口,编写者必须为您的代码实现这些接口,以便知道何时何地执行代码。

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

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top