框架与工具包与库

use*_*846 300 terminology

框架,工具包和库之间有什么区别?

Jör*_*tag 451

最重要的区别,实际上库和框架之间的定义差异是控制反转.

这是什么意思?嗯,这意味着当你打电话给图书馆时,就掌握了.但是使用框架,控件被反转:框架会调用你.(这被称为好莱坞原则:不要打电话给我们,我们会打电话给你.)这几乎就是框架的定义.如果它没有控制反转,那它就不是一个框架.(我在看着你,.NET!)

基本上,所有控制流程都已经在框架中,并且只有一堆预定义的白点可以用代码填写.

另一方面,库是可以调用的功能集合.

我不知道术语工具包是否真的定义得很好.只是"套件"这个词似乎暗示了某种模块化,即一组可以选择的独立库.那么,什么使得工具包与一堆独立的库不同?集成:如果你只是有一堆独立的图书馆,也不能保证他们会很好地协同工作,而在工具箱库已经被设计为很好地协同工作-你只是没有使用所有这些的.

但这只是我对这个术语的解释.不同于库和框架,它明确的,我不认为有一个被广泛接受的定义工具.

  • 这可能是不正确的。框架可以但不必执行控制反转。你对 CSS 框架有什么看法?一个框架会默默地为你做很多事情,而无需你问。这就是它们不能与另一个同类框架组合的原因(如果您组合了 2 个 CSS 框架,请准备好迎接惊喜)。他们可以在没有您询问的情况下做的一件事是拥有应用程序的控制流。我认为@Sridhar-Sarnobat 的回答可能更好 (3认同)

Pas*_*ent 122

Martin Fowler在他关于控制反转的文章中讨论了库和框架之间的区别:

控制反转是使框架与库不同的关键部分.库本质上是一组可以调用的函数,这些日子通常组织成类.每个调用都会执行一些操作并将控制权返回给客户端.

框架体现了一些抽象设计,内置了更多行为.为了使用它,您需要通过子类化或插入自己的类将行为插入到框架中的各个位置.然后框架的代码在这些点上调用您的代码.

总结一下:您的代码调用库但框架调用您的代码.


Sri*_*bat 60

如果您是一个更直观的学习者,这里有一个更清晰的图表:

(学分:http://tom.lokhorst.eu/2010/09/why-libraries-are-better-than-frameworks)


小智 59

介绍

关于相关代码的集合有各种各样的术语,它们既有历史的(1994/5年前为本答案的目的)和当前的含义,读者应该意识到这两者,特别是在阅读关于计算/编程的经典文本时从历史时代开始.

图书馆

历史上和目前,库都是与特定任务相关的代码集合,或者是在大致相同的抽象级别上操作的一组密切相关的任务.它通常缺乏自己的任何目的或意图,并且旨在被(使用)使用并与客户端代码集成以帮助客户端代码执行它的任务.

工具包

从历史上看,工具包是一个更集中的库,具有明确的特定目的.目前,该术语已经失宠,并且几乎完全(对于本作者的知识)用于当前时代的图形小部件和GUI组件.工具包通常在比库更高的抽象层上运行,并且通常会自己使用和使用库.与库不同,工具包代码通常用于执行客户端代码的任务,例如构建窗口,调整窗口大小等.工具箱中较低级别的抽象要么是固定的,要么本身可以由客户端操作以被禁止的方式编码.(思考窗口样式,可以修复,也可以通过客户端代码预先更改.)

骨架

从历史上看,框架是一套相互关联的库和模块,它们分为"常规"或"特定"类别.通用框架旨在通过提供通用功能(例如跨平台内存管理,多线程抽象,动态结构(以及通用通用结构))来提供用于构建应用程序的全面且集成的平台.历史通用框架(没有依赖注入,见下文)几乎普遍被OO语言中的多态模板(参数化)打包语言产品所取代,例如STL for C++,或者用于非OO语言的打包库(保证的Solaris C头文件). ).一般框架在不同的抽象层运作,但普遍低级,

"特定"框架历史上是针对单个(但通常是庞大的)任务开发的,例如用于工业系统的"命令和控制"系统,以及早期的网络堆栈,并且在高级抽象操作下运行,并且类似工具包用于执行客户端代码任务.

目前,框架的定义已经变得更加集中,并且在其他地方提到的"控制反转"原则作为指导原则,因此程序流程以及执行由框架执行.然而,框架仍然针对特定输出; 例如,特定操作系统的应用程序(例如,用于MS Windows的MFC),或用于更通用的工作(例如Spring框架).

SDK:"软件开发套件"

SDK是一组工具,用于帮助程序员创建和部署代码/内容,这些代码/内容非常专门针对在非常特定的平台上运行或以非常特定的方式运行.SDK可以只包含一组库,这些库必须仅以客户端代码的特定方式使用,并且可以正常编译,最多可以创建或调整二进制资产以生成它的二进制工具集(SDK的)输出.

发动机

引擎(在代码集合术语中)是一个二进制文件,它将以某种方式运行定制内容或处理输入数据.游戏和图形引擎可能是这个术语中最普遍的用户,几乎普遍使用SDK来定位引擎本身,例如UDK(虚幻开发工具包),但也存在其他引擎,例如搜索引擎和RDBMS引擎.

引擎通常(但并非总是)只允许其客户端访问其中的一些内部.通常要么针对不同的架构,要么改变引擎输出的表示,要么用于调整目的.根据定义,开源引擎可以根据需要对客户进行更改和更改,并且某些适当的引擎可以完全修复.然而,世界上最常用的引擎几乎肯定是Javascript引擎.嵌入到每个浏览器的所有地方,都有一大堆JavaScript引擎,它们将javascript作为输入,处理它,然后输出到渲染.

API:"应用程序编程接口"

我回答的最后一个术语是我的个人问题:API,历史上用于描述应用程序或环境的外部接口,它本身能够独立运行,或者至少执行它的任务而无需任何必要的客户端干预初步执行后.诸如数据库,字处理器和Windows系统之类的应用程序将向外部接口公开一组固定的内部挂钩或对象,然后客户端可以调用/修改/使用它们以执行原始应用程序可以执行的功能.API在通过API提供的功能数量以及客户端代码(重新)使用了多少核心应用程序之间有所不同.(例如,文字处理API可能要求在客户端代码的每个实例运行时,或者可能只是其中一个链接库,将完整应用程序加载到后台; 而正在运行的窗口系统将创建内部对象以由其自身管理,并将句柄传递回客户端代码以代替使用.

目前,术语API具有更广泛的范围,并且通常用于描述该答案中的几乎所有其他术语.实际上,应用于该术语的最常见定义是API为另一个软件提供了一个签约的外部接口(API的客户端代码).实际上,这意味着API依赖于语言,并且具有由上述代码集之一提供的具体实现,例如库,工具箱或框架.为了查看特定区域,协议,例如,API与协议不同,协议是表示一组规则的更通用的术语,但是特定协议/协议套件的单独实现,其将外部接口暴露给其他软件通常被称为API.

备注

如上所述,上述术语的历史和当前定义已经发生了变化,这可以看作是对基础计算原理和范例的科学理解的进步,也归结为特定软件模式的出现.特别是,九十年代早期的GUI和Windowing系统帮助定义了许多这些术语,但是自从OS Kernel和Windowing系统有效混合用于大规模操作系统(也许是Linux),以及依赖注入的大量采用/将控制反转作为消费图书馆和框架的机制,这些术语必须改变各自的含义.


PS(一年后)

在仔细考虑了这个主题超过一年之后,我拒绝将IoC原则作为框架和库之间的定义区别.有许多受欢迎的作者说它是,但有几乎相同数量的人说它不是.有太多的"框架",不要使用IoC来说它是定义原则.对嵌入式或微控制器框架的搜索揭示了不使用IoC的全部过多而我现在认为.Net语言和CLR是"通用"框架的可接受的后代.说IoC是一个定义的特征,对我来说太过刻板,我害怕接受,并且拒绝任何将自己作为一个与上述历史表征相匹配的框架.

有关非IoC框架的详细信息,请参阅上面提到的许多嵌入式和微型框架,以及不通过该语言提供回调的语言中的任何历史框架(OK.回调可以被任何具有现代功能的设备攻击注册系统,但不是普通的程序员),显然,.net框架.


小智 59

Menzani和Barrass提供答案可能是最完整的.但是,可以更清楚地说明解释.大多数人都错过了这些都是嵌套概念的事实.所以让我为你准备.

编写代码时:

  • 最终你会发现你在程序中重复的代码段,所以你将它们重构为函数/方法.
  • 最后,在编写了一些程序之后,您会发现自己将已经创建的函数复制到新程序中.为了节省您的时间,您可以将这些功能捆绑到库中.
  • 最终你发现每次使用某些库时都会创建相同类型的用户界面.因此,您重构您的工作并创建一个Toolkit,允许您通过泛型方法调用更轻松地创建UI.
  • 最后,你编写了很多使用相同工具包和库的应用程序,你创建了一个框架,它已经提供了这个样板代码的通用版本,所以你需要做的就是设计UI的外观并处理那些事件.用户交互的结果.

一般来说,这完全解释了术语之间的差异.

  • 这是一个很好的答案,如果有更多人阅读这篇文章,他们就会对它进行投票.很高兴你发布了这个. (4认同)

Jor*_*mer 13

库只是包含在包中的方法/函数的集合,可以将其导入到代码项目中并重新使用.

框架是一个健壮的库或库集合,为您的代码提供"基础".框架遵循控制反转模式.例如,.NET框架是一个大型的内聚库集合,您可以在其中构建应用程序.你可以说框架和库之间没有太大的区别,但是当人们说"框架"时,它通常意味着一个更大,更强大的库套件,它将成为应用程序不可或缺的一部分.

我认为工具包的方式与我对SDK的看法相同.它附带了文档,示例,库,包装器等.再次,您可以说这与框架相同,您可能会这样做.

它们几乎都可以互换使用.


Jak*_*tad 5

非常非常相似,框架通常比库更加开发和完善,而工具包可以简单地是类似的库和框架的集合.

一个非常好的问题,甚至可能是最微小的主观性质,但我相信这是我能给出的最佳答案.