988

框架有什么区别?

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

4

24 回答 24

582

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

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

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

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

于 2008-09-29T13:58:40.437 回答
390

实际上,这些术语可能意味着很多不同的东西,具体取决于它们使用的上下文。

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

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

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

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

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

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

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

于 2008-09-29T14:17:09.723 回答
326

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

根据马丁福勒

本质上是一组可以调用的函数,现在通常组织成类。每个调用都会做一些工作并将控制权返回给客户端。

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

于 2008-09-29T14:06:03.527 回答
274

你打电话给图书馆。

框架调用你。


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

于 2008-10-24T14:29:04.763 回答
270
于 2013-03-24T16:23:12.333 回答
121

正如我一直描述的那样:

图书馆是一种工具。

框架是一种生活方式。

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

于 2008-09-29T14:04:04.857 回答
51

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

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

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

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

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

于 2014-12-23T07:45:53.893 回答
46

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

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

于 2008-09-29T14:10:09.817 回答
30

我忘记了我在哪里看到这个定义,但我认为它非常好。

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

于 2008-09-29T14:06:23.290 回答
24

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

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

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

在此处输入图像描述


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

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

插件:为库(ui-router -> AngularJS)或许多库组合(date-picker -> bootstrap.css + jQuery)构建的实用程序,没有它,您的插件现在可以按预期工作。


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

于 2016-06-28T11:17:24.677 回答
16

这就是我的想法(并且已经被其他人合理化了):

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

于 2008-09-29T14:08:21.927 回答
9

这里链接了Joel Spolsky 的一篇苦涩文章,但包含工具箱、库、框架等之间的良好区别

于 2008-09-29T14:33:45.690 回答
8

我会试着像你五岁一样解释。(没有使用编程术语。)

假设您不久前在您的城市开了一家汉堡餐厅。但是你觉得作为一个初学者做汉堡太难了。您正在考虑一种为客户制作汉堡的简单方法。有人告诉你,如果你使用framework,你可以很容易地制作 bugger。你知道有麦当劳汉堡框架汉堡王汉堡框架。

如果你使用McDonald Burger Framework,制作巨无霸汉堡就是这么简单。(但你不能制造 Whopper。)

如果你使用BurgerKing Burger 框架,那么制作皇堡汉堡就是这么简单。(但是,你不能做巨无霸)

不管怎样,最后,他们都是汉堡。这里重要的是,你必须遵循他们的框架规则来制作汉堡。否则,你会觉得更难做到或无法做到。

你还听说有一个叫做Simple Burger-Patty Library的东西。

如果你使用这个库,你可以很容易地制作任何汉堡肉饼(X2 速度)。使用 McDonald Burger Framework 或 BurgerKing Burger Framework 并不重要。无论哪种方式,您仍然可以使用这个Simple Burger-Patty Library。(即使你可以在没有框架的情况下使用这个库。)

您现在看到框架之间的区别了吗?


一旦你开始使用McDonald Burger Framework切换到BurgerKing Burger Framework并不容易。因为你必须改变整个厨房。

但是图书馆,换别人会容易得多。或者你可以不使用它。

于 2021-01-12T14:57:17.870 回答
7

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

于 2008-09-29T14:00:01.590 回答
6

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

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

于 2008-09-29T14:07:22.117 回答
6

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

于 2013-10-12T14:56:25.917 回答
5

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

另一方面,框架预计将具有一系列用于应用程序开发的某些特定领域的设施,就像您的示例 MVC一样

于 2008-09-29T13:59:36.660 回答
5

我认为您很好地确定了区别:该框架提供了一个框架,我们可以在其中进行工作……不知何故,它比简单的库更具“约束力”。
该框架还应该为一组库添加一致性。

于 2008-09-29T14:00:32.663 回答
5

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

于 2008-09-29T14:03:43.297 回答
5

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

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

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

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

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

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

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

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

于 2011-07-27T16:23:52.613 回答
1

基于Erich Gamma 等人在《设计模式》一书中给出的定义:

  • 库:一组相关的过程和类组成一个可重用的实现;
  • 框架:一组具有模板方法的协作类,构成可重用规范。它设置控制流并允许通过在子类中覆盖框架类中的模板方法调用的钩子方法来挂钩该流,以针对特定问题定制框架。

特定问题的代码可以使用库并实现框架。

于 2021-07-16T21:37:18.497 回答
0

库与框架

Martin Fowler - InversionOfControl

库和框架是您的代码的外部代码。它可以是文件(例如.jar)、系统代码(操作系统的一部分)等。

Library是一组有用的代码。主要关注您的代码。图书馆解决的任务范围很。例如 - 实用程序、排序、模块化

your code ->(has) Library API

FrameworkInversion of Control(IoC) container[关于]更多。框架解决了广泛的任务(特定领域),您将此任务委托给框架。IoC- 您的代码取决于框架逻辑、事件......因此框架调用您的代码。它迫使你的代码遵守它的规则(实现/扩展协议/接口/合同),通过 lambdas ......例如 - 测试、GUI、DI 框架......

your code ->(has) and ->(implements) Framework API

[iOS 库与框架]

[DIP vs DI vs IoC]

于 2021-03-25T21:59:47.290 回答
0

我能够整合一些资源并想出这个,我希望这会有所帮助。

这是一个“短长”的描述

什么是图书馆?

库是由开发人员构建的代码块(可以是变量、函数、类、接口等形式)的集合,以简化其他开发人员发现其相关性的软件开发过程。

什么是框架?

参考库的定义,我们可以将框架定义为一种工具,通过在受控的开发环境中为开发人员提供必要的库,帮助开发人员解决大量特定领域的问题。

于 2021-12-28T17:59:31.517 回答
-1

实际上,这取决于您对术语的定义。那里可能有很多不同的定义。

我认为基于我认为该术语所指的内容,以下是很好的解释:

确定性库

确定性库包含基于 a) 函数输入或 b) 以某种方式跨函数调用维护的状态的确定性函数。

如果将逻辑依赖注入到确定性库中,则此类逻辑必须符合具体规范,以便库的输出不受影响。

示例:一个碰撞检测库,由于某种原因,它依赖于一个排序函数来帮助这些计算。这个排序函数可以被配置用于优化目的(例如,通过依赖注入、编译时链接等),但必须始终符合相同的输入/输出映射,以便库本身保持确定性。

不确定性库

不确定性库可以通过与它以某种方式获得访问权的其他外部不确定性库通信来保存不确定性函数。

我通常将不确定性库称为服务。

示例:一个扑克库,它依赖于随机数生成器服务来洗牌。这可能是一个不好的例子,因为出于架构目的,我们应该将这个库的不确定性方面推到外面。扑克图书馆可以通过接收预先洗好的一副牌来变得确定性和可单元测试,如果他们愿意,这个图书馆的用户现在有责任随机洗牌。

框架

框架介于确定性和不确定性库之间。

依赖注入到框架中的任何逻辑都必须对该函数实例的生命周期具有确定性,但不同逻辑的不同函数实例可以在框架函数的单独执行中注入。

map示例:对, filter, sort,等列表进行操作reduce的函数期望接收确定性但对于不同执行可能具有不同逻辑的函数。请注意,仅当这些列表操作将自己宣传为确定性时,才存在此要求。在大多数语言中,列表操作没有这个约束。此类框架的核心逻辑是确定性的,但允许接受不确定性逻辑,风险由用户承担。这通常是一个需要处理的混乱场景,因为由于框架的实现细节,输出可能会有很大差异。

于 2021-09-09T17:06:30.547 回答