框架和库之间有什么区别?[关闭]


865

框架库有什么区别?

我一直认为图书馆是一组对象和功能,专注于解决特定问题或应用程序开发的特定领域(即数据库访问)。另一方面,它是一个框架,它是一组以特定方法论(即MVC)为中心的库的集合,涵盖了应用程序开发的所有领域。


18
@ vba4all:当第一次被问到时,这怎么可能是重复的?
Noob Saibot 2015年

5
仅仅因为它是首先创建的并不意味着它不是重复的;)而是要标识重复的/高度相似的问题,并确保共享资源/答案(并打开最活跃/最佳回答的问题)
GrayedFox


3
@tuple_cat实际上,您的链接似乎是重复的:在此链接之后被询问
chharvey

1
我们需要一些功能,我们称之为库。我们需要一些功能,我们将利用框架的帮助,并且框架调用我们的代码(例如UIKit)。
Kamleshwar

Answers:


350

实际上,根据所使用的上下文,这些术语可能意味着许多不同的事物。

例如,在Mac OS X上,框架只是打包成捆的库。在捆绑软件中,您将找到一个实际的动态库(libWhatever.dylib)。裸库和Mac上的框架之间的区别在于,框架可以包含该库的多个不同版本。它可以包含额外的资源(图像,本地化的字符串,XML数据文件,UI对象等),除非框架公开发布,否则它通常包含使用该库所需的必要.h文件。

因此,您将所有内容都放在一个包中,您需要在应用程序中使用该库(没有.h文件的C / C ++ / Objective-C库几乎没有用,除非您根据某些库文档自己编写它们),而不是一堆文件来回移动(Mac软件包只是Unix级别上的目录,但是UI将其视为单个文件,就像您在Java中拥有JAR文件一样,当您单击它时,通常看不到除非您明确选择显示内容,否则内容将不会包含在内。

维基百科称框架为“流行语”。它定义了一个软件框架为

软件框架是软件系统(或子系统)的可重用设计。软件框架可以包括支持程序,代码库,脚本语言或其他软件,以帮助开发和粘合软件项目的不同组件。框架的各个部分可以通过API公开。

所以我想说一个图书馆就是“一个图书馆”。它是对象/功能/方法的集合(取决于您的语言),您的应用程序“链接”它,因此可以使用对象/功能/方法。它基本上是一个包含可重用代码的文件,通常可在多个应用程序之间共享(您不必一遍又一遍地编写相同的代码)。

框架可以是您在应用程序开发中使用的所有内容。它可以是一个库,许多库的集合,脚本的集合或创建应用程序所需的任何软件。框架只是一个非常模糊的术语。

这是一篇关于某人的文章,主题为“ 库与框架 ”。我个人认为这篇文章很有争议。他在那儿说的没错,但是,他只是选择了框架的多个定义之一,并将其​​与经典的库定义进行了比较。例如,他说您需要子分类的框架。真?我可以在库中定义一个对象,可以对其进行链接,然后在代码中将其子类化。我看不出我该如何需要一个“框架”。他以某种方式更确切地解释了如今如何使用术语框架。正如我之前所说,这只是个大肆宣传。一些公司只发布一个普通库(在任何意义上都是经典库),并称其为“框架”,因为听起来更花哨。


2
有趣的是,早在2008年,Wikipedia的文章就将“框架”描述为“流行语”。
斑马鱼

2
IMO,一个框架就是“空白”项目环境。
库尔瓦

514

进行特定,定义明确的操作。

框架是一个骨架,其中应用程序通过填写骨架定义的操作的“肉”。框架仍然具有链接各部分的代码,但是最重要的工作是由应用程序完成的。

库示例:网络协议,压缩,图像处理,字符串实用程序,正则表达式评估,数学。操作是独立的。

框架示例: Web应用程序系统,插件管理器,GUI系统。框架定义了概念,但是应用程序定义了最终用户关心的基本功能。


10
+1为真实示例。顺便说一句,您介意澄清“ Web应用程序系统”是什么意思吗?
Pacerier,2014年

3
@Pacerier可能会让您创建完整的Web应用程序,例如Rails for Ruby或Sails forNode.js。
gustavohenke 2014年

好答案。您能否提供更多与iOS框架和库相关的示例?
NSPratik

或Django,完美主义者的Web框架有最后期限。
空袭

2
我会考虑用“肌肉”而不是“肉”填充骨骼。我认为这是更准确的类比,因为“肌肉”使骨骼运动。
altgov3en

290

我认为主要区别在于框架遵循“ 好莱坞原则 ”,即“不给我们打电话,我们给您打电话”。

根据马丁·福勒Martin Fowler)的说法:

一个实际上是一组功能,您可以调用,这些天通常分为类。每个调用都会执行一些工作,并将控制权返回给客户端。

一个框架体现了一些抽象的设计,内置了更多的功能,而且为了使用它,你需要插入您的行为变成可以通过继承或者在您自己的类插入框架中的各个地方。然后,框架的代码在这些位置调用您的代码。


2
@Panos感谢您的解释,但您可以详细说明。例如,我正在使用FacebookSDK框架,并从该框架调用类方法。FacebookSDK框架没有在我的代码中调用任何东西,这与您的定义相反,即“不要给我们打电话,我们给您打电话”。
查尔斯·罗伯逊

4
@CharlesRobertson AFAIK FacebookSDK是一个客户端库。它不能归类为框架,并且原因很明显(如您已经注意到的):FacebookSDK没有在客户端代码中调用任何东西。此外,Facebook 对SDK的定义如下:“一组丰富的客户端功能,用于添加社交插件,Facebook登录名和图API调用。” 没有迹象表明框架...
Panos

1
@Panos谢谢。我猜那代表FacebookSDK的手提箱图标有点误导了。并命名为“ FacebookSDK.framework”。Facebook应该将其重命名为“ FacebookSDK.dylib”吗?但是感谢您澄清这一点。很高兴知道正确的定义是什么……
Charles Robertson

这是一个有趣的定义。我最近开始使用d3.js,并观察到它通常被认为是框架。但是我编写的任何d3代码都在常规的javascript代码内,因此我无法将此定义扩展到d3。
Dileep Kumar Patchigolla

1
@Dileep d3.js主页在第一句话中指出:“ D3.js是一个JavaScript库,用于基于数据处理文档”。我认为将其视为框架是错误的。
Panos

243

您称库。

框架呼唤您。


図书馆助け
足场が痛い
多くの涙


12
您可以将其重构为hai句吗?
德里克·托姆斯

18
@DerekTomes BTW:我添加了形式。
伊恩·博伊德

56
您的答案正在META中讨论。您愿意翻译the句吗?我想我们当中很多人都在想这是否真的意味着帮助图书馆,脚手架的伤害,许多眼泪,就像Google译者很喜欢地说的那样:)
错误

27
很高兴看到mod取消了前两个评论。现在就可以理解为什么加上了日语文本(这是一个笑话),并且只是翻译的尝试,而不是真正流行的日语诗。
Zanon

9
在苏维埃俄罗斯,框架呼唤您。
罗伯特·摩尔

242

图书馆:

这仅仅是一个集合例程(函数式编程)或类定义(面向对象编程)。背后的原因仅仅是代码重用,即获取其他开发人员已经编写的代码。这些类或例程通常在域特定区域中定义特定操作。例如,有一些数学库可让开发人员仅调用函数而无需重做算法工作原理的实现。

框架:

在框架中,所有控制流都已经存在,并且我们应该在代码中填充一堆预定义的白点。框架通常更复杂。它定义了一个骨架应用程序定义了自己的功能来填充框架。这样,框架将在适当的时候调用您的代码。这样做的好处是,开发人员不必担心设计是否好,而只需要担心实现特定于领域的功能。

库,框架和您的代码图像表示形式:

库,框架和您的代码图像关系

关键区别:

库和框架之间的主要区别是“控制反转”。当您从库中调用方法时,就可以控制。但是有了框架,控件就被颠倒了:框架调用了您资源。

关系:

两者都定义了API,供程序员使用。为了将它们组合在一起,我们可以将库视为应用程序的特定功能,将框架视为应用程序的框架,而API是将它们组合在一起的连接器。典型的开发过程通常从框架开始,然后通过API填写库中定义的功能。


14
控制反转 深入解释!
Patricia

3
就像图片一样,对它进行了很好的总结,并显示了为什么人们有时会感到困惑,因为框架也经常捆绑库。
Didier A.

1
@didibus如果您认为答案给出了很好的解释,则可以对答案进行投票,以便帖子查看者可以轻松找到富有成果的答案。
Durai Amuthan.H 2014年

那么FFmpeg(不是程序,而是项目中的LibAVUtil)是一个框架,而libavcodec等是库吗?
MarcusJ 2014年

1
@MarcusJ-LibAVUtil和libavcodec都是库
Durai Amuthan.H 2015年

110

正如我一直描述的那样:

库是一种工具。

框架是一种生活方式。

您可以使用任何很小的部分来帮助您的库。您必须将整个项目提交到一个框架。


9
完全理解两个术语后,这个答案就变得更加有意义。

45

从Web开发人员的角度来看:

  1. 库可以很容易地被另一个库替换。但是框架不能。

    如果您不喜欢jquery日期选择器库,则可以用其他日期选择器替换,例如引导日期选择器或pickadate。

    如果您不喜欢在其上构建产品的AngularJS,则不能仅仅替换为任何其他框架。您必须重写整个代码库。

  2. 与框架相比,图书馆通常需要很少的学习时间。例如:underscore.js是一个库,Ember.js是一个框架。


最佳答案。简单,直接和清晰。
费利佩·圣地亚哥

41

我喜欢科恩(Cohens)的答案,但更技术性的定义是:您的代码称为库。框架调用您的代码。例如,GUI框架通过事件处理程序调用您的代码。一个Web框架通过一些请求-响应模型调用您的代码。

这也称为控制反转 -框架突然决定了何时以及如何执行代码,而不是像库那样决定执行代码的方式。这意味着框架也将对您如何构造代码产生更大的影响。


30

我忘记了在哪里看到此定义,但我认为它非常不错。

库是您从代码中调用的模块,而框架是调用您的代码的模块。


6
但是libc包括qsort(),它会调用您的代码。我不认为这会使libc成为框架。
Mark Ba​​ker

模块是什么意思?
NattyC

18

框架可以由不同的库组成。让我们举个例子。

假设您要煮咖喱鱼。然后,您需要诸如香料和其他用途的配料。您还需要,这是您准备菜肴的基础(这是应用程序的数据)。所有成分统称为框架。现在,您将一一或组合使用它们来制作咖喱鱼,这是您的最终产品。将其与由underscore.jsbootstrap.cssbootstrap.jsfontawesomeAngularJS等组成的Web框架进行比较。 Twitter Bootstrap v.35

现在,如果您只考虑一种成分,例如说。您不能使用任何想要的油,因为那样会破坏您的鱼(数据)。您只能使用橄榄油。将其与underscore.js进行比较。现在,您要使用哪种品牌的油取决于您。有些菜是用美国橄榄油(underscore.js)或印度橄榄油(lodash.js)制成的。这只会改变您的应用程序的品味。由于它们的用途几乎相同,因此它们的使用取决于开发人员的偏好,并且很容易更换。

在此处输入图片说明


框架:库的集合,这些库为您的应用程序提供独特的属性和行为。(所有成分)

:一组定义明确的指令,可为数据提供独特的属性和行为。(鱼上油)

插件:一个实用程序库,用于库(ui-router-> AngularJS)或许多组合库(日期选择器-> bootstrap.css + jQuery),没有它们,您的插件现在可以按预期工作。


PS AngularJS是MVC框架,但是是JavaScript库。因为我相信Library扩展了本机技术的默认行为(在这种情况下为JavaScript)。


很好的解释:)
马诺

14

我是这样想的(并已被其他人合理化):

库是代码中包含的东西。框架是您的应用程序的容器。



8

库是为狭义范围的目的而实现的功能,而框架往往是为更广泛的功能提供支持的库的集合。例如,库System.Drawing.dll处理绘图功能,但仅是整个.NET框架的一部分。


3
好的一点是,框架可以包含库因此,它既可以是第一个实例中的框架,又可以是第二个实例中的库。因为许多Web框架(例如Apache Wicket)就是这种情况,它们定义了处理周期,但也提供了一组实现具体ui组件的类。
2012年

我相信.NET是一个很大的库。一个太大而不能称为库的库,但仍然是一个库。框架强制执行某种设计,确定控制流程等,几乎没有余地。像.NET这样的功能无法做到这一点。我相信.NET是一个库,而ASP.NET MVC是一个框架。但是微软需要良好的口碑来推向市场。
nawfal 2014年

6

库-可用作客户端认为适合完成特定任务的任何类或组件集。
框架-强制您执行某些准则,以“插入”比您大的东西。您只需要以发布所需的方式提供特定于您的应用程序/需求的部分,以便“框架可以使您的生活变得轻松”


6

库是为了易于使用和提高效率。例如,您可以说Zend库通过其定义明确的类和函数帮助我们完成不同的任务,而框架通常会强制采用某种方式来实现解决方案,例如MVC(Model -view-controller)(参考)。这是一个定义明确的系统,用于像MVC中那样分配任务。模型包含数据库端,视图用于UI界面,控制器用于业务逻辑。


5

您的解释对我来说听起来很不错…… 可以是经过编译和自包含的任何东西,可以在其他代码中重复使用,实际上对它的内容没有任何限制。

另一方面,一个框架应该具有在某些特定的应用程序开发领域中使用的功能,就像您的示例MVC一样。


5

我认为您已经很好地确定了区别:该框架提供了一个框架,我们可以在其中进行工作...某种程度上,它比简单的库更具“约束力”。
该框架还应该为一组库增加一致性。


5

我认为库是达到目标的一组实用程序(例如,套接字,加密等)。框架是库+运行时环境。例如,ASP.NET是一个框架:它接受HTTP请求,创建页面对象,调用lyfe cicle事件等。框架完成了所有这些之后,您编写了一些代码,这些代码将在生命周期的特定时间运行当前的请求!

无论如何,非常有趣的问题!


5

我不记得这个答案的来源(我想我是在互联网上的.ppt中找到的),但是答案很简单。

库和框架是一组类,模块和/或代码(取决于编程语言),可以在您的应用程序中使用它们,并帮助您解决特定的“问题”。

该问题可能是在应用程序中记录或调试信息,绘制图表,创建特定的文件格式(html,pdf,xls),连接到数据库,创建应用程序的一部分或完整的应用程序或应用到应用程序的代码。设计模式

您可以拥有一个框架或一个库来解决所有这些问题,而且,通常,框架可以帮助您解决更复杂或更大的问题,但是它们的主要区别在于它们的本质,而不是两者的主要定义。

库和框架之间的主要区别是它们自己的代码之间的依赖性,换句话说,要使用框架,您需要使用固件中几乎所有的类,模块或代码,但是要使用库,您可以使用一个或您自己的应用程序库中的几个类,模块或代码

这意味着,例如,如果一个框架有50个类以便在您需要使用的应用程序中使用该框架,那么说,您的代码中有10-15个或更多类,因为这是设计框架的方式,因此类(该类的对象)是框架中其他类中方法的输入/参数。请参阅.NET框架,Spring或任何MVC框架。

但是,例如,日志库,您可以在代码中使用Log类,并帮助您解决“日志记录问题”,这并不意味着日志库中的代码中没有更多的类,例如类来处理文件,处理屏幕输出甚至数据库,但是您绝不要在代码中触摸/使用该类,这就是为什么要使用库而不是使用框架的原因。

而且类别比框架和库更多,但是这不是主题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.