框架和库有什么区别?
框架和库有什么区别?
我一直认为图书馆是一组围绕解决特定问题或围绕特定应用开发领域(即数据库访问)而集中的对象和function; 另一方面,框架是以特定方法学(即MVC)为中心的图书馆集合,涵盖应用程序开发的所有领域。
感谢您的答案! 以下是一些从以下答案中提取的链接:
- 好莱坞原则 (取自帕诺斯的职位 )
- 马丁福勒:控制反转 (从帕诺斯的职位)
- 工具箱,图书馆和框架之间的区别 (取自洛伦佐的职位 )
- 图书馆vs框架 (摘自Mecki的文章 )
实际上这些术语可能意味着很多不同的东西,取决于它们所使用的上下文。
例如,在Mac OS X上,框架就是库,打包成一个包。 在包中你会发现一个实际的dynamic库(libWhatever.dylib)。 裸露的库和Mac上的框架之间的区别是,一个框架可以包含多个不同版本的库。 它可以包含额外的资源(图像,本地化的string,XML数据文件,UI对象等),除非这个框架公开发布,它通常包含你需要使用这个库的必要的.h文件。
因此,在一个包中你需要使用库中的所有东西(一个没有.h文件的C / C ++ / Objective-C库是非常没用的,除非你自己根据库文档编写它们),而不是一堆文件可以移动(Mac软件包只是Unix级别上的一个目录,但是用户界面将它看作是一个单独的文件,就像在Java中有JAR文件一样,当你点击它时,通常看不到里面是什么,除非你明确select显示内容)。
维基百科把框架称为“stream行语”。 它定义了一个软件框架
软件框架是软件系统(或子系统)的可重用devise。 软件框架可以包括支持程序,代码库,脚本语言或其他软件,以帮助开发和粘合软件项目的不同组件。 框架的各个部分可能通过API暴露。
所以我想说一个图书馆就是这个“图书馆”。 它是对象/函数/方法(取决于你的语言)和你的应用程序“链接”的集合,因此可以使用对象/函数/方法。 它基本上是一个包含可重复使用的代码的文件,通常可以在多个应用程序之间共享(您不必一次又一次地编写相同的代码)。
框架可以是您在应用程序开发中使用的一切。 它可以是图书馆,许多图书馆的集合,脚本的集合,或创build应用程序所需的任何软件。 框架只是一个非常模糊的术语。
这里有一篇关于“ 图书馆与框架 ”主题的文章。 我个人认为这篇文章是很有争议的。 他在那里说什么并不是错的,但是他只是挑选了框架的多个定义之一,并将其与图书馆的经典定义进行比较。 比如他说你需要一个子分类的框架。 真? 我可以在库中定义一个对象,我可以链接它,并在我的代码中分类。 我不明白我需要一个“框架”。 他在某种程度上解释了现在如何使用术语框架。 正如我之前所说的,这只是一个被大肆宣传的词汇。 有些公司只是发布一个普通的图书馆(从任何古典图书馆的意义上说),并称之为“框架”,因为它听起来更加奇特。
一个库执行特定的,明确的操作。
框架是应用程序通过填充骨架来定义操作的“肉”的骨架。 骨架仍然有连接部件的代码,但最重要的工作是由应用程序完成的。
库的例子:networking协议,压缩,image processing,string实用程序,正则expression式评估,math。 操作是独立的。
框架示例: Web应用程序系统,插件pipe理器,GUI系统。 框架定义了这个概念,但应用程序定义了最终用户关心的基本function。
我认为主要的区别在于框架遵循“ 好莱坞原则 ”,即“不要打电话给我们,我们会打电话给你”。
根据马丁福勒 :
图书馆本质上是一组你可以调用的函数,这些函数通常组织成类。 每个调用都会做一些工作,并将控制权返回给客户端。
框架体现了一些抽象devise,内置了更多的行为。为了使用它,您需要通过子类化或插入自己的类来将您的行为插入框架中的各个位置。 框架的代码然后在这些地方调用你的代码。
你叫图书馆。
框架调用你。
図书馆助け足场が痛い多くの涙
图书馆:
它只是一些例程 (函数式编程)或类定义 (面向对象编程)的集合 。 背后的原因是简单的代码重用 ,即得到已经被其他开发者编写的代码。 类或例程通常定义特定领域的特定操作 。 例如,有一些math库可以让开发者调用函数而不用重做algorithm的工作。
框架:
在框架中,所有的控制stream程已经存在,并且有一些预定义的白点 ,我们应该用我们的代码填写 。 框架通常更复杂。 它定义了一个框架,应用程序定义了自己的特征来填充框架。 这样,您的代码将在适当的时候被框架调用。 好处是开发人员不需要担心devise是否好,而只是实现特定领域的function。
库,框架和你的代码图像表示:
KeyDifference:
图书馆和框架之间的主要区别是“控制反转” 。 当你从库中调用一个方法时,你就可以控制了。 但是对于一个框架,控制是相反的: 框架调用你 。 资源。
关系:
他们都定义了API,供程序员使用。 把它们放在一起,我们可以把一个库当作应用程序的一个函数,一个框架作为应用程序的骨架,一个API是连接器,把它们放在一起。 一个典型的开发过程通常从一个框架开始,并通过API来填充库中定义的函数。
正如我一直描述的那样:
图书馆是一种工具。
框架是一种生活方式。
一个图书馆,你可以使用任何微小的部分帮助你。 一个框架,你必须提交你的整个项目。
我喜欢科恩的回答,但更技术性的定义是:你的代码调用一个库。 一个框架调用你的代码 。 例如,一个GUI框架通过事件处理程序调用你的代码。 Web框架通过一些请求 – 响应模型调用您的代码。
这也被称为控制的倒置 – 突然间,框架决定何时以及如何执行你的代码,而不是像图书馆那样。 这意味着一个框架对于如何构build代码也有很大的影响。
从Web开发人员angular度来看
-
库可以很容易地被另一个库replace。 但框架不能。
如果你不喜欢jQuerydateselect器库,你可以用其他dateselect器,如引导dateselect器或pickadate。
如果您不喜欢在其上构build产品的AngularJS,则不能仅使用其他框架进行replace。 你必须重写你的整个代码库。
-
与框架相比,大多数情况下,图书馆的学习曲线非常less。 例如:underscore.js是一个库,Ember.js是一个框架。
我忘了我在哪里看到这个定义,但我觉得这很好。
库是从代码中调用的模块,框架是调用代码的模块。
这里链接了Joel Spolsky的一篇苦涩的文章 ,但是包含了工具箱,库,框架等的一个很好的区别
图书馆
一个库是一个可重复使用的代码,你使用它,即它没有提供任何钩子给你来扩展它。 一个库通常关注一个function,通过API访问。 你调用一个库函数,它执行一些代码,然后控制返回到你的代码。 一个好的Java库(在这种情况下是库)的例子是Apache Commons
骨架
框架是一段代码,它决定了你的项目将遵循的架构。 一旦你select了一个框架来工作,你必须遵循框架的代码和devise方法。 该框架将为您提供钩子和callback,以便您可以在其上构build它 – 随后将调用您的插件代码,这是一种名为“控制反转”的现象。
一个框架通常会包含很多库,以使您的工作更轻松。 (networking)框架的例子是:
- Ruby on Rails: http : //rubyonrails.org/
- 龙卷风网站: http : //www.tornadoweb.org/
- CakePHP: http : //cakephp.org/
这就是我想到的(而且已经被其他人理解了):
库是你的代码中包含的东西。 而框架是您的应用程序的容器。
一个库实现了一个狭义范围的function,而一个框架往往是一个库的集合,提供了更广泛的function支持。 例如,库System.Drawing.dll处理绘图function,但只是整个.NET框架的一部分。
图书馆 – 可作为客户认为适合完成某项任务的任何类别或组件。
框架 – 要求你有一些指导方针来“插入”比你更大的东西。 您只需按照已发布的要求提供特定于您的应用程序/要求的部分,以便“framwework可以让您的生活变得轻松”
图书馆是为了便于使用和效率。你可以说,例如,Zend库帮助我们完成不同的任务,其定义良好的类和function。虽然框架是通常迫使某种方式实施解决scheme,如MVC(模型-view-controller) (参考) 。 它是一个定义明确的系统,用于分配MVC中的任务。模型包含数据库端,视图用于UI界面,控制器用于业务逻辑。
控制反转是使框架与图书馆不同的一个关键部分。 图书馆本质上是一组你可以调用的函数,这些函数通常组织成类。 每个调用都会做一些工作,并将控制权返回给客户端。
一个框架体现了一些抽象的devise,内置了更多的行为。为了使用它,你需要通过子类或插入你自己的类来将你的行为插入框架的不同位置。 框架的代码然后在这些地方调用你的代码。
框架可以由不同的库构成。 我们来举个例子。
比方说,你想煮咖喱鱼。 那么你需要像石油 , 香料和其他公用事业的成分。 你也需要鱼 ,这是你的基础准备你的菜(这是你的应用程序的数据)。 所有成分一起被称为框架 。 现在你可以一个接一个地用它们来制作咖喱鱼,这是你的最终产品 。 将其与由underscore.js , bootstrap.css , bootstrap.js , fontawesome , AngularJS等构成的Web框架进行比较。例如, Twitter Bootstrap v.35 。
现在,如果你只考虑一种成分,比如说说石油 。 你不能使用任何你想要的油,因为那样会毁了你的鱼(数据)。 你只能使用橄榄油 。 与underscore.js比较。 现在要使用什么品牌的油是由你决定的。 有些菜是用美国橄榄油 (underscore.js)或印度橄榄油 (lodash.js)制成的。 这只会改变你的应用程序的味道。 由于它们的用途几乎相同,因此它们的使用取决于开发人员的偏好,而且易于更换。
框架 :为您的应用程序提供独特属性和行为的库集合。 (所有成分)
图书馆 :为您的数据提供独特的属性和行为的一套明确定义的说明。 (油在鱼)
插件 :一个库(ui路由器 – > AngularJS)或许多库组合(dateselect器 – > bootstrap.css + jQuery)的实用程序构build没有它,你的插件现在可以按预期工作。
PS AngularJS是一个MVC框架,但一个JavaScript库。 因为我相信库扩展了本地技术的默认行为(在这种情况下是JavaScript)。
我认为你把这个区别放在了一个很好的位置上:这个框架提供了一个我们工作的框架……不知何故,它比一个简单的图书馆更“约束”。
该框架也应该为一组库增加一致性。
我认为库是一套实用程序来达到一个目标(例如,套接字,密码等)。 框架是库+运行时环境。 例如,ASP.NET是一个框架:它接受HTTP请求,创build页面对象,调用合并事件等。框架完成所有这些工作,您将编写一些代码,这些代码将在特定的生命周期目前的要求!
无论如何,非常interestering的问题!
我不记得这个答案的来源(我想我在互联网上find了.ppt),但答案很简单。
库和框架是一组类,模块和/或代码(取决于编程语言),可以在您的应用程序中使用,并帮助您解决特定的“问题”。
这个问题可以是在应用程序中logging或debugging信息,绘制图表,创build特定文件格式(html,pdf,xls),连接到数据库,创build应用程序的一部分或完整的应用程序或应用于devise模式 。
你可以有一个框架或一个图书馆来解决所有这些问题,更多的是,框架可以帮助你解决更复杂或更大的问题,但是它们的主要区别的后果,而不是两者的主要定义。
一个库和一个框架之间的主要区别是它们自己的代码之间的依赖关系,或者使用一个框架,你需要使用几乎所有的类,模块或代码在FW中,但是使用一个库你可以使用一个在你自己的应用程序中lib中没有几个类,模块或代码
这意味着,如果一个Framework有一个例子,为了在一个应用程序中使用这个框架,需要使用50个类,让我们说,在你的代码中,有10-15个或更多的类,因为那是怎么devise的一个框架,类(该类的对象)是框架中其他类中方法的input/参数。 查看.NET框架,Spring或任何MVC框架。
但是例如一个日志库,你可以在你的代码中使用一个Log类,并帮助你解决“日志logging问题”,这并不意味着日志库的代码中没有更多的类,比如类处理文件,处理屏幕输出甚至是数据库,但是你永远不会在你的代码中触及/使用那个类,这就是为什么是一个库而不是一个框架的原因。
还有比框架和图书馆更多的类别,但是这是脱离主题。
你的解释对我来说听起来相当不错…一个库可以是任何编译和自包含的用于其他代码重用的内容,它的内容几乎没有限制。
另一方面, 框架有望在应用程序开发的某些特定领域中使用一系列设施,就像您的示例MVC一样。