框架和库有什么区别?

框架图书馆有什么区别?

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

399907 次浏览

图书馆执行特定的、定义良好的操作。

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

图书馆示例:网络协议、压缩、图像处理、字符串实用程序、正则表达式求值、数学。操作是自包含的。

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

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

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

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

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

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

正如我一直描述的那样:

图书馆是一个工具。

框架是一种生活方式。

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

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

根据martinfowler

A图书馆本质上是一组您可以调用的函数,这些三天通常组织成班级。每次调用都会做一些工作并返回控制客户端。

A框架体现了一些抽象设计,内置更多行为。为了使用它,您需要插入你的行为在不同的地方通过子类化或通过插上自己的课。这个框架的代码然后调用你的代码在这种情况下

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

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

我认为库是实现目标的一组实用程序(例如,套接字、密码学等)。

框架是库+运行时环境。例如,ASP.NET是一个框架:它接受HTTP请求、创建页面对象、调用生命周期事件等。框架完成了所有这些,你编写了一些代码,这些代码将在当前请求生命周期的特定时间运行!

这是我对它的看法(并被其他人合理化):

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

还有比框架和库更多的类别,但这是离题的。

图书馆:

它只是例程(函数式编程)或类定义(面向对象程序设计)中的收藏。背后的原因很简单代码复用,即获取其他开发人员已经编写的代码。类或例程通常定义域特定区域中的特定操作。例如,有一些数学库可以让开发人员只需调用函数,而无需重做算法的实现。

框架:

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

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

库、框架和你的代码映像关系

关键区别:

库和框架之间的关键区别是控制反转。当您从库调用方法时,您处于控制之中。但是使用框架,控制是颠倒的:框架要求你来源。

关系:

他们两个都定义了API,供程序员使用。把它们放在一起,我们可以把库想象成应用程序的某个功能,框架作为应用程序的骨架,API是把它们放在一起的连接器。典型的开发过程通常从框架开始,通过API填写库中定义的函数。

库是为了易于使用和效率。例如,你可以说Zend库通过其定义良好的类和功能帮助我们完成不同的任务。而框架通常是强制以某种方式实现解决方案的东西,如MVC(模型-视图-控制器)(参考)。它是一个定义良好的系统,用于分配任务,如在MVC中。模型包含数据库端,视图用于用户界面,控制器用于业务逻辑。

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

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

    如果您不喜欢jQuery日期选择器库,您可以替换为其他日期选择器,例如bootstrap date picker或Picadate。

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

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

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

假设你想做咖喱鱼。然后你需要像石油这样的配料,香料和其他公用事业。你还需要,这是你准备菜肴的基础(这是你的应用程序的数据)。所有的配料一起称为框架。现在你要一个接一个地使用它们,或者组合使用你的咖喱鱼,这是你的<强>最终产品。将其与underscore.jsbootstrap.cssbootstrap.js香料0,香料1等制成的web框架进行比较。例如,香料2。

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

输入图片描述


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

图书馆:一组定义良好的指令,为您的数据提供独特的属性和行为。

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


P. S. AngularJS是一个MVC框架,但却是一个JavaScript库。因为我相信Library扩展了原生技术的默认行为(在这种情况下是JavaScript)。

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

假设你不久前在你的城市开了一家汉堡店。但是你觉得作为初学者做汉堡太难了。你在想一种简单的方法为顾客做汉堡。有人告诉你,如果你使用框架,你可以轻松地制作bugger。你得知道有麦当劳汉堡框架汉堡王汉堡框架。

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

如果你使用BurgerKing汉堡框架,制作Whopper汉堡很容易(但是,你不能制作巨无霸)

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

你也听说过有一种叫做简单汉堡-帕蒂图书馆的东西。

如果您使用此库,您可以轻松制作任何汉堡肉饼(X2速度)。如果你使用麦当劳汉堡框架或汉堡王汉堡框架并不重要。无论哪种方式,你仍然可以使用这个简单汉堡-帕蒂图书馆。(即使你可以在没有框架的情况下使用这个库。)

你现在看到框架图书馆之间的区别了吗?


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

如果你开始使用JavaSpring Framework构建Web应用程序,那么以后很难(也许不可能)更改为Ruby on Rails Framework。

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

库与框架

Martin Fowler-InversionOfControl

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

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

your code ->(has) Library API

FrameworkInversion of Control(IoC) container关于我们更重要。框架解决了广泛系列任务(特定于领域),你将此任务委托给框架。IoC-你的代码依赖于框架逻辑,事件…结果框架调用你的代码。它迫使你的代码坚持它的规则(实现/扩展协议/接口/契约),传递lambda…例如-测试、GUI、DI框架…

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

[iOS库与框架]

[DIP vs DI vs IoC]

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

  • 图书馆:一组相关的过程和类组成了可重用的实现;
  • 框架:由模板方法组成的一组协作类可重用规范。它设置控制流,并允许通过在子类中覆盖框架类中模板方法调用的钩子方法来钩子到该流中,从而根据特定问题定制框架。

特定于问题的代码可以使用库和实施框架。

真的,这取决于你给术语下了什么定义。可能有很多不同的定义。

我认为以下是基于我认为这个术语所指的很好的解释:

确定性库

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

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

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

不确定库

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

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

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

框架

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

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

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

什么是图书馆?

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

什么是框架?

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