ChatGPT解决这个技术问题 Extra ChatGPT

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

关闭。这个问题需要更加集中。它目前不接受答案。想改进这个问题?更新问题,使其仅通过编辑此帖子专注于一个问题。 2个月前关闭。改进这个问题

框架和库有什么区别?

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

我们需要一些功能,我们称之为库。我们需要一些功能,我们将借助框架和框架调用我们的代码(例如 UIKit)。
软件框架不仅仅是一个库。它还包括用户必须在其中工作的特定设计架构 - 一种将库中的不同项目连接在一起以提供特定应用程序类型的通用解决方案的排序方式。因此,框架的优点是只需要用户进行配置并验证预先编写的测试即可运行。仅使用库,用户就需要在实施之前设计架构并创建测试。因此,仅这些库就需要做更多的工作。但是库是灵活的并且可能更有效。

J
Jason Cohen

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

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

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

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


+1 真实示例。顺便说一句,您介意澄清一下“Web 应用程序系统”是什么意思吗?
@Pacerier 可能可以让您创建完整的 Web 应用程序,例如用于 Ruby 的 Rails 或用于 Node.js 的 Sails。
不错的答案。您能否提供更多与 iOS 框架和库相关的示例?
或 Django,一个为完美主义者提供最后期限的网络框架。
我会考虑用“肌肉”而不是“肉”来填充骨骼。我认为这是更准确的类比,因为“肌肉”正在使骨骼运动。
T
Taryn

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

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

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

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

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

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

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

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


有趣的是,早在 2008 年 Wikipedia 的文章就将“框架”描述为“流行语”。
IMO,框架是“空白”项目环境。
我将框架视为具有多个空插槽的骨架或框架,并且框架定义了插槽应包含的内容。因此,该框架将使用所有这些已填充的插槽并创建软件。我觉得这是一种插件架构,你在某些地方插入某些东西而忘记了让它们一起工作。框架会处理这个问题。此类的简单示例是处理(创意艺术)、Spark(通用集群计算)等。
当它只是说问题无效时,这个答案如何仍然在顶部。有些人想为这些不同的词分配不同的定义,并且有,所以让我们谈谈。
@TimotheeHowland 我的答案是最重要的,因为它是公认的答案。提问者决定哪个答案是被接受的,毕竟这是他的问题。 SO 不是讨论网站。此外,您可以自由地为单词分配您喜欢的任何含义,但是您正在发明自己的语言。正式的库描述了一组软件例程,并且该术语的起源是众所周知的,而框架没有官方定义,甚至不知道该术语的来源。
P
Panos

我认为主要区别在于框架遵循“Hollywood principle”,即“不要打电话给我们,我们会打电话给你”。

根据Martin Fowler

库本质上是一组可以调用的函数,现在通常组织成类。每个调用都会做一些工作并将控制权返回给客户端。框架体现了一些抽象设计,并内置了更多行为。为了使用它,您需要通过子类化或插入您自己的类来将您的行为插入到框架中的各个位置。然后,框架的代码会在这些点调用您的代码。


@Panos 感谢您的解释,但您能详细说明一下吗?例如,我正在使用 FacebookSDK 框架,并从该框架调用类方法。 FacebookSDK 框架在我的代码中没有调用任何东西,这与您的定义相反,即“不要打电话给我们,我们会打电话给你”。
@CharlesRobertson AFAIK FacebookSDK 是一个客户端库。它不能归类为框架,原因很明显(正如您已经注意到的):FacebookSDK 没有在客户端代码中调用任何内容。此外,Facebook defines SDK 如下:“一组丰富的客户端功能,用于添加社交插件、Facebook 登录和图形 API 调用。”没有框架的迹象...
@Panos 谢谢。我想代表 FacebookSDK 的手提箱图标有点误导。以及名称“FacebookSDK.framework”。 Facebook 应该将其重命名为“FacebookSDK.dylib”之类的名称吗?但感谢您澄清这一点。很高兴知道正确的定义是什么......
这是一个有趣的定义。我最近开始使用 d3.js,并观察到它通常被认为是一个框架。但是我写的任何 d3 代码都在一个普通的 javascript 代码中,所以我无法将此定义扩展到 d3。
@Dileep d3.js homepage 在第一句话中声明:“D3.js 是一个基于数据操作文档的 JavaScript 库”。我认为将其视为一个框架是错误的。
C
Community

图书馆:

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

框架:

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

库、框架和您的代码图像表示:

https://i.stack.imgur.com/DqCkT.png

关键区别:

库和框架之间的主要区别在于“控制反转”。当您从库中调用方法时,您可以控制。但是对于框架,控制是相反的:框架调用你Source.

关系:

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


控制反转 非常深入的解释!
就像图片一样,很好地总结了它,也说明了为什么有时人们会感到困惑,因为框架也经常捆绑库。
@didibus 如果您认为答案给出了很好的解释,您可以投票给答案,以便帖子查看者可以轻松找到富有成效的答案。
那么FFmpeg(不是程序,主要是项目中的LibAVUtil)是一个框架,而libavcodec等是库?
@MarcusJ - LibAVUtil 和 libavcodec 都是库
J
James Curran

正如我一直描述的那样:

图书馆是一种工具。

框架是一种生活方式。

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


在完全理解这两个术语之后,这个答案就更有意义了。
F
Fizer Khan

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

库可以很容易地被另一个库替换。但框架不能。如果您不喜欢 jquery 日期选择器库,您可以替换为其他日期选择器,例如引导日期选择器或 pickadate。如果您不喜欢构建产品的 AngularJS,则不能仅用任何其他框架替换。您必须重写整个代码库。与框架相比,大多数库的学习曲线要少得多。例如:underscore.js 是一个库,Ember.js 是一个框架。


A
Adam Bellaire

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

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


A
Aniket Kapse

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

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


但是 libc 包含 qsort(),它会调用您的代码。我认为这不会使 libc 成为一个框架。
模块是什么意思?
M
Madhuri Patel

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

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

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

https://i.stack.imgur.com/ZbR5p.png

框架:为您的应用程序提供独特属性和行为的库集合。 (所有成分)库:一组定义明确的指令,可为您的数据提供独特的属性和行为。 (Oil on Fish) Plugin : 为库 (ui-router -> AngularJS) 或许多库组合 (date-picker -> bootstrap.css + jQuery) 构建的实用程序,没有它,您的插件现在可以按预期工作。

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


K
Kon

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

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


J
Jin Lim

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

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

如果你使用麦当劳汉堡框架,那么制作巨无霸汉堡就很容易了。 (但你不能制造 Whopper。)

如果你使用 BurgerKing Burger Framework,那么制作 Whopper Burger 就是这么简单。 (但是,你不能做巨无霸)

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

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

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

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

一旦你开始使用麦当劳汉堡框架。切换到 BurgerKing Burger Framework 并不容易。因为你必须改变整个厨房。

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


我们需要这个类比的素食主义者友好变体🙈
J
Jeff Yates

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


好点,框架可以包含库因此,它既可以是第一个实例中的框架,也可以是第二个实例中的库。 就像 Apache Wicket 等许多 Web 框架的情况一样,它定义了处理周期,但也提供了一个大量实现具体 ui 组件的类。
我相信 .NET 是一个非常大的库。一个图书馆太大而不能被称为图书馆,但仍然是一个图书馆。框架强制执行某种设计,决定控制流等,几乎没有修补的空间。 .NET 本身并没有这样做。我相信 .NET 是一个库,而 ASP.NET MVC 是一个框架。但是 MS 需要好话才能推向市场。
@nawfal .NET 有一个库。一个非常大的图书馆。这仍然被称为图书馆。 BLC(基类库),更准确地说是 .NET Framework 的框架类库,或 .NET Core 的 CoreFX。但是,.NET 也指一个平台。这就是所谓的 VES(虚拟执行系统),更准确地说是 CLR(公共语言运行时)。您将代码构建到该平台的程序集中。它执行你的代码。
P
Peter Mortensen

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

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


C
Community

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


A
Adam Bellaire

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

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


P
PhiLho

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


G
Gishu

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


D
Diego

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

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

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

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

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

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

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

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


F
Favour Felix Chinemerem

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

这是一个“短长”的描述

什么是图书馆?

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

什么是框架?

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


这听起来更像是一些框架提供商推销他们的框架。根据这个定义,我看不出“框架”和“一大堆库”之间的区别。
M
Maggyero

根据 Erich Gamma 等人在书 Design Patterns 中给出的定义:

库:一组相关的过程和类组成一个可重用的实现;

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

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


y
yoAlex5

库与框架

Martin Fowler - InversionOfControl

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

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

your code ->(has) Library API

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

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

[iOS Library vs Framework]

[DIP vs DI vs IoC]


D
David Callanan

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

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

确定性库

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

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

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

不确定性库

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

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

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

框架

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

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

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