如何设计可扩展的软件(插件架构)? [关闭] 如何设计可扩展的软件(插件架构)? [关闭](H

2019-05-12 13:08发布

我需要一些资源来谈谈如何设计你的软件是可扩展的,也就是让其他人可以写插件/插件,将功能添加到它。

您有什么推荐的吗? 任何书籍在那里,讨论的主题?
我宁愿东西是简短而中肯; 有些理论和一堆的具体例子。

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

出于同样的原因,我不喜欢用别人建立一个框架(除非该框架是不是非常高的水平,即不隐藏太多 )做到这一点,此刻我只想教育自己的学科和实验,以实现它的各种方式。 此外,框架通常假设用户的关于这方面的知识。

UPDATE

我不要求有关OOP或允许继承我的班。 我说的是设计将一个系统,使得它可以通过第三方插件后的部署扩展上部署的应用程序。

例如,记事本+ +有一个插件架构,在那里你可以放在插件文件夹中的.dll文件,并把它添加功能到是不存在,如颜色采摘的应用程序或代码段插入,或许多其他的事情(各种功能)。

Answer 1:

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

下面是实现各种应用程序扩展技术的网站

  • ClearScript -使V8,VBScript和JScript提供给.NET应用程序
  • CS-Script -使用的C#脚本引擎
  • 使用C#插件体系结构
  • Opinio插件架构
  • 在Eclipse插件体系结构的注意事项
  • 插件架构框架入门
  • 壁虎的插件架构
  • Fungimol插件架构


Answer 2:

OSGI是一个技术框架,允许你所追求的一个很好的实际例子。

该理论是在这里 。

的(免费!)书是有 。

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

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

什么是OSGI呢?

其中的一个模块的主要功能是作为部署的单位......的东西,我们可以建立或下载并安装扩展我们的应用程序的功能。

你会发现在这里很好的介绍 ,对服务的核心概念(这是关系到你的问题,并解释了围绕服务的一些问题,可扩展性关键部件)。

提取:

为什么服务,那么如此重要,如果这么多的应用程序无需他们建? 好了,服务是最有名的方式相互分离软件组件。

一个服务的最重要的方面是因为他们与对象的实例工作,而不是与类名,他们显著减少类装入问题。 由供应商,而不是消费者创建的实例。 复杂性的降低是相当令人惊讶

不仅服务最小化的配置,他们也显著减少共享包的数量。



Answer 3:

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

  1. 你的软件的组件必须暴露了很多自己的,这样他们就可以被重用
  2. 你的软件的组件必须暴露很少自己,这样他们就可以被重用

说明:为了鼓励代码重用,你应该能够扩展现有的类和调用它们的方法。 这是不可能的,当方法被声明为“私有”和类是“最终”(而不能扩展)。 因此,要达到这个目标,一切都应该是公开和访问。 没有私人数据或方法。

当你发布你的软件的第二个版本,你会发现很多的版本1的想法是完全错误的。 您需要更改很多接口或代码,方法名,删除方法,打破了API。 如果你这样做,很多人会敬而远之。 因此,为了能够发展你的软件,组件不得公开任何不是绝对必要的 - 在代码重用的成本。

例如:我想观察的SWT StyledText光标(脱字符号)的位置。 插入符号是不是意味着要延长。 如果你这样做,你会发现代码中包含检查,如“是这个类在包org.eclipse.swt”和很多的方法私人和最终和诸如此类的东西。 我只好出SWT的复制大约28个班到我的项目,因为一切都被锁定只是为了实现此功能。

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



Answer 4:

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

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

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

3.里氏替换原则:在一个程序中的对象应该是可替换他们的亚型的情况下,不改变该程序的正确性

4.接口隔离原则:很多客户特定接口比一个通用接口更好

5.依赖倒置原则: 一要依赖于抽象 。 不依赖于结核

计算器的问题:

单一职责原则的实施例

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

什么是里氏替换原则?

接口隔离Principle-计划到接口

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



Answer 5:

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



Answer 6:

那么这取决于语言。

  • 在C / C ++我敢肯定有一个LoadLibrary函数,可以让你在运行时打开一个库,并调用它的导出函数。 这通常是它是如何在C / C ++完成。
  • 在.NET中,有反思,这是提供类似(但更广泛的)给LoadLibrary。 也有建在像托管扩展框架,或Mono.Addins思考,做最繁重的工作已经为你的整个库。
  • 在Java中,也有反思。 还有就是这是在像Eclipse IIRC的东西所用的JPF(Java插件框架)。

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



Answer 7:

文章写作基于插件的应用程序清楚地解释了使用一个非常简单的例子,该架构的各个部分的责任; 源代码被提供(VB.Net)。 我发现它在理解基本概念,非常有帮助。



Answer 8:

结帐“CAB” -微软的复合应用积木框架 。 我认为他们已经得到了一个“网络版”太...



Answer 9:

我刚开始开发智能客户端应用程序。 这是我正在考虑两种选择。

使用微软的System.AddIn命名空间。 看起来非常有前途,但它可能是我们的最终解决方案有一点复杂。

或智能客户端- 复合UI应用程序块从微软

最近,我看了服用两种成分综合UI应用程序块和System.AddIn命名空间来建立自己的。 由于源代码可用于CAB很容易扩展。 我认为我们的端到端的解决方案将是一个轻型版本的CAB的,definatly使用Unity应用程序块



Answer 10:

插件架构正在成为它的可扩展性和灵活性,因此很受欢迎。

对于C ++,Apache的httpd服务实际上是基于插件的,但模块的概念来代替。 大部分的阿帕奇功能实现模块,诸如高速缓存,重写,负载均衡,甚至线程模型。 这是我见过非常模块化的软件。

和Java,Eclipse是绝对基于插件的。 Eclipse中的核心是一个OSGI模块系统,该系统管理束,另一概念插件。 包可以提供上,我们可以建立以较少的努力模块的扩展点。 在OSGI最复杂的是它的动态特性,这意味着束可以安装或在运行时卸载。 没有停止在世界任何症状多!



Answer 11:

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

脚本

你延长你的类可以通过使用脚本编排他们做的功能。 这意味着暴露什么是你最喜欢的.NET语言的动态语言编译。

我们发现了一些选项值得探讨:

  • IronPython的
  • IronRuby的
  • JavaScript的: Jint , 侏罗纪和JavaScript的净是很好的出发点。
  • Script.Net - >这个是第一个打电话给我们的注意。

组成

如果您在.NET 4或以上启动一个项目,你必须在托管扩展框架(MEF)好好看看。 它可以让你在一个插件的方式扩展您的应用程序的功能。

托管扩展框架(MEF)是用于.NET的组合物层,可以改进大型应用的灵活性,可维护性和可测试性。 MEF可用于第三方插件的可扩展性,或者它可以带来一个松散耦合的插件式架构的优势,以常规应用。

托管加载框架也是一个很好看的。

  • MSDN: http://msdn.microsoft.com/en-us/library/dd460648.aspx
  • Codeplex上: http://mef.codeplex.com/


Answer 12:

因为我没有足够的代表处点发表评论,我张贴此作为一个答案。 SharpDevelop的是发展中国家在C#/ VB.NET /嘘应用程序的IDE。 它有一个令人印象深刻的建筑,使自己在许多方面进行扩展 - 从右侧新的菜单项为全新的语言发展的支持。

它使用一个位XML配置以充当IDE的核心和插件之间执行一个胶合层。 它处理定位,加载和插件版本的开箱。 部署新的插件是物质的简单复制新的XML配置文件中所要求的组件(DLL)和重新启动应用程序。 你可以阅读的书“解剖一个csharp的应用”,由原作者(S)更在此-基督教霍尔姆,迈克·克鲁格,从应用的伯恩哈德Spuida 这里 。 这本书似乎没有可在该网站上,但我发现了一个副本可能仍然是各地这里

还发现了一个相关的问题在这里



Answer 13:

而不是重新发明轮子,用框架在手。 Eclipse和Netbeans的都支持基于插件的扩展。 你必须用Java工作,虽然。



文章来源: How to design extensible software (plugin architecture)? [closed]