框架、工具包和库

框架、工具包和库之间的区别是什么?

86872 次浏览

非常非常相似,框架通常比库更完善和完整,而工具包可以简单地是类似库和框架的集合。

这是一个非常好的问题,在本质上可能有一点点主观,但我相信这是我能给出的最好的答案。

库只是将方法/函数打包到一个包中的集合,可以导入到代码项目中并重用。

框架是一个健壮的库或库的集合,它为您的代码提供了一个“基础”。框架遵循控制反转模式。例如,. net框架是一个大型内聚库集合,您可以在其中构建应用程序。你可能会说框架和库之间没有太大的区别,但是当人们说“框架”时,它通常意味着一个更大、更健壮的库套件,它将成为应用程序不可或缺的一部分。

我认为工具包和SDK是一样的。它附带文档、示例、库、包装器等。同样,您可以说这与框架是相同的,您可能这样做是正确的。

它们几乎都可以互换使用。

库和框架之间最重要的区别,实际上也是定义的区别是控制反转

这是什么意思?好吧,这意味着当你调用一个库时,在控制中。但是在框架中,控件是反向的:框架调用你。(这就是所谓的好莱坞原则:不要给我们打电话,我们会给你打电话。)这就是框架的定义。如果它没有控制反转,它就不是一个框架。(我在看你,.NET!)

基本上,所有的控制流都已经在框架中,只有一堆预定义的白点,您可以用您的代码填写。

另一方面,库是可以调用的功能的集合。

我不知道工具箱这个术语是否有很好的定义。仅仅是“工具包”这个词似乎就暗示了某种模块化,即一组独立的库,您可以从中挑选。那么,是什么使工具包不同于一堆独立的库呢?集成:如果你只有一堆独立的库,并不能保证它们能很好地一起工作,而一个工具包中的库被设计成可以很好地一起工作。你不需要使用它们中的所有

但这只是我对这个术语的解释。不像库和框架,定义良好,我不认为有被广泛接受的定义。

Martin Fowler在他关于控制反转的文章中讨论了库和框架之间的区别:

控制反转是一个关键的部分 框架与框架的区别是什么 图书馆。一个库本质上是一个 , 这些日子通常组织成 类。每次调用都要做一些工作

.返回控制到客户端 框架包含一些抽象内容 设计,内置了更多的行为。 为了使用它,你需要插入 你的行为变成了各种各样的地方 框架通过子类化或 通过插入你自己的类。< >强 框架的代码然后调用你的代码 在这些点.

.

总结一下:你的代码调用一个库,而框架调用你的代码。

关于Mittag的正确答案:

一个简单的例子。假设你在你的一个类中实现了ISerializable接口(. net)。你使用的是。net的品质框架,而不是它的库特性。你填上“白点”(就像mittag说的),你就完成了骨架。你必须知道提前框架将如何“反应”你的代码。实际上。net是一个框架,这就是我不同意Mittag观点的地方。

你的问题的完整的答案这本书的第19章(整个章节都致力于这个主题)中非常清楚地给出了,顺便说一下,它是一个非常好的书(完全不是“仅用于Smalltalk”)。

简介

有各种各样的术语与相关代码的集合有关,它们具有历史意义(为了回答这个问题,1994/5年以前)和当前含义,读者应该意识到这两点,特别是在阅读历史时期关于计算/编程的经典文本时。

图书馆

无论是过去还是现在,库都是与特定任务相关的代码集合,或者是在大致相同的抽象级别上操作的密切相关的任务集。它本身通常没有任何目的或意图,目的是供客户端代码使用(使用)并与客户端代码集成,以协助客户端代码执行其任务。

工具包

从历史上看,工具包是一个更集中的库,具有已定义的特定目的。目前,这个术语已经失宠了,在当前时代几乎只用于图形小部件和GUI组件(据笔者所知)。工具箱通常在比库更高的抽象层上操作,并且经常消费和使用库本身。与库不同,工具包代码通常用于执行客户端代码的任务,例如构建窗口、调整窗口大小等。工具包中较低的抽象级别要么是固定的,要么可以由客户端代码以一种被禁止的方式对其进行操作。(想想Window样式,它既可以被固定,也可以被客户端代码预先修改。)

框架

从历史上看,框架是一套相互关联的库和模块,它们被分为“通用”或“特定”类别。通用框架旨在通过提供通用功能,例如跨平台内存管理、多线程抽象、动态结构(以及一般的通用结构),为构建应用程序提供一个全面和集成的平台。历史上的通用框架(没有依赖注入,见下文)几乎普遍被面向对象语言中的多态模板(参数化)打包语言所取代,例如面向c++的STL,或面向非面向对象语言的打包库(保证Solaris C头文件)。一般的框架在不同的抽象层上操作,但普遍是低层次的,就像库一样,依赖于客户端代码在它们的帮助下执行特定的任务。

“特定的”框架在历史上是为单一(但通常是庞大的)任务开发的,例如“命令和控制”;用于工业系统的系统,早期的网络堆栈,以及在高抽象级别上操作的系统,类似于工具包,用于执行客户端代码任务。

目前,框架的定义已经变得更加集中,并采取了“控制反转”。原则正如在别处提到的那样作为指导原则,所以程序的流程,以及执行都是由框架来进行的。然而,框架仍然是针对特定的输出;针对特定操作系统的应用程序(例如MFC用于MS Windows),或者更通用的工作(例如Spring框架)。

SDK:“软件开发工具包”;

SDK是帮助程序员创建和部署代码/内容的工具集合,这些代码/内容非常明确地针对在非常特定的平台上运行或以非常特定的方式运行。SDK可以由一组库组成,这些库必须仅由客户端代码以特定的方式使用,并且可以正常编译,直到一组二进制工具,这些工具创建或调整二进制资产以产生其(SDK的)输出。

引擎

引擎(在代码集合术语中)是一个二进制文件,它将以某种方式运行定制的内容或处理输入数据。游戏和图像引擎可能是这个术语最普遍的用户,并且几乎普遍地与SDK一起使用,以针对引擎本身,如UDK(虚幻开发工具包),但也存在其他引擎,如搜索引擎和RDBMS引擎。

引擎通常(但不总是)只允许客户端访问它的少数内部组件。最常见的是针对不同的体系结构,更改引擎输出的表示形式,或者用于调优目的。开源引擎根据定义对客户开放,可以根据需要进行更改和修改,并且一些专有引擎是完全固定的。然而,世界上最常用的引擎几乎肯定是JavaScript引擎。在每个浏览器中都嵌入了大量的JavaScript引擎,这些引擎将JavaScript作为输入,处理它,然后输出呈现。

API:“应用程序编程接口”;

我要回答的最后一个术语是我个人的一个难题:API,在历史上被用来描述应用程序或环境的外部接口,它本身能够独立运行,或者至少在初始执行后不需要任何必要的客户端干预就能执行其任务。诸如数据库、文字处理器和Windows系统等应用程序会向外部接口公开一组固定的内部钩子或对象,然后客户端可以调用/修改/使用这些内部钩子或对象,从而执行原始应用程序可以执行的功能。API有多少功能可以通过API使用,以及有多少核心应用程序被客户端代码(重新)使用。(例如,当客户端代码的每个实例运行时,一个字处理API可能要求整个应用程序在后台加载,或者可能只是它的一个链接库;然而,一个运行中的窗口系统将创建内部对象由自己管理,并将句柄传递回客户端代码以供使用。

目前,术语API有一个更广泛的范围,并且经常用于描述这个答案中的几乎所有其他术语。实际上,应用于这个术语的最常见的定义是API为另一个软件提供了一个约定的外部接口(API的客户端代码)。在实践中,这意味着API是依赖于语言的,并且具有由上述代码集合之一提供的具体实现,例如库、工具包或框架。 从一个特定的领域来看,协议,例如,API不同于协议,后者是一个更通用的术语,表示一组规则,然而,一个特定协议/协议套件的单独实现,向其他软件公开外部接口,通常被称为API

备注

如上所述,上述术语的历史和当前定义已经发生了变化,这可以看作是由于对底层计算原则和范式的科学理解的进步,也可以归结为软件特定模式的出现。特别是,90年代早期的GUI和Windowing系统帮助定义了许多这些术语,但是由于大规模消费者操作系统(可能除了Linux)的OS内核和Windowing系统的有效混合,以及大量采用依赖注入/控制反转作为消费库和框架的机制,这些术语不得不改变它们各自的含义。


附注(一年后)

经过一年多的仔细思考,我拒绝将IoC原则作为框架和库之间的决定性区别。有很多受欢迎的作家说它是,但也有几乎同等数量的人说它不是。有太多的“框架”没有使用IoC说它是定义原则。搜索嵌入式或微控制器框架会发现大量不使用IoC的框架,我现在相信。net语言和CLR是“通用”框架的可接受的后代。框架。要说IoC是决定性的特征,恐怕对我来说太死板了,我无法接受,并且拒绝任何把自己作为一个与上面提到的历史表现相匹配的框架提出的东西。

有关非ioc框架的详细信息,请参阅(如上所述)许多嵌入式和微框架,以及语言中不通过该语言提供回调的任何历史框架(OK。对于任何具有现代寄存器系统的设备,回调都可能被黑客攻击,但普通程序员不会),显然。net框架也是如此。

我认为这有点主观。工具箱是最简单的。它只是一堆可以使用的方法和类 库和框架的区别在于如何使用它们。很久以前,我在某个地方读到一个完美的答案。框架调用你的代码,但另一方面你的代码调用库

框架:安装在你的机器上,并允许你与它互动。没有这个框架,你就不能向你的机器发送编程命令

库:旨在解决一个特定的问题(或与同一类别相关的几个问题)

工具包: -许多代码片段的集合,可以解决多个问题上的多个问题(就像一个工具箱)

图书馆

我认为库是已经编码的代码,您可以使用它,从而不必再次编码,这是一致的。代码的组织方式必须允许您查找所需的功能并从自己的代码中使用它。

大多数编程语言都带有标准库,特别是一些实现某种集合的代码。这是为了方便您不必自己编写这些代码。类似地,大多数编程语言都有构造,允许您从库中查找功能,例如动态链接、名称空间等。

因此,发现自己经常需要重用的代码是放入库中的好代码。

工具包

工具:用于特定目的的一套工具这是一致的。问题是,什么被认为是工具,什么不是。我想说没有固定的定义,它取决于自称为工具包的东西的上下文。工具的例子可以是库、小部件、脚本、程序、编辑器、文档、服务器、调试器等。

另一个需要注意的是“特殊目的”。这总是正确的,但是目的的范围很容易根据工具包的制作者而改变。所以它可以是程序员的工具箱,也可以是字符串解析工具箱。一个是如此广泛,它可以有工具触及所有编程相关的,而另一个是更精确。

sdk通常是工具包,因为它们尝试将一组工具(通常是多种类型的)捆绑到一个包中。

我认为常见的思路是,工具为您做了一些事情,要么是完全的,要么是帮助您做这些事情。工具箱只是一组工具,它们都执行或帮助您执行一组特定的活动。

框架

框架的定义并不一致。对于任何可以构建代码框架的东西,这似乎是一个通用术语。这意味着:任何构建或支持代码的结构。

这意味着您根据框架构建代码,而根据代码构建库。

但是,有时框架这个词似乎与工具包甚至库具有相同的意义。. net Framework主要是一个工具包,因为它由FCL(一个库)和CLR(一个虚拟机)组成。所以你可以把它看作是Windows上c#开发的工具包。Mono是Linux上c#开发的工具包。但他们称之为框架。这样想也是有意义的,因为它是一种框架,但框架应该更多地支持和将东西放在一起,然后做任何工作,所以我的观点是,你不应该这样使用这个词。

我认为这个行业正试图将框架转变为一个已经编写好的程序,其中缺少你必须提供或定制的部分。我认为这是一件好事,因为工具箱和库是“框架”其他用法的非常精确的术语。

如果你是一个视觉学习者,下面的图表会让你更清楚:

< a href = " http://tom.lokhorst。eu/2010/09/why-libraries-are-better-than-frameworks" rel="noreferrer"> ></a></p>


<p>(学分:<a href=http://tom.lokhorst.eu/2010/09/why-libraries-are-better-than-frameworks)

答案由Barrass提供可能是最完整的。然而,解释可以很容易地说得更清楚。大多数人忽略了一个事实,即这些都是嵌套的概念。所以让我告诉你吧。

编写代码时:

  • 最终你会发现你在程序中重复的代码片段,所以你将它们重构为函数/方法
  • 最终,在编写了一些程序之后,您会发现自己正在将已经编写的函数复制到新的程序中。为了节省时间,你可以将这些函数绑定到中。
  • 最终,您会发现自己每次使用某些库时都会创建相同类型的用户界面。因此,你重构你的工作并创建一个工具包,它允许你更容易地从泛型方法调用创建你的ui。
  • 最终,你已经编写了这么多使用相同工具包和库的应用程序,以至于你创建了一个框架,它有一个已经提供的样板代码的通用版本,所以你所需要做的就是设计UI的外观和处理用户交互产生的事件。

一般来说,这完全解释了术语之间的差异。

其他人注意到。net可能既是一个框架,也是一个库和一个工具包,这取决于你使用的是哪个部分,但也许一个示例会有所帮助。用于处理数据库的实体框架是.net的一部分,它使用了反转控制模式。你让它知道你的模型它会想办法处理它们。作为一名程序员,它要求你理解“框架的思想”,或者更现实地说,设计师的思想以及他们将如何处理你的输入。另一方面,Datareader和相关调用只是一个工具,用于从表/视图中获取或放置数据,并使其对您可用。它永远不会理解如何将父子关系从对象关系转换为关系关系,你需要使用多种工具来完成这一点。但是您可以对数据的存储方式、存储时间、交易等有更多的控制。