如何设计可扩展软件(插件架构) ?

我需要一些资源来讨论如何设计可扩展的软件,也就是说,让其他人可以编写添加功能的插件/插件。

你有什么推荐吗? 有没有讨论这个话题的书?
我更喜欢简明扼要的东西,一点理论和一些具体的例子。

我不是针对特定的语言,我希望能够理解其核心思想,这样我就可以在任何语言中实现它。

出于同样的原因,我不喜欢使用其他人构建的框架(除非这个框架不是很高级,也就是说不会隐藏很多 也是) ,目前我只想在这个主题上教育自己,并尝试各种实现它的方法。另外,框架通常假设用户对主题有所了解。

更新

我不会询问 OOP 或允许继承我的类。我所说的是设计一个将部署在系统上的应用程序,以便在部署后可以由第三方附加组件对其进行扩展。

例如,Notepad + + 有一个插件体系结构,您可以在其中放置一个。在插件文件夹中添加 dll 文件,并向应用程序添加不存在的功能,例如颜色选择、代码片段插入或许多其他功能(功能范围很广)。

29419 次浏览

OSGI 是一个很好的技术框架的实际例子,它允许您完成所需的任务。

理论在这里.

(免费!)书在那里.

扩展性和编写插件的能力必须能够处理 服务生命周期

  • 即时添加/删除服务/插件
  • 管理服务之间的依赖关系
  • 管理服务的状态(声明、安装、启动、停止、 ...)

OSGI 是用来做什么的?

模块的主要功能之一是作为部署单元... 我们可以构建或下载并安装这些模块来扩展应用程序的功能。

您将在 服务的中心概念上找到一个 很好的介绍(它与您的问题相关,并解释了与服务相关的一些问题,服务是可扩展性的关键组件)。

摘录:

如果可以构建如此多的应用程序而不需要服务,那么为什么服务如此重要呢?服务是将软件组件彼此分离的最好方法。

服务最重要的一个方面是它们极大地减少了类加载问题,因为它们使用对象的实例,而不是类名。由提供者而不是使用者创建的实例。复杂性的降低是相当令人惊讶的

服务不仅使配置最小化,而且还显著减少了共享包的数量。

与其重新发明轮子,不如使用手边的框架。Eclipse 和 Netbeans 都支持基于插件的扩展。不过你得用 Java 工作。

看看“ CAB”-微软的 组合应用程序构建块框架。我想他们也有一个“网络版”..。

我刚刚开始开发一个智能客户端应用程序。

使用微软的 系统名称空间。看起来非常有前途,但是对于我们的最终解决方案可能有点复杂。

或来自 Microsoft 的智能客户端 -复合 UI 应用程序块

最近,我研究了组件复合 UI 应用程序块和系统。构建自己的 AddIn 命名空间。因为 CAB 的源代码是可用的,所以很容易扩展。我认为我们的最终解决方案将是一个轻量级的 CAB 版本,明确使用的 统一应用程序块

当然还有著名的开闭原理—— http://en.wikipedia.org/wiki/Open/closed_principle

你试图达到两个相互竞争的目标:

  1. 软件的组件必须公开它们自己的 很多,这样它们才能被重用
  2. 软件的组件必须公开它们自己的 很少,这样它们才能被重用

说明: 为了鼓励代码重用,您应该能够扩展现有的类并调用它们的方法。当方法被声明为“ private”并且类是“ final”(不能被扩展)时,这是不可能的。所以为了达到这个目标,一切都应该是公开的和可访问的。没有私有数据或方法。

当您发布软件的第二个版本时,您会发现版本1的许多想法是完全错误的。你需要改变很多接口或者你的代码,方法名,删除方法,破坏 API。如果你这么做,很多人会转身离开。因此,为了能够发展您的软件,组件不能公开任何不是绝对必要的东西——代价是代码重用。

示例: 我想在 SWT StyledText 中观察光标(插入符号)的位置。插入符号不是用来扩展的。如果这样做,您会发现代码包含诸如“ is this class in the package org.eclipse.swt”之类的检查,并且许多方法是私有的、最终的等等。为了实现这个特性,我不得不从 SWT 中复制大约28个类到我的项目中,因为所有东西都是锁定的。

SWT 是一个很好的可以使用的框架,也是一个很难扩展的框架。

插件架构因其可扩展性和灵活性而变得非常流行。

对于 c + + ,Apache httpd 服务器实际上是基于插件的,但是使用了模块的概念。大多数 Apache 特性都是以模块的形式实现的,比如缓存、重写、负载平衡,甚至是线程模型。这是我见过的非常模块化的软件。

对于 Java 来说,Eclipse 绝对是基于插件的。Eclipse 的核心是一个管理 bundle 的 OSGI 模块系统,这是插件的另一个概念。Bundle 可以提供扩展点,我们可以在这些扩展点上用较少的工作来构建模块。OSGI 中最复杂的是它的动态特性,这意味着可以在运行时安装或卸载 bundle。再也没有停止世界综合症了!

这取决于语言。

  • 在 C/C + + 中,我非常确定有一个 loadlibrary 函数,它允许您在运行时打开一个库并调用它的导出函数。这是 C/C + + 中的典型做法。
  • 进去。NET,有反射,它提供了类似(但更广泛)的加载库。还有基于反射(比如托管扩展框架或 Mono)构建的整个库。已经为你做了大部分繁重工作的插件。
  • 在 Java 中,也有反射。还有一个 JPF (Java 插件框架) ,用于 Eclipse IIRC 之类的东西。

根据您使用的语言,我可以推荐一些教程/书籍。我希望这能有所帮助。

在应用程序中实现 很可靠原则。

1.单一责任原则: 一个类应该只有一个责任(也就是说,软件规范中只有一个潜在的变更应该能够影响该类的规范

2. 开放/封闭原则: 软件实体... 应该对扩展开放,但对修改关闭

3.Liskov代换原则: 程序中的对象应该可以替换为其子类型的实例,而不改变该程序的正确性

4. 接口隔离原则: 许多特定于客户端的接口比一个通用接口要好

5. 依赖反转原则: 一个人应该依赖于抽象。不要依赖结石

堆栈溢出问题:

单一责任原则实例

开/闭原则是一个好主意吗?

Liskov代换原则是什么?

接口隔离原则-接口程序

依赖反转原则是什么? 为什么重要?

由于我没有足够的代表点数留下评论,我张贴这作为一个答案。SharpDevelopment 是一个用于在 C #/VB.NET/Boo 中开发应用程序的 IDE。它有一个非常令人印象深刻的架构,它允许自己以多种方式进行扩展——从新的菜单项到对全新语言的开发支持。

它使用一些 XML 配置作为 IDE 核心和插件实现之间的粘合层。它处理定位,加载和版本的插件开箱即用。部署新插件只是简单地复制新的 xml 配置文件和所需的程序集(DLL)并重新启动应用程序。您可以在由原作者-Christian Holm,Mike Krüger,Bernhard Spuida 撰写的“剖析 cSharp 应用程序”一书中阅读更多关于这方面的内容。这本书似乎没有在该网站上,但我发现了一个副本,可能仍然围绕 给你

还发现了一个相关的问题 给你