What is the difference between a framework and a library?
框架和库有什么区别?
我一直认为库是一组专注于解决特定问题或特定应用程序开发领域(即数据库访问)的对象和函数;另一方面,它是一组以特定方法(即MVC)为中心、涵盖所有应用程序开发领域的库。
库执行特定的、定义良好的操作。
框架是应用程序通过填充框架来定义操作的"肉"的框架。骨架仍然有代码连接各个部分,但最重要的工作是由应用程序完成的。
库示例:网络协议、压缩、图像处理、字符串实用程序、正则表达式计算、数学。操作是独立的。
框架示例:Web应用系统、插件管理器、GUI系统。框架定义了概念,但应用程序定义了最终用户关心的基本功能。
实际上,这些术语的含义可能有很多不同,这取决于它们所使用的上下文。
例如,在MacOSX框架上,只是库,打包成一个包。在这个包中,您将发现一个实际的动态库(libwhatever.dylib)。裸库和Mac上的框架的区别在于框架可以包含库的多个不同版本。它可以包含额外的资源(图像、本地化字符串、XML数据文件、UI对象等),并且除非框架公开,否则它通常包含需要使用库的.h文件。
因此,在一个包中,你需要在你的应用程序中使用任何一个包(没有C/H文件的C/C++/ObjuleC C库是非常无用的,除非你根据一些库文档自己编写),而不是一堆文件来移动(MAC包只是UNIX级别上的一个目录,但是UI处理)。它就像一个文件,就像你在爪哇有JAR文件一样,当你点击它时,你通常看不到里面是什么,除非你显式选择显示内容。
维基百科称框架为"时髦词汇"。它将软件框架定义为
A software framework is a re-usable
design for a software system (or
subsystem). A software framework may
include support programs, code
libraries, a scripting language, or
other software to help develop and
glue together the different components
of a software project. Various parts
of the framework may be exposed
through an API..
所以我认为图书馆就是"图书馆"。它是对象/函数/方法(取决于您的语言)和应用程序"链接"的集合,因此可以使用对象/函数/方法。它基本上是一个包含可重用代码的文件,通常可以在多个应用程序之间共享(您不必反复编写相同的代码)。
框架可以是应用程序开发中使用的一切。它可以是一个库、多个库的集合、脚本的集合或创建应用程序所需的任何软件。框架只是一个非常模糊的术语。
这是一篇关于"图书馆与框架"这一主题的文章。我个人认为这篇文章很有争议。他在这里所说的并不是错的,不过,他只是挑选了框架的多种定义中的一种,并将其与经典的库定义进行了比较。例如,他说你需要一个分类框架。真的?我可以在一个库中定义一个对象,链接它,并在代码中对它进行子类化。我不明白我需要一个"框架"来实现这一点。在某种程度上,他更确切地解释了"框架"这个词在当今是如何使用的。正如我之前所说,这只是一个炒作的词。一些公司仅仅发布了一个普通的库(在任何意义上都是经典的库),并称之为"框架",因为它听起来更花哨。
我认为主要的区别是框架遵循"好莱坞原则",即"不要打电话给我们,我们会打电话给你"。
根据马丁·福勒的说法:
A library is essentially a set of
functions that you can call, these
days usually organized into classes.
Each call does some work and returns
control to the client.A framework embodies some abstract
design, with more behavior built in.
In order to use it you need to insert
your behavior into various places in
the framework either by subclassing or
by plugging in your own classes. The
framework's code then calls your code
at these points.
你叫图书馆。
框架调用您。
図書館 助け
足場が痛い
多くの涙
图书馆:
它只是例程(函数式编程)或类定义(面向对象编程)的集合。背后的原因只是代码重用,即获取已经由其他开发人员编写的代码。类或例程通常定义域特定区域中的特定操作。例如,有一些数学库可以让开发人员在不重新实现算法工作方式的情况下调用函数。
框架:在框架中,所有的控制流都已经存在了,并且有一堆预定义的白点,我们应该用代码来填充它们。框架通常更复杂。它定义了一个骨架,应用程序在其中定义自己的特性来填充骨架。这样,框架将在适当的时候调用您的代码。其好处是,开发人员不需要担心设计是否好,而只需要考虑实现特定于领域的功能。
库、框架和代码图像表示:KeyDifference:库和框架的关键区别在于"控制反转"。当您从库中调用方法时,您处于控制中。但是有了框架,控制权就颠倒了:框架调用您。来源。
关系:它们都定义了API,供程序员使用。要将它们放在一起,我们可以将库看作是应用程序的某种功能,将框架看作应用程序的框架,而API则是将它们放在一起的连接器。典型的开发过程通常从一个框架开始,并通过API填充库中定义的函数。
正如我一直描述的那样:
图书馆是一种工具。
框架是一种生活方式。
一个图书馆,你可以使用任何小的部分帮助你。必须将整个项目提交到的框架。
我喜欢科恩的回答,但更技术化的定义是:您的代码调用一个库。框架调用代码。例如,一个GUI框架通过事件处理程序调用代码。Web框架通过一些请求-响应模型调用代码。
这也被称为控制反转——框架会突然决定何时以及如何执行代码,而不是像使用库那样以另一种方式执行代码。这意味着框架对如何构造代码也有更大的影响。
从Web开发人员的角度来看:
库可以很容易地被另一个库替换。但是框架不能。
如果不喜欢jquery日期选取器库,可以用其他日期选取器替换,如引导日期选取器或选取器。
如果您不喜欢构建产品的AngularJS,那么您就不能用任何其他框架来替换它。您必须重写整个代码库。
与框架相比,大多数库的学习曲线要少得多。例如:underline.js是一个库,ember.js是一个框架。
我忘了我在哪里看到这个定义,但我觉得它很好。
库是从代码调用的模块,框架是调用代码的模块。
我就是这样想的(并且已经看到别人合理化了):
库是代码中包含的内容。框架是应用程序的容器。
框架可以由不同的库组成。让我们举个例子。
假设你想做一个鱼肉咖喱。然后你需要一些原料,比如油、香料和其他实用工具。您还需要鱼,这是您准备菜的基础(这是您的应用程序的数据)。所有成分一起称为框架。现在你要一个接一个地使用它们或者把它们组合起来做你的鱼咖喱,这是你的最终产品。将其与由underline.js、bootstrap.css、bootstrap.js、fontawome、angularjs等组成的Web框架进行比较。例如,Twitter bootstrap v.35。
现在,如果你只考虑一种成分,比如说油。你不能使用任何你想要的油,因为那样会毁了你的鱼(数据)。你只能用橄榄油。将其与underline.js进行比较。现在你想用什么牌子的油取决于你自己。有些菜是用美国橄榄油(underline.js)或印度橄榄油(lodash.js)做的。这只会改变您的应用程序的味道。因为它们的用途几乎相同,所以它们的使用取决于开发人员的偏好,并且它们很容易被替换。
Framework : A collection of libraries which provide unique properties and behavior to your application. (All ingredients)
Library : A well defined set of instructions which provide unique properties and behavior to your data. (Oil on Fish)
Plugin : A utility build for a library (ui-router -> AngularJS) or many libraries in combination (date-picker -> bootstrap.css + jQuery) without which your plugin might now work as expected.
P.S.AngularJS是一个MVC框架,但却是一个JavaScript库。因为我相信库扩展了本地技术的默认行为(在本例中是JavaScript)。
这里链接了JoelSpolsky的一篇苦涩的文章,但包含了工具箱、库、框架等之间的良好区别。
库是为了方便使用和提高效率。例如,Zend库通过其定义良好的类和函数帮助我们完成不同的任务。而框架通常是强制实现某种解决方案的某种方法,如MVC(模型视图控制器)(参考)。它是一个定义良好的任务分配系统,例如在MVC中,模型包含数据库端、视图用于UI接口、控制器用于业务逻辑。
库-客户认为适合完成某项任务的任何一组类或组件。框架——要求你"插入"到比你更大的东西上。你只需要以一种公开的、必要的方式提供特定于你的应用程序/需求的片段,这样"框架工作可以让你的生活变得容易"
库实现的功能范围很窄,而框架往往是一组库,为更广泛的功能提供支持。例如,library system.drawing.dll处理绘图功能,但只是整个.NET框架的一部分。
我不记得这个答案的来源(我想我是在互联网上的.ppt中找到的),但答案很简单。
库和框架是一组类、模块和/或代码(取决于编程语言),可以在应用程序中使用,并帮助您解决特定的"问题"。
这个问题可以是在应用程序中记录或调试信息、绘制图表、创建特定的文件格式(HTML、PDF、XLS)、连接到数据库、创建应用程序的一部分、完整的应用程序或应用于设计模式的代码。
你可以有一个框架或者一个库来解决所有这些问题,而且更多的,正常的框架帮助你解决更复杂或者更大的问题,但是这是它们主要区别的连续性,而不是两者的主要定义。
The main difference betwen a Library and a Framework is the dependency betwen their own code, in oder words to use a Framework you
need to use almost all the classes, modules or code in the FW, but to
use a Library you can use one or few classes, modules or code in the
lib in your own application
这意味着,如果一个框架有50个类,例如为了在应用程序中使用框架,你需要在代码中使用10-15个或更多的类,因为这就是框架的设计方式,一些类(该类的对象)是框架中其他类的方法的输入/参数。请参见.NET框架、Spring或任何MVC框架。
但是,例如日志库,您可以在代码中使用日志类,并帮助您解决"日志问题",这并不意味着日志库的代码中没有更多的类,比如处理文件、处理屏幕输出甚至数据库的类,但是您从不在代码中触摸/使用这些类,这就是为什么是图书馆而不是框架?
此外,还有比框架和库更多的类别,但这不是主题。
我认为您很好地确定了区别:框架提供了一个框架,我们在其中执行工作…不知何故,它比一个简单的库更具有"约束性"。框架还应该向一组库添加一致性。
我认为库是一组实现目标的实用程序(例如,套接字、加密等)。框架是library+runtime einvironnement。例如,ASP.NET是一个框架:它接受HTTP请求、创建页面对象、调用lyfe cicle事件等。框架完成了所有这些操作,您编写了一些代码,这些代码将在当前请求生命周期的特定时间运行!
不管怎样,这个问题很有趣!
你的解释对我来说很好…一个库可以是任何编译的、自包含的、可在其他代码中重用的东西,实际上它的内容没有任何限制。
另一方面,框架应该有一系列的工具,可以在应用程序开发的特定领域中使用,就像您的示例MVC一样。