什么是框架和库的区别?
我认为库是一组对象和函数,专注于解决特定问题或特定应用程序开发领域(例如数据库访问);而框架则是基于特定方法论(例如MVC)的库集合,并覆盖应用程序开发的所有领域。
什么是框架和库的区别?
我认为库是一组对象和函数,专注于解决特定问题或特定应用程序开发领域(例如数据库访问);而框架则是基于特定方法论(例如MVC)的库集合,并覆盖应用程序开发的所有领域。
库执行特定且明确定义的操作。
框架是一个骨架,应用程序通过填写骨架来定义操作的“核心”。框架仍然有连接各个部分的代码,但最重要的工作是由应用程序完成。
库的示例:网络协议、压缩、图像处理、字符串实用程序、正则表达式评估、数学。操作是自包含的。
框架的示例:Web应用程序系统、插件管理器、GUI系统。框架定义了概念,但应用程序定义了最终用户关心的基本功能。
实际上,这些术语根据它们被使用的上下文意义不同。
例如,在Mac OS X中,框架只是打包成束的库。在束中,您将找到一个真正的动态库(libWhatever.dylib)。Mac上裸库和框架之间的区别在于,框架可以包含多个不同版本的库。它可以包含额外的资源(图像、本地化字符串、XML数据文件、UI对象等),并且除非框架发布到公共环境,否则通常包含使用库所需的必要 .h 文件。
因此,您可以在单个软件包中获得使用库所需的所有内容(C/C++/Objective-C库没有.h文件就几乎没用,除非您根据某个库的文档自己编写.h文件),而不是一堆需要移动的文件(Mac捆绑包只是Unix级别上的一个目录,但UI将其视为单个文件,就像在Java中有JAR文件,当您单击它时,通常看不到内部,除非您明确选择显示内容)。
维基百科将框架称为“流行词”。它定义了一个软件框架为
软件框架是软件系统(或子系统)的可重用设计。软件框架可能包括支持程序、代码库、脚本语言或其他软件,以帮助开发和粘合软件项目的不同组件。框架的各个部分可以通过API公开..
因此,我认为库只是一个“库”。它是一组对象/函数/方法(取决于您使用的语言),您的应用程序会“链接”到它,并因此可以使用该对象/函数/方法。它基本上是包含可重用代码的文件,通常可以在多个应用程序之间共享(您不必一遍又一遍地编写相同的代码)。
框架可以是您在应用程序开发中使用的所有内容。它可以是一个库、许多库的集合、脚本的集合或任何需要创建应用程序的软件。框架只是一个非常模糊的术语。
这是一篇关于“库与框架”话题的文章。我个人认为这篇文章存在争议。他所说的并没有错,但他只挑选了框架的多个定义之一,并将其与传统的库定义进行比较。例如,他说你需要一个框架来实现子类化。真的吗?我可以在库中定义一个对象,将其链接到我的代码中,并对其进行子类化。我不明白我为什么需要一个“框架”。在某种程度上,他解释了当今如何使用“框架”这个词。正如我之前所说,它只是一个炒作的词语。有些公司发布普通的库(在任何经典库的意义上),并称其为“框架”,因为这听起来更加花哨。
我认为主要的区别在于框架遵循“好莱坞原则”,即“不要打电话给我们,我们会打电话给你”。
根据Martin Fowler的说法:
库本质上是一组可以调用的函数,这些天通常组织成类。每次调用都会执行一些操作并将控制返回给客户端。
框架体现了一些抽象的设计,并内置更多行为。为了使用它,您需要通过子类化或插入自己的类将您的行为插入到框架的各个位置中。然后框架的代码在这些点调用您的代码。
它只是一组例程(函数式编程)或类定义(面向对象编程)。其背后的原因就是简单的代码重用,即获取其他开发人员已经编写的代码。这些类或程序通常定义特定领域中的特定操作。例如,有一些数学库,可以让开发人员调用函数而无需重新实现算法工作原理。
在框架中,所有控制流程都已经存在,并且有一堆预定义的白点,我们应该用我们的代码填充。框架通常更加复杂。它定义了一个骨架,在其中应用程序定义自己的功能以填充骨架。这样,当适当时,框架将调用您的代码。优点在于开发人员不需要担心设计是否好,而只需要关注实现特定领域的功能。
图书馆和框架之间的关键区别是“反转控制”。当您从库中调用方法时,您有控制权。但是对于框架,控制被反转:框架调用您。资源。
它们两者都定义了API,供程序员使用。将它们放在一起,我们可以将图书馆视为应用程序的某个函数,将框架视为应用程序的骨架,而API是将它们组合在一起的连接器。典型的开发过程通常从框架开始,然后通过API填充库中定义的函数。
如我一直所描述的:
库(Library)是一种工具。
框架(Framework)则是一种生活方式。
你可以使用库中任何有用的小部分。但如果使用框架,则必须将整个项目致力于它。
从 Web 开发者的角度来看:
库(Library)可以很容易地被另一个库替换,但框架(Framework)不能。
如果您不喜欢 jQuery 的日期选择库,可以使用其他日期选择器,比如 Bootstrap 日期选择器或 Pickadate。
如果您不喜欢构建产品所使用的 AngularJS 框架,就不能随意使用其他框架进行替换。您必须重写整个代码库。
大多数情况下,与框架相比,库需要较少的学习曲线。例如:underscore.js 是一个库,Ember.js 是一个框架。
我喜欢Cohen的回答,但更技术性的定义是:您的代码调用了一个库。 框架调用您的代码。例如,GUI框架通过事件处理程序调用您的代码。Web框架通过某些请求-响应模型调用您的代码。
这也被称为控制反转 - 突然之间,框架决定何时如何执行您的代码,而不是与库相反。这意味着框架对您必须如何组织代码有更大的影响。
我记不得在哪里看到这个定义了,但我觉得它很好。
一个库是你从代码中调用的模块,而框架是调用你的代码的模块。
一个框架可以由不同的库组成。让我们举个例子。
假设你想要煮一道咖喱鱼。那么你需要像油、香料和其他工具这样的材料。你还需要鱼作为准备菜肴的基础原料(这是你的应用程序数据)。所有这些材料一起构成了一个框架。现在你可以逐个使用它们或组合在一起来制作咖喱鱼,这就是你的最终产品。把这个比作Web框架,由underscore.js、bootstrap.css、bootstrap.js、fontawesome、AngularJS等组成。例如,Twitter Bootstrap v.35。
现在,如果你只考虑其中一个材料,比如油。你不能随便使用任何一种油,否则会破坏你的鱼(数据)。你只能使用橄榄油。将其与underscore.js进行比较。现在你想要使用哪个品牌的油取决于你自己。某些菜肴是用美国橄榄油(underscore.js)或印度橄榄油(lodash.js)制作的。这只会改变你的应用程序的味道。由于它们几乎提供相同的功能,所以它们的使用取决于开发者的个人喜好,并且很容易替换。
框架:一组库,为您的应用程序提供独特的属性和行为。(所有材料)
库:一组精确定义的指令,为您的数据提供独特的属性和行为。(加在鱼上的油)
插件: 是为了一个库(如ui-router -> AngularJS)或多个库的组合(如 date-picker -> bootstrap.css + jQuery)而构建的实用工具,如果没有它,你的插件可能无法按预期工作。
P.S. AngularJS是一个MVC框架,但也是一个JavaScript库。因为我相信库扩展了本地技术(在这种情况下是JavaScript)的默认行为。
以下是我的理解(也是一些人的共识):
库(Library)是代码中包含的内容,而框架(Framework)则是应用程序的容器。