框架和库有什么区别?
我一直认为库是一组对象和函数,专注于解决特定问题或应用程序开发的特定领域(即数据库访问); 另一方面,框架是一个以特定方法(即MVC)为中心的图书馆集合,涵盖了应用程序开发的所有领域.
阿库执行特定的,定义良好的操作.
甲框架是一个骨架,其中应用程序通过填写骨架定义的操作的"肉".骨架仍然具有链接部件的代码,但最重要的工作是由应用程序完成的.
库的示例:网络协议,压缩,图像处理,字符串实用程序,正则表达式评估,数学.操作是独立的.
框架示例: Web应用程序系统,插件管理器,GUI系统.框架定义了概念,但应用程序定义了最终用户关心的基本功能.
实际上,根据使用的上下文,这些术语可能意味着很多不同的东西.
例如,在Mac OS X上,框架只是库,打包成一个包.在捆绑包中,您将找到一个实际的动态库(libWhatever.dylib).裸库和Mac上的框架之间的区别在于框架可以包含多个不同版本的库.它可以包含额外的资源(图像,本地化字符串,XML数据文件,UI对象等),除非框架是公开发布的,否则它通常包含使用库所需的.h文件.
因此,您需要在应用程序中使用库中的所有内容(C/C++/Objective-C库,没有.h文件是没用的,除非您根据一些库文档自己编写),而不是一堆文件要移动(Mac包只是Unix级别的一个目录,但是UI将它视为单个文件,就像你在Java中使用JAR文件一样,当你点击它时,你通常看不到什么在里面,除非你明确选择显示内容).
维基百科称框架为"流行语".它将软件框架定义为
软件框架是软件系统(或子系统)的可重用设计.软件框架可以包括支持程序,代码库,脚本语言或其他软件,以帮助开发和粘合软件项目的不同组件.框架的各个部分可以通过API公开.
所以我说一个图书馆就是那个"图书馆".它是对象/函数/方法的集合(取决于您的语言),并且您的应用程序"链接"它,因此可以使用对象/函数/方法.它基本上是一个包含可重用代码的文件,通常可以在多个应用程序之间共享(您不必一遍又一遍地编写相同的代码).
框架可以是您在应用程序开发中使用的所有内容.它可以是库,许多库的集合,脚本集合,也可以是创建应用程序所需的任何软件.框架只是一个非常模糊的术语.
这是一篇关于" 图书馆与框架 " 主题的文章.我个人认为这篇文章具有很强的争议性.他在那里说的并不错,但是,他只是挑选出框架的多个定义之一,并将其与经典的库定义进行比较.例如,他说你需要一个子分类框架.真?我可以在库中定义一个对象,我可以链接它,并在我的代码中对它进行子类化.我不知道我需要一个"框架".他在某种程度上解释了如何使用术语框架.正如我之前所说,这只是一个炒作的词.有些公司只发布了一个普通的库(在任何意义上都是经典库)并将其称为"框架",因为它听起来更加花哨.
我认为主要区别在于框架遵循" 好莱坞原则 ",即"不要打电话给我们,我们会打电话给你".
根据Martin Fowler的说法:
一个库实际上是一组的,你可以调用的函数,这些天通常分为类.每个调用都会执行一些操作并将控制权返回给客户端.
一个框架体现了一些抽象的设计,内置了更多的功能,而且为了使用它,你需要插入您的行为变成可以通过继承或者在您自己的类插入框架中的各个地方.然后框架的代码在这些点上调用您的代码.
你叫图书馆.
框架打电话给你.
図书馆助け
足场が痛い
多くの涙
这仅仅是一个集合的例程(函数式编程)或类定义(面向对象编程).背后的原因只是代码重用,即获取已由其他开发人员编写的代码.类或例程通常在特定于域的区域中定义特定操作.例如,有一些数学库可以让开发人员只需调用函数而无需重做算法如何工作的实现.
在框架中,所有的控制流都已存在,并且我们应该用我们的代码填写一堆预定义的白点.框架通常更复杂.它定义了一个框架,应用程序定义了自己的特征以填充框架.通过这种方式,适当时框架将调用您的代码.好处是开发人员不需要担心设计是否良好,而只需要实现特定于域的功能.
库和框架之间的关键区别是"控制反转".当您从库中调用方法时,您就可以控制它.但是使用框架,控件被反转:框架会调用你.资源.
它们都定义了API,用于程序员使用.将这些组合在一起,我们可以将库视为应用程序的某个功能,将框架视为应用程序的框架,API是将这些组合在一起的连接器.典型的开发过程通常从框架开始,并通过API填写库中定义的函数.
正如我一直描述的那样:
图书馆是一种工具.
框架是一种生活方式.
一个库,你可以使用任何微小的部分帮助你.您必须将整个项目提交到的框架.
我喜欢Cohens的回答,但更技术性的定义是:你的代码调用了一个库.框架调用您的代码.例如,GUI框架通过事件处理程序调用您的代码.Web框架通过一些请求 - 响应模型调用您的代码.
这也称为控制反转 - 突然,框架决定何时以及如何执行代码而不是像库那样反过来.这意味着框架对您构建代码的方式也会产生更大的影响.
从Web开发人员的角度:
图书馆可以很容易地被另一个图书馆替换.但框架不能.
如果您不喜欢jquery日期选择器库,则可以使用其他日期选择器替换,例如bootstrap日期选择器或pickadate.
如果您不喜欢构建产品的AngularJS,则不能只替换任何其他框架.您必须重写整个代码库.
与Frameworks相比,大多数库的学习曲线要少得多.例如:underscore.js是一个库,Ember.js是一个框架.
我忘记了我看到这个定义的地方,但我觉得它很不错.
库是您从代码中调用的模块,框架是调用代码的模块.
框架可以由不同的库组成.我们来举个例子吧.
假设你想煮咖喱鱼.然后你需要油,香料和其他工具等成分.您还需要鱼,这是您准备菜肴的基础(这是您的应用数据).所有成分一起称为框架.现在你将逐一或组合使用它们来制作你最终产品的鱼咖喱.相比之下,与一个web框架,其由选自underscore.js,bootstrap.css,bootstrap.js,fontawesome,AngularJS等有关示例,Twitter的引导V.35.
现在,如果你只考虑一种成分,比如说油.你不能使用你想要的任何油,因为它会破坏你的鱼(数据).你只能使用橄榄油.将其与underscore.js进行比较.现在你想要使用什么牌子的油取决于你.有些菜是用美国橄榄油(underscore.js)或印度橄榄油(lodash.js)制作的.这只会改变您的应用程序的味道.由于它们的用途几乎相同,因此它们的使用取决于开发人员的偏好,并且它们易于更换.
框架:一组库,为您的应用程序提供独特的属性和行为.(所有成分)
库:一组定义明确的指令,为数据提供独特的属性和行为.(油炸鱼)
插件:用于库(ui-router - > AngularJS)的实用程序构建或组合的许多库(日期选择器 - > bootstrap.css + jQuery),没有这些库,您的插件现在可以按预期工作.
PS AngularJS是一个MVC框架,但是一个JavaScript库.因为我相信Library扩展了本机技术的默认行为(在本例中为JavaScript).
这就是我对它的看法(并且已经看到其他人合理化):
库是代码中包含的内容.框架是应用程序的容器.
这里链接了Joel Spolsky的一篇痛苦的文章,但是在工具箱,库,框架等之间有很好的区别.
库实现了狭义目的的功能,而框架往往是一组库,为更广泛的功能提供支持.例如,库System.Drawing.dll处理绘图功能,但只是整个.NET框架的一部分.
库 - 可以用作客户端认为适合完成某项任务的任何类或组件集.
框架 - 强制要求您"插入"比您更大的东西.您只需按照公布要求的方式提供特定于您的应用/要求的作品,以便"framwework可以让您的生活变得轻松"
库是为了易于使用和提高效率.例如,Zend库可以帮助我们通过定义良好的类和函数来完成不同的任务.虽然框架通常会强制实现某种解决方案,例如MVC(模型) -view-controller)(参考).它是一个定义良好的系统,用于分配任务,如MVC.Model包含数据库端,视图用于UI接口,控制器用于业务逻辑.
我认为你很好地掌握了差异:框架提供了一个我们工作的框架......不知何故,它比一个简单的库更"约束".
该框架还应该为一组库增加一致性.
我认为库是一组实现目标的实用程序(例如,套接字,加密等).框架是库+ RUNTIME EINVIRONNEMENT.例如,ASP.NET是一个框架:它接受HTTP请求,创建页面对象,调用lyfe cicle事件等.框架完成所有这些,你编写了一些代码,这些代码将在生命周期的特定时间运行目前的要求!
无论如何,非常令人兴奋的问题!
我不记得这个答案的来源(我想我在互联网上的.ppt中找到了它),但答案很简单.
图书馆和框架是一组类,模块和/或可以在你的应用程序中使用,并帮助您解决一个especific"问题"码(取决于编程语言的).
该问题可以是在应用程序中记录或调试信息,绘制图表,创建特定文件格式(html,pdf,xls),连接到数据库,创建应用程序的一部分或完整的应用程序或应用于设计模式.
你可以有一个框架或一个库来解决所有这些问题以及更多,通常框架可以帮助你解决更复杂或更大的问题,但这是他们主要差异的结果,而不是两者的主要定义.
图书馆和框架之间的主要区别在于他们自己的代码之间的依赖关系,或者使用框架,你需要使用几乎所有的类,模块或代码在FW中,但是使用库你可以使用一个或者您自己的应用程序中的lib中很少有类,模块或代码
这意味着,如果一个框架有,例如有50个类,以便在你需要使用的应用程序中使用该框架,那就说,代码中有10-15个或更多的类,因为这就是如何设计一个框架,一些类(该类的对象)是框架中其他类中的方法的输入/参数.请参阅.NET框架,Spring或任何MVC框架.
但是例如一个日志库,你可以在你的代码中使用一个Log类,并帮助你解决"日志记录问题",这并不意味着日志库在他的代码中没有更多类,比如类处理文件,处理屏幕输出,甚至数据库,但你永远不会触摸/使用代码中的类,这就是为什么是库而不是框架的原因.
而且还有比Frameworks和Libraries更多的类别,但这不是主题.