框架 与 库 之间有什么区别?
我一直认为库是一组对象和功能,专注于解决特定问题或应用程序开发的特定领域(即数据库访问);另一方面,框架是一个以特定方法(即MVC)为中心的图书馆集合,涵盖了应用程序开发的所有领域。
答案 0 :(得分:474)
库执行特定的,明确定义的操作。
框架是一个框架,应用程序通过填充框架来定义操作的“肉”。骨架仍然有代码链接部件,但最重要的工作是由应用程序完成的。
库的示例:网络协议,压缩,图像处理,字符串实用程序,正则表达式评估,数学。操作是独立的。
框架示例: Web应用程序系统,插件管理器,GUI系统。框架定义了概念,但应用程序定义了最终用户关心的基本功能。
答案 1 :(得分:327)
实际上,根据使用的上下文,这些术语可能意味着很多不同的东西。
例如,在Mac OS X上,框架只是库,打包成一个包。在捆绑包中,您将找到一个实际的动态库(libWhatever.dylib)。裸库和Mac上的框架之间的区别在于框架可以包含多个不同版本的库。它可以包含额外的资源(图像,本地化字符串,XML数据文件,UI对象等),除非框架是公开发布的,否则它通常包含使用库所需的.h文件。
因此,你需要在一个包中使用你需要在你的应用程序中使用库(没有.h文件的C / C ++ / Objective-C库是没用的,除非你根据一些库文档自己编写它们),而不是一堆文件可以移动(Mac软件包只是Unix级别的目录,但是UI将其视为单个文件,就像你在Java中使用JAR文件一样,当你点击它时,你通常不会除非你明确选择显示内容,否则看看里面是什么。
维基百科称框架为“流行语”。它将软件框架定义为
软件框架是可重用的 设计软件系统(或 子系统)。软件框架可以 包括支持程序,代码 库,脚本语言或 其他软件帮助开发和 将不同的组件粘在一起 一个软件项目。各个部分 框架可能会暴露出来 通过API ..
所以我说一个图书馆就是那个“图书馆”。它是对象/函数/方法的集合(取决于您的语言),并且您的应用程序“链接”它,因此可以使用对象/函数/方法。它基本上是一个包含可重用代码的文件,通常可以在多个应用程序之间共享(您不必一遍又一遍地编写相同的代码)。
框架可以是您在应用程序开发中使用的所有内容。它可以是库,许多库的集合,脚本集合,或创建应用程序所需的任何软件。框架只是一个非常模糊的术语。
这是一篇关于某个人关于“Library vs. Framework”主题的文章。我个人认为这篇文章具有很强的争议性。他在那里说的并不错,但是,他只是挑选出框架的多个定义之一,并将其与经典的库定义进行比较。例如。他说你需要一个子分类框架。真?我可以在库中定义一个对象,我可以链接它,并在我的代码中对它进行子类化。我不知道我需要一个“框架”。他在某种程度上解释了如何使用术语框架。正如我之前所说,这只是一个炒作的词。有些公司只发布了一个普通的库(在任何意义上都是经典库)并将其称为“框架”,因为它听起来更加花哨。
答案 2 :(得分:269)
我认为主要区别在于框架遵循“Hollywood principle”,即“不要打电话给我们,我们会打电话给你。”
库本质上是一组 你可以调用的函数,这些 通常组织成课程的日子。 每次通话都会做一些工作并返回 控制客户。
框架体现了一些抽象 设计,内置更多行为。 为了使用它你需要插入 你的行为进入了各个地方 框架要么通过子类化,要么通过子类化 通过插入自己的类。该 框架的代码然后调用您的代码 在这些方面。
答案 3 :(得分:220)
它只是例程(函数式编程)或类定义(面向对象编程)的集合。背后的原因只是代码重用,即获取已由其他开发人员编写的代码。类或例程通常在特定于域的区域中定义特定操作。例如,有一些数学库可以让开发人员只需调用函数而无需重做算法如何工作的实现。
在框架中,所有控制流已经存在,并且有一堆预定义的白点我们应该用我们的代码填写 EM>。框架通常更复杂。它定义了一个骨架,应用程序定义了自己的特征来填充骨架。通过这种方式,适当时框架将调用您的代码。好处是开发人员不需要担心设计是否良好,而只需要实现特定于域的功能。
库和框架之间的主要区别是 “控制反转” 。当您从库中调用方法时,您就可以控制它。但是使用框架,控件反转:框架调用你。 Source.
它们都定义了API,用于程序员使用。将这些组合在一起,我们可以将库视为应用程序的某个功能,将框架视为应用程序的框架,API是将这些组合在一起的连接器。典型的开发过程通常从框架开始,并通过API填写库中定义的函数。
答案 4 :(得分:220)
你打电话给图书馆。
框架会给你打电话。
図书馆助け
足场が痛い
多くの涙
答案 5 :(得分:98)
正如我一直描述的那样:
图书馆是一种工具。
框架是一种生活方式。
您可以使用任何微小部分帮助您的库。您必须将整个项目提交到的框架。
答案 6 :(得分:42)
我喜欢Cohens的回答,但更技术性的定义是:您的代码调用库。 框架会调用您的代码。例如,GUI框架通过事件处理程序调用您的代码。 Web框架通过一些请求 - 响应模型调用您的代码。
这也称为控制反转 - 框架突然决定何时以及如何执行代码而不是像库那样反过来。这意味着框架对您构建代码的方式也会产生更大的影响。
答案 7 :(得分:38)
从Web开发人员的角度来看:
图书馆可以很容易地被另一个图书馆替换。但框架不能。
如果你不喜欢jquery日期选择器库,你可以用其他日期选择器替换,例如bootstrap日期选择器或pickadate。
如果您不喜欢构建产品的AngularJS,则不能只替换任何其他框架。您必须重写整个代码库。
与Frameworks相比,大多数库的学习曲线要少得多。例如:underscore.js是一个库,Ember.js是一个框架。
答案 8 :(得分:30)
我忘记了我看到这个定义的地方,但我认为这很不错。
库是您从代码中调用的模块,框架是调用代码的模块。
答案 9 :(得分:12)
这就是我对它的看法(并且已经看到其他人合理化了):
库是代码中包含的内容。框架是应用程序的容器。
答案 10 :(得分:11)
框架可以由不同的库组成。我们来举个例子。
让我们说你想煮咖喱鱼。然后你需要像油,香料和其他实用程序这样的成分。您还需要 fish ,这是您准备菜肴的基础(这是您申请的数据)。所有成分一起称为 框架 。现在,您将逐一或组合使用它们来制作您的 最终产品 的鱼咖喱。将其与网络框架进行比较,后者由 underscore.js , bootstrap.css , bootstrap.js 组成, fontawesome , AngularJS 等。例如, Twitter Bootstrap v.35 。
现在,如果你只考虑一种成分,比如说油。你不能使用你想要的任何油,因为它会破坏你的鱼(数据)。您只能使用橄榄油。将其与 underscore.js 进行比较。现在你想要使用什么牌子的油取决于你。有些菜是用美国橄榄油(underscore.js)或印度橄榄油(lodash.js)制作的。这只会改变您的应用程序的味道。由于它们的用途几乎相同,因此它们的使用取决于开发人员的偏好,并且它们易于更换。
框架:一组库,为您的应用程序提供独特的属性和行为。 (所有成分)
库:一组定义明确的指令,为您的数据提供独特的属性和行为。 (油炸鱼)
插件:用于库(ui-router - > AngularJS)的实用程序构建或组合的许多库(日期选择器 - > bootstrap.css + jQuery),没有它们,您的插件可能会现在按预期工作。
P.S。 AngularJS是一个MVC框架,但是一个JavaScript库。因为我相信Library扩展了本机技术的默认行为(在这种情况下是JavaScript)。
答案 11 :(得分:10)
这里链接了一个bitter article by Joel Spolsky,但在工具箱,库,框架等之间有很好的区别
答案 12 :(得分:6)
库 - 可以用作客户认为适合完成某项任务的任何类或组件集 框架 - 强制要求您“插入”比您更大的东西。您只需按照公布要求的方式提供特定于您的申请/要求的作品,以便“framwework可以让您的生活变得轻松”
答案 13 :(得分:6)
库是为了易于使用和提高效率。例如,Zend库可以帮助我们通过定义良好的类和函数来完成不同的任务。虽然框架通常会强制某种方式实现解决方案,例如MVC(模型 - 视图 - 控制器)(reference)。它是一个定义良好的系统,用于分配任务,如MVC.Model包含数据库端,视图用于UI接口,控制器用于业务逻辑。
答案 14 :(得分:6)
库实现了狭义目的的功能,而框架往往是一组库,为更广泛的功能提供支持。例如,库System.Drawing.dll处理绘图功能,但只是整个.NET框架的一部分。
答案 15 :(得分:5)
我认为库是一组实现目标的实用程序(例如,套接字,加密等)。 框架是库+ RUNTIME EINVIRONNEMENT。例如,ASP.NET是一个框架:它接受HTTP请求,创建页面对象,调用lyfeicle事件等。框架完成所有这些,你编写了一些代码,这些代码将在生命周期的特定时间运行目前的要求!
无论如何,这是一个非常令人兴奋的问题!
答案 16 :(得分:5)
我不记得这个答案的来源(我猜我是在互联网上的.ppt中找到的),但答案很简单。
库和框架是一组类,模块和/或代码(取决于编程语言),可以在您的应用程序中使用,并帮助您解决特定的“问题”。
该问题可以是在应用程序中记录或调试信息,绘制图表,创建特定文件格式(html,pdf,xls),连接到数据库,创建应用程序的一部分或完整的应用程序或代码已应用于Design Pattern。
你可以有一个框架或一个库来解决所有这些问题以及更多,通常框架可以帮助你解决更复杂或更大的问题,但这是他们主要差异的结果,而不是主要的定义两者。
图书馆和框架之间的主要区别在于他们自己的代码之间的依赖关系,用oder字来表示使用框架你 需要使用FW中的几乎所有类,模块或代码,但要使用 使用库,您可以使用一个或几个类,模块或代码 lib在您自己的应用程序中
这意味着如果一个框架有,例如有50个类,以便在你需要使用的应用程序中使用该框架,那么,在你的代码中说10-15个或更多的类,因为这是如何设计的框架,一些类(该类的对象)是框架中其他类中的方法的输入/参数。请参阅.NET框架,Spring或任何MVC框架。
但是例如一个日志库,您可以在代码中使用Log类,并帮助您解决“日志记录问题”,这并不意味着日志库的代码中没有更多类,就像处理文件的类,处理屏幕输出,甚至是数据库一样,但是你从不在代码中触及/使用那些类,这就是为什么是库而不是框架的原因。
此外,还有比Frameworks和Libraries更多的类别,但这不是主题。
答案 17 :(得分:5)
我认为你很好地确定了差异:框架提供了一个我们工作的框架......不知何故,它比一个简单的库更“约束”。
该框架还应该为一组库增加一致性。
答案 18 :(得分:4)
你的解释对我来说听起来不错......一个库可以是任何编译和自包含的东西,可以在其他代码中重复使用,其内容实际上没有任何限制。
另一方面,框架应该具有一系列设施,可用于某些特定的应用程序开发领域,就像您的示例MVC一样。
答案 19 :(得分:2)
假设您不久前在您所在的城市开设了一家汉堡餐厅。但是作为初学者,你觉得做一个汉堡太难了。您正在考虑一种为客户制作汉堡的简单方法。 有人告诉你,有 McDonald Burger Framework 和 BurgerKing Burger Framework。
如果您使用 McDonald Burger Framework,那么制作 Big Mac 汉堡就非常容易了。 (但你不能做 Whopper。)
如果您使用BurgerKing Burger Framework,那么制作Whopper Burger 非常容易。(但是,您无法制作巨无霸) >
反正最后都是汉堡。这里很重要的一点是,你必须遵循他们的框架规则来制作汉堡。否则,你会觉得更难做到或者做不到。
而且您还听说有一种叫做Simple Burger-Patty Library的东西。
如果您使用此库,您可以轻松制作任何汉堡肉饼(X2 速度)。 如果您使用 McDonald Burger Framework 或 BurgerKing Burger Framework,这并不重要。 无论哪种方式,您仍然可以使用这个简单的 Burger-Patty 库。 (即使你不用框架也可以使用这个库。)
您现在看到 Framework 与 Library 之间的区别了吗?
一旦您开始使用麦当劳汉堡框架。切换到BurgerKing Burger Framework 并不容易。因为你要换整个厨房。
但是图书馆,换其他的会容易很多。或者你可以不使用它。
答案 20 :(得分:1)
库与框架
Martin Fowler - InversionOfControl
库和框架是您代码的外部代码。它可以是文件(例如.jar
)、系统代码(操作系统的一部分)等。
Library
是一组有用的代码。主要关注您的代码。图书馆解决了狭窄范围的任务。例如 - 实用程序、排序、模块化
your code ->(has) Library API
Framework
或 Inversion of Control(IoC) container
[About] 是更多的东西。框架解决了广泛范围的任务(特定领域),您将此任务委托给框架。 IoC
- 您的代码取决于框架逻辑、事件......因此框架会调用您的代码。它强制您的代码遵守它的规则(实现/扩展协议/接口/合同),传递 lambdas...例如 - 测试、GUI、DI 框架...
your code ->(has) and ->(implements) Framework API
答案 21 :(得分:1)
基于 Erich Gamma 等人在 Design Patterns 一书中给出的定义:
特定于问题的代码可以使用库和实现框架。