框架,工具包和库之间有什么区别?
答案 0 :(得分:439)
最重要的区别,实际上定义库与框架之间的区别是Inversion of Control。
这是什么意思?嗯,这意味着当您调用库时,您处于控制之中。但是使用框架,控件反转:框架调用你。 (这被称为好莱坞原则:不要打电话给我们,我们会打电话给你。)这几乎就是框架的定义。如果它没有控制反转,那它就不是一个框架。 (我在看着你,.NET!)
基本上,所有控制流程都已经在框架中,并且只有一堆预定义的白点可以用你的代码填写。
另一方面,库是你可以调用的功能集合。
我不知道术语工具包是否真的定义得很好。只是“套件”这个词似乎暗示了某种模块性,即一组可以选择的独立库。那么,什么使得工具包与一堆独立的库不同?集成:如果你只有一堆独立的库,不能保证它们能很好地协同工作,而工具包中的库设计得很好 - 你只需要不必使用 all < / em>他们。
但这只是我对这个词的解释。与 明确定义的库和框架不同,我不认为 是工具包的广泛接受的定义。
答案 1 :(得分:121)
Martin Fowler在他关于Inversion of Control的文章中讨论了图书馆和框架之间的区别:
控制倒置是其中的关键部分 什么使框架与a不同 图书馆。 图书馆本质上是一个 你可以调用的一组功能, 这些天通常组织成 类。每次通话都会做一些工作 将控制权交还给客户。
框架体现了一些抽象 设计,内置更多行为。 要使用它,您需要插入 你的行为进入了各个地方 框架通过子类化或 通过插入自己的类。的的 框架的代码然后调用您的代码 在这些方面。
总结一下:您的代码调用库但框架调用您的代码。
答案 2 :(得分:59)
关于相关代码的集合有各种各样的术语,它们既有历史的(1994/5年前为本答案的目的)和当前的含义,读者应该知道两者,特别是在阅读经典文本时从历史时代开始计算/编程。
历史上和目前,库都是与特定任务相关的代码集合,或者是在大致相同的抽象级别上运行的一组密切相关的任务。它通常缺乏它自己的任何目的或意图,并且旨在被(消费的)使用并与客户端代码集成以帮助客户端代码执行它的任务。
历史上,工具包是一个更集中的库,具有明确的特定目的。目前,该术语已经失宠,并且几乎完全(对于本作者的知识)用于当前时代的图形小部件和GUI组件。工具包通常在比库更高的抽象层上运行,并且通常会自己使用和使用库。与库不同,工具包代码通常用于执行客户端代码的任务,例如构建窗口,调整窗口大小等。工具箱中较低级别的抽象要么是固定的,要么本身可以由客户端操作以被禁止的方式编码。 (思考窗口样式,可以修复,也可以通过客户端代码预先更改。)
从历史上看,框架是一套相互关联的库和模块,它们分成了“通用”和“通用”模块。或者&#39;具体&#39;类别。通用框架旨在通过提供通用功能(例如跨平台内存管理,多线程抽象,动态结构(以及通用通用结构))来提供用于构建应用程序的全面且集成的平台。历史通用框架(没有依赖注入,见下文)几乎普遍被OO语言中的多态模板(参数化)打包语言产品所取代,例如STL for C ++,或者用于非OO语言的打包库(保证的Solaris C头文件)。 )。一般框架在不同的抽象层上运行,但普遍是低级别的,并且像库一样依赖客户端代码在他们的帮助下执行它的特定任务。
&#39;具体&#39;历史上,框架是针对单个(但通常是庞大的)任务开发的,例如&#34;命令和控制&#34;用于工业系统和早期网络堆栈的系统,以及在高级抽象操作和类似工具箱的操作,用于执行客户端代码任务。
目前,框架的定义已经变得更加集中,并且采用了“控制反转”的概念。其他地方提到的原则作为指导原则,因此程序流程以及执行都是由框架执行的。然而,框架仍然针对特定输出;例如,某个特定操作系统的应用程序(例如,MS Windows的MFC),或者用于更通用的工作(例如Spring框架)。
SDK是一组工具,可帮助程序员创建和部署代码/内容,这些代码/内容非常专门针对在特定平台上运行或以非常特定的方式运行。 SDK可以只包含一组库,这些库必须仅以客户端代码的特定方式使用,并且可以正常编译,最多可以创建或调整二进制资产以生成它的二进制工具集。 s(SDK&#39; s)输出。
引擎(在代码集合术语中)是一个二进制文件,它将以某种方式运行定制内容或处理输入数据。游戏和图形引擎可能是这个术语中最普遍的用户,几乎普遍使用SDK来定位引擎本身,例如UDK(虚幻开发工具包),但也存在其他引擎,例如搜索引擎和RDBMS引擎。
引擎通常(但并非总是)只允许其内部的一些内部人员访问它。通常要么针对不同的架构,要么改变引擎输出的表示,要么用于调整目的。根据定义,开源引擎可以根据需要对客户进行更改和更改,并且某些适当的引擎可以完全修复。然而,世界上最常用的引擎几乎肯定是Javascript引擎。嵌入到每个浏览器的所有地方,都有一大堆JavaScript引擎,它们将javascript作为输入,处理它,然后输出到渲染。
我正在回答的最后一个术语是我个人的错误:API,历史上用于描述应用程序或环境的外部接口,它本身能够独立运行,或者至少可以执行它。初始执行后没有任何必要的客户干预的任务。诸如数据库,字处理器和Windows系统之类的应用程序将向外部接口公开一组固定的内部挂钩或对象,然后客户端可以调用/修改/使用它们以执行原始应用程序可以执行的功能。 API通过API提供了多少功能,以及客户端代码(重新)使用了多少核心应用程序。 (例如,文字处理API可能要求在客户端代码的每个实例运行时将完整应用程序加载到后台,或者可能只是其中一个链接库;而正在运行的窗口系统会创建内部对象由自己管理并将句柄传递回客户端代码以供使用。
目前,术语API具有更广泛的范围,通常用于描述此答案中的几乎所有其他术语。实际上,应用于该术语的最常见定义是API为另一个软件提供了一个签约的外部接口(API的客户端代码)。实际上,这意味着API依赖于语言,并且具有由上述代码集之一(例如库,工具箱或框架)提供的具体实现。 为了查看特定区域,协议,例如,API与协议不同,协议是表示一组规则的更通用的术语,但是特定协议/协议套件的单独实现,其将外部接口暴露给其他软件最常被称为API。
如上所述,上述术语的历史和当前定义已经发生了变化,这可以看作是对科学理解基础计算原理和范例的进步,也归结为特定软件模式的出现。 。特别是,九十年代早期的GUI和Windowing系统帮助定义了许多这些术语,但是自从OS Kernel和Windowing系统有效混合用于大规模操作系统(也许是Linux),以及依赖注入的大量采用/将控制反转作为消费图书馆和框架的机制,这些术语必须改变各自的含义。
在仔细考虑这个主题超过一年后,我拒绝将IoC原则作为框架和库之间的定义区别。有很多受欢迎的作者说它是,但有几乎相同数量的人说它不是。有太多的框架&#39;在那里不要使用IoC来说它是定义原则。对嵌入式或微控制器框架的搜索揭示了不使用IoC的全部过多而我现在认为.Net语言和CLR是&#34; general&#34;的一个可接受的后代。框架。说IoC是一个决定性的特征,对于我来说太过刻板,我不敢接受,并且拒绝任何将自己作为一个与上述历史表征相匹配的框架的无法控制的东西。
有关非IoC框架的详细信息,请参阅上面提到的许多嵌入式和微型框架,以及不通过该语言提供回调的语言中的任何历史框架(OK。可以针对任何设备攻击回调使用现代注册系统,但不是普通的程序员),显然是.net框架。
答案 3 :(得分:56)
如果你是一个更直观的学习者,这里有一个更清晰的图表:
(致谢:http://tom.lokhorst.eu/2010/09/why-libraries-are-better-than-frameworks)
答案 4 :(得分:54)
answer provided by Menzani and Barrass可能是最完整的。但是,可以更清楚地说明解释。大多数人都错过了这些都是嵌套概念的事实。所以,让我为你安排一下。
编写代码时:
一般来说,这完全解释了术语之间的差异。
答案 5 :(得分:13)
库只是一个包含在包中的方法/函数的集合,可以导入到代码项目中并重新使用。
框架是一个强大的库或库集合,为您的代码提供“基础”。框架遵循控制反转模式。例如,.NET框架是一个大型的内聚库集合,您可以在其中构建应用程序。您可以说框架和库之间没有太大的区别,但是当人们说“框架”时,它通常意味着更大,更强大的库套件,它们将成为应用程序不可或缺的一部分。
我认为工具包的方式与我对SDK的看法相同。它附带了文档,示例,库,包装器等。再次,您可以说这与框架相同,您可能会这样做。
它们几乎可以互换使用。
答案 6 :(得分:5)
一个非常好的问题,甚至可能是一点点主观性的,但我相信这是我能给出的最佳答案。
答案 7 :(得分:3)
<强>库强>
我认为一致的是,库是已编码的代码,您可以使用它,以便不必再次编码。代码必须以允许您查找所需功能的方式进行组织,并从您自己的代码中使用它。
大多数编程语言都带有标准库,特别是一些实现某种集合的代码。这总是为了方便您不必自己编写这些东西。类似地,大多数编程语言都有构造,允许您从库中查找功能,包括动态链接,命名空间等。
因此,经常需要重新使用的代码才能放入库中。
<强>工具包强>
用于特定目的的一组工具。这是一致的。问题是,什么被认为是一种工具,什么不是。我会说没有固定的定义,它取决于自称为工具包的东西的上下文。工具示例可以是库,小部件,脚本,程序,编辑器,文档,服务器,调试器等。
另一件需要注意的是“特殊目的”。这始终是正确的,但目的范围可以根据制作工具包的人员轻松更改。所以它很容易成为程序员的工具包,或者它可以是一个字符串解析工具包。一个是如此广泛,它可以让工具触及与编程相关的所有内容,而另一个更精确。
SDK通常是工具包,因为它们会尝试将一组工具(通常是多种工具)捆绑到一个包中。
我认为共同的思路是,一个工具可以完全为你做点什么,或者它可以帮助你做到。工具包只是一组工具,可以执行或帮助您执行一组特定的活动。
<强>框架强>
框架并不是一致的定义。对于可以构建代码的任何内容来说,它似乎都是一个笼统的术语。这意味着:任何基础或支持您的代码的结构。
这意味着您需要针对框架构建代码,而针对代码构建库。
但是,似乎有时候框架这个词的使用方式和工具包甚至库一样。 .Net Framework主要是一个工具包,因为它由作为库的FCL和作为虚拟机的CLR组成。所以你会认为它是Windows上C#开发的工具包。 Mono是Linux上C#开发的工具包。然而他们称之为框架。以这种方式思考也是有道理的,因为它构成了你的代码框架,但框架应该更多地支持并将事物放在一起,然后做任何工作,所以我认为这不是你应该使用的方式字。
我认为业界正试图让框架意味着一个已编写的程序,其中缺少必须提供或定制的部分。我认为这是一件好事,因为工具包和库是“框架”其他用法的精确术语。
答案 8 :(得分:2)
我认为这有点主观。该工具包是最简单的。它只是一堆方法,可以使用的类 库与框架问题我通过使用它们的方式有所不同。很久以前我在某处读到了完美的答案。框架调用您的代码,但另一方面,您的代码调用库。
答案 9 :(得分:2)
框架:在您的计算机上安装并允许您与其进行交互。没有框架,您无法将编程命令发送到您的机器
图书馆:旨在解决某个问题(或与同一类别相关的几个问题)
工具包:许多代码的集合,可以解决多个问题上的多个问题(就像工具箱一样)
答案 10 :(得分:0)
关于Mittag的正确答案:
一个简单的例子。假设您在其中一个类中实现了ISerializable
接口(.Net)。您可以使用.Net的框架 quality ,而不是它的库质量。你填写“白点”(正如mittag所说)并且你完成了骨架。您必须事先知道 框架将如何对您的代码做出“反应”。实际上.net是一个框架,这里我不同意Mittag的观点。
{strong}非常好的第19章(专门讨论这个主题的整章)非常明确地给出了你的问题的完整,完整的答案顺便提一下(不是“仅适用于Smalltalk”)。
答案 11 :(得分:0)
其他人已经注意到.net可能既是框架又是库和工具包,取决于你使用哪个部分,但也许一个例子有帮助。处理数据库的实体框架是.net的一部分,它使用控制模式的反转。你让它知道你的模型它会弄清楚如何处理它们。作为程序员,它要求您理解“框架的思想”,或者更现实地理解设计师的思维以及他们将如何处理您的输入。另一方面,datareader和相关调用只是一种工具,可以从表/视图中获取或放入数据,并使其可供您使用。它永远不会理解如何采用父子关系并将其从对象转换为关系,您将使用多个工具来实现这一点。但是你可以更好地控制数据的存储方式,时间,交易等等。