框架和库有什么区别?

1035

什么是框架的区别?

我认为库是一组对象和函数,专注于解决特定问题或特定应用程序开发领域(例如数据库访问);而框架则是基于特定方法论(例如MVC)的库集合,并覆盖应用程序开发的所有领域。


1
还有相关的内容:http://ux.stackexchange.com/questions/13314/pattern-library-vs-style-guide-what-are-the-differences - chharvey
1
我们需要一些功能,我们称之为库。我们需要一些功能,我们将借助框架,并且框架调用我们的代码(例如UIKit)。 - Kamleshwar
1
一个软件框架不仅仅是一个库。它还包括一种特定的设计架构,用户必须在其中工作 - 连接库中不同项目以提供特定应用类型的通用解决方案的一种方式。因此,框架具有只需要用户配置和验证预先编写的测试即可运行的优点。而仅使用库时,用户需要在实施之前设计架构并创建测试。因此,仅使用库需要更多的工作量。但是库是灵活的,潜在效率更高。 - Trunk
从技术上讲,库和框架之间没有太大的区别(例如Ext JS、Vue.js、React、Twitter Bootstrap、jQuery UI),就像模块化软件和操作系统之间的区别一样(例如Chrome浏览器和ChromeOS Linux)。 - user1742529
1
你呼叫图书馆,框架回应你。 - Ian Boyd
22个回答

616

执行特定且明确定义的操作。

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

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

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


3
可能是指类似于Ruby on Rails或Node.js中的Sails这样可以创建完整Web应用程序的工具。 - gustavohenke
2
我认为应该用“肌肉”而不是“肉”来充实骨架。我认为这更准确,因为“肌肉”可以使骨架运动起来。 - altgov3en
@altgov3en 中,要让骨架动起来需要“肉”,而不是仅靠“肌肉”。例如神经系统的“肉”、循环系统的“肉”等其他“肉”都是必须的。 - Geoffrey Hale

402

实际上,这些术语根据它们被使用的上下文意义不同。

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

因此,您可以在单个软件包中获得使用库所需的所有内容(C/C++/Objective-C库没有.h文件就几乎没用,除非您根据某个库的文档自己编写.h文件),而不是一堆需要移动的文件(Mac捆绑包只是Unix级别上的一个目录,但UI将其视为单个文件,就像在Java中有JAR文件,当您单击它时,通常看不到内部,除非您明确选择显示内容)。

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

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

因此,我认为库只是一个“库”。它是一组对象/函数/方法(取决于您使用的语言),您的应用程序会“链接”到它,并因此可以使用该对象/函数/方法。它基本上是包含可重用代码的文件,通常可以在多个应用程序之间共享(您不必一遍又一遍地编写相同的代码)。

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

这是一篇关于“库与框架”话题的文章。我个人认为这篇文章存在争议。他所说的并没有错,但他只挑选了框架的多个定义之一,并将其与传统的库定义进行比较。例如,他说你需要一个框架来实现子类化。真的吗?我可以在库中定义一个对象,将其链接到我的代码中,并对其进行子类化。我不明白我为什么需要一个“框架”。在某种程度上,他解释了当今如何使用“框架”这个词。正如我之前所说,它只是一个炒作的词语。有些公司发布普通的库(在任何经典库的意义上),并称其为“框架”,因为这听起来更加花哨。


3
依我看,一个框架就是指“空白”的项目环境。 - Kulvar
1
我把框架看作是一个带有多个空槽的骨架或框架,框架定义了这些槽应该包含什么。因此,框架将使用所有填充的槽并创建软件。我觉得这有点像插件架构,您可以在特定位置插入某些东西,并忘记让它们一起工作。框架会处理这个问题。这样的简单示例包括Processing(创意艺术),Spark(通用集群计算)等。 - Nithin B

331

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

根据Martin Fowler的说法:

本质上是一组可以调用的函数,这些天通常组织成类。每次调用都会执行一些操作并将控制返回给客户端。

框架体现了一些抽象的设计,并内置更多行为。为了使用它,您需要通过子类化或插入自己的类将您的行为插入到框架的各个位置中。然后框架的代码在这些点调用您的代码。


3
谢谢你的解释,但你能更详细地说明一下吗?例如,我正在使用FacebookSDK框架,并从该框架中调用类方法。FacebookSDK框架没有调用我的代码中的任何内容,这与你所定义的相反,即“不要联系我们,我们会联系你”。 - Charles Robertson
5
据我所知,FacebookSDK是一个客户端库,不能被归类为框架,原因很明显(正如你已经注意到的):FacebookSDK在客户端代码中没有调用任何东西。此外,Facebook将SDK定义如下:“丰富的客户端功能集,用于添加社交插件、Facebook登录和Graph API调用。”没有任何关于框架的指示。 - Panos
1
@Panos 谢谢。我猜代表FacebookSDK的手提箱图标有点误导人了。而且名字叫做'FacebookSDK.framework'。Facebook应该把它改名为像'FacebookSDK.dylib'这样的东西吗?但是感谢您澄清这一点。知道正确的定义是好的... - Charles Robertson
这是一个有趣的定义。我最近开始使用d3.js,并观察到它通常被认为是一个框架。但是,我编写的所有d3代码都在普通的JavaScript代码中,因此我无法将此定义扩展到d3。 - Dileep Kumar Patchigolla
3
@dileep 在d3.js官网的第一句话中说:“D3.js是一个基于数据操作文档的JavaScript库。”我认为将其视为框架是错误的。 - Panos

297

图书馆:

它只是一组例程(函数式编程)或类定义(面向对象编程)。其背后的原因就是简单的代码重用,即获取其他开发人员已经编写的代码。这些类或程序通常定义特定领域中的特定操作。例如,有一些数学库,可以让开发人员调用函数而无需重新实现算法工作原理。

框架:

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

图书馆、框架和您的代码形象表示:

图书馆、框架和您的代码形象表示

主要区别:

图书馆和框架之间的关键区别是“反转控制”。当您从库中调用方法时,您有控制权。但是对于框架,控制被反转:框架调用您。资源。

关系:

它们两者都定义了API,供程序员使用。将它们放在一起,我们可以将图书馆视为应用程序的某个函数,将框架视为应用程序的骨架,而API是将它们组合在一起的连接器。典型的开发过程通常从框架开始,然后通过API填充库中定义的函数。


5
就像这张图片一样,它很好地概括了情况,并且也展示了为什么有时人们会感到困惑,因为框架经常捆绑包含库。 - Didier A.
1
如果您认为答案给出了很好的解释,您可以点赞该答案,这样帖子的观众就可以轻松找到有用的答案。 - Durai Amuthan.H
FFmpeg(不是指程序,而主要是项目中的LibAVUtil)是一个框架,而libavcodec等则是库? - MarcusJ
1
@MarcusJ - LibAVUtil和libavcodec都是库。 - Durai Amuthan.H
你的代码比库的低级模块更高级。如果框架调用你的代码,而你的代码又调用你的库,那么框架如何提供依赖注入的IoC呢? - KannarKK

128

如我一直所描述的:

库(Library)是一种工具。

框架(Framework)则是一种生活方式。

你可以使用库中任何有用的小部分。但如果使用框架,则必须将整个项目致力于它。


53

从 Web 开发者的角度来看:

  1. 库(Library)可以很容易地被另一个库替换,但框架(Framework)不能。

    如果您不喜欢 jQuery 的日期选择库,可以使用其他日期选择器,比如 Bootstrap 日期选择器或 Pickadate。

    如果您不喜欢构建产品所使用的 AngularJS 框架,就不能随意使用其他框架进行替换。您必须重写整个代码库。

  2. 大多数情况下,与框架相比,库需要较少的学习曲线。例如:underscore.js 是一个库,Ember.js 是一个框架。


46

我喜欢Cohen的回答,但更技术性的定义是:您的代码调用了一个库。 框架调用您的代码。例如,GUI框架通过事件处理程序调用您的代码。Web框架通过某些请求-响应模型调用您的代码。

这也被称为控制反转 - 突然之间,框架决定何时如何执行您的代码,而不是与库相反。这意味着框架对您必须如何组织代码有更大的影响。


30

我记不得在哪里看到这个定义了,但我觉得它很好。

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


7
但是libc包含qsort(),它会调用你的代码。我不认为这使得libc成为一个框架。 - Mark Baker
模块是什么意思? - nCardot

26

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

假设你想要煮一道咖喱鱼。那么你需要像香料和其他工具这样的材料。你还需要作为准备菜肴的基础原料(这是你的应用程序数据)。所有这些材料一起构成了一个框架。现在你可以逐个使用它们或组合在一起来制作咖喱鱼,这就是你的最终产品。把这个比作Web框架,由underscore.jsbootstrap.cssbootstrap.jsfontawesomeAngularJS等组成。例如,Twitter Bootstrap v.35

现在,如果你只考虑其中一个材料,比如。你不能随便使用任何一种油,否则会破坏你的鱼(数据)。你只能使用橄榄油。将其与underscore.js进行比较。现在你想要使用哪个品牌的油取决于你自己。某些菜肴是用美国橄榄油(underscore.js)或印度橄榄油(lodash.js)制作的。这只会改变你的应用程序的味道。由于它们几乎提供相同的功能,所以它们的使用取决于开发者的个人喜好,并且很容易替换。

enter image description here


框架:一组库,为您的应用程序提供独特的属性和行为。(所有材料)

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

插件: 是为了一个库(如ui-router -> AngularJS)或多个库的组合(如 date-picker -> bootstrap.css + jQuery)而构建的实用工具,如果没有它,你的插件可能无法按预期工作。

P.S. AngularJS是一个MVC框架,但也是一个JavaScript库。因为我相信库扩展了本地技术(在这种情况下是JavaScript)的默认行为。


16

以下是我的理解(也是一些人的共识):

库(Library)是代码中包含的内容,而框架(Framework)则是应用程序的容器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接