78

我需要一些资源来讨论如何将您的软件设计为可扩展的,即,以便其他人可以编写附加组件/插件来为其添加功能。

你有什么建议吗?有没有讨论这个主题的书?
我更喜欢简明扼要的东西;一点理论和一堆具体的例子。

我不是针对特定的语言,我希望能够理解核心思想,以便我可以用任何语言实现它。

出于同样的原因,我不喜欢使用别人构建的框架(除非框架不是很高级,即没有隐藏太多),目前我只想自学主题并尝试各种方法来实现它。另外,一个框架通常假设用户对主题的了解。

更新

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

例如,Notepad++ 有一个插件架构,您可以在其中将 .dll 文件放置在 plugins 文件夹中,并为应用程序添加不存在的功能,例如颜色选择、片段插入或许多其他功能(广泛的功能)。

4

13 回答 13

25

如果我们谈论的是 .NET,请尝试在 CodeProject 上使用 VBScript 编写 .NET 应用程序脚本。那里有很多具体的例子。

以下是实施各种应用程序扩展技术的站点

于 2008-11-27T08:24:38.350 回答
15

OSGI是一个技术框架的一个很好的实际例子,它允许你做你想做的事情。

理论就在这里

免费!)书在那里

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

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

OSGI 有什么用?

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

你会在这里找到一个很好的介绍,关于服务的中心概念(这与你的问题有关,它解释了围绕服务的一些问题,可扩展性的关键组件)。

提炼:

如果没有服务可以构建如此多的应用程序,为什么服务如此重要?好吧,服务是将软件组件彼此分离的最知名方式。

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

服务不仅最大限度地减少了配置,而且还显着减少了共享包的数量。

于 2008-11-27T08:24:04.403 回答
6

在您的应用程序中实施SOLID原则。

1.单一职责原则:一个类应该只有单一职责(即软件规范中只有一个潜在的变化应该能够影响类的规范

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

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

4、接口隔离原则:很多客户端专用接口优于一个通用接口

5. 依赖倒置原则: 应该依赖于抽象。不要依赖结石

堆栈溢出问题:

单一职责原则示例

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

什么是里氏替换原则?

接口隔离原则——程序到接口

什么是依赖倒置原则,为什么它很重要?

于 2016-02-13T13:17:31.630 回答
4

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

  1. 你的软件的组件必须暴露很多自己,所以它们可以被重用
  2. 你的软件的组件必须很少暴露自己,所以它们可以被重用

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

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

示例:我想观察 SWT StyledText 中光标(插入符号)的位置。插入符号并不意味着扩展。如果你这样做,你会发现代码包含诸如“这个类在包 org.eclipse.swt 中”之类的检查,并且很多方法是私有的和最终的等等。我不得不从 SWT 中复制大约 28 个类到我的项目中来实现这个功能,因为一切都被锁定了。

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

于 2008-11-27T09:27:33.247 回答
3

当然还有著名的开放封闭原则 - http://en.wikipedia.org/wiki/Open/closed_principle

于 2008-11-27T08:52:05.173 回答
2

好吧,这取决于语言。

  • 在 C/C++ 中,我很确定有一个 loadlibrary 函数允许您在运行时打开一个库并调用它的导出函数。这通常是在 C/C++ 中完成的。
  • 在 .NET 中,有 Reflection,它提供了与 loadlibrary 类似(但更广泛)的功能。还有基于反射构建的完整库,例如托管扩展框架或 Mono.Addins,它们已经为您完成了大部分繁重的工作。
  • 在 Java 中,还有反射。还有用于 Eclipse IIRC 之类的 JPF(Java 插件框架)。

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

于 2010-01-25T21:15:39.117 回答
1

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

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

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

于 2009-05-14T04:21:24.077 回答
1

文章编写基于插件的应用程序通过一个非常简单的示例清楚地解释了架构各个部分的职责;提供源代码(VB.Net)。我发现它对理解基本概念很有帮助。

于 2010-01-25T21:10:02.590 回答
1

由于我没有足够的代表点来发表评论,因此我将其发布为答案。SharpDevelop 是用于在 C#/VB.NET/Boo 中开发应用程序的 IDE。它有一个令人印象深刻的架构,允许以多种方式扩展自身——从新的菜单项到对全新语言的开发支持。

它使用一些 XML 配置来充当 IDE 核心和插件实现之间的粘合层。它开箱即用地处理插件的定位、加载和版本控制。部署新插件只需复制新的 xml 配置文件和所需的程序集 (DLL) 并重新启动应用程序即可。您可以在原作者 - Christian Holm、Mike Krüger、Bernhard Spuida 的“剖析 csharp 应用程序”一书中阅读更多关于此应用程序的信息。这本书似乎在那个网站上没有,但我找到了一本可能还在附近的副本

还在这里找到了一个相关的问题

于 2016-06-15T23:41:45.673 回答
0

结帐“CAB” - Microsoft 的组合应用程序构建块框架。我认为他们也有一个“网络版本”......

于 2008-11-27T08:41:53.337 回答
0

我刚刚开始开发一个智能客户端应用程序。这是我正在考虑的两个选项。

使用 Microsoft 的System.AddIn命名空间。看起来很有希望,但是对于我们的最终解决方案来说可能有点复杂。

或者来自 Microsoft的 Smart Client - Composite UI Application Block

最近,我研究了使用 Composite UI Application Block 和 System.AddIn 命名空间的组件来构建我自己的。由于 CAB 有源代码,因此很容易扩展。我认为我们的最终解决方案将是 CAB 的轻量级版本,肯定会使用Unity 应用程序块

于 2008-11-27T08:43:26.017 回答
0

如果您使用 .Net,我们的研究产生了两种方法:脚本和组合。

脚本

您可以通过使用脚本编排类来扩展类的功能。这意味着以动态语言公开以您最喜欢的 .Net 语言编译的内容。

我们发现一些值得探索的选项:

作品

如果您使用 .Net 4 或更高版本启动项目,则必须仔细查看 Managed Extensibility Framework (MEF)。它允许您以插件方式扩展应用程序的功能。

托管可扩展性框架 (MEF) 是 .NET 的组合层,可提高大型应用程序的灵活性、可维护性和可测试性。MEF 可用于第三方插件扩展,或者它可以为常规应用程序带来松散耦合的插件式架构的好处。

Managed Add-in Framework也是一本不错的读物。

于 2013-02-26T13:11:39.703 回答
-7

与其重新发明轮子,不如使用现有的框架。Eclipse 和 Netbeans 都支持基于插件的扩展。你必须在 Java 中工作。

于 2008-11-27T08:38:34.297 回答