首页 文章

框架与工具包与库[重复]

提问于
浏览
281

这个问题在这里已有答案:

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

12 回答

  • 50

    最重要的区别,实际上库和框架之间的定义差异是Inversion of Control .

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

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

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

    我不必全部使用它们 .

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

  • 2

    Martin Fowler在他的文章Inversion of Control中讨论了库和框架之间的区别:

    控制反转是使框架与库不同的关键部分 . 库本质上是一组可以调用的函数,这些日子通常组织成类 . 每个调用都会执行一些操作并将控制权返回给客户端 . 框架体现了一些抽象设计,内置了更多行为 . 为了使用它,您需要通过子类化或插入自己的类将行为插入到框架中的各个位置 . 然后框架的代码在这些点上调用您的代码 .

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

  • 3

    简介

    关于相关代码的集合有各种各样的术语,它们既有历史的(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 .

    备注

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


    P.S. (一年后)

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

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

  • 0

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

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

  • 426

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

    编写代码时:

    • 最终你会发现你在程序中重复的代码段,所以你将它们重构为 Functions/Methods .

    • 最终,在编写了几个程序之后,您发现自己将已经创建的函数复制到新程序中 . 为了节省您的时间,您可以将这些功能捆绑到 Libraries 中 .

    • 最终你发现每次使用某些库时都会创建相同类型的用户界面 . 所以你重构你的工作并创建一个 Toolkit ,它允许你从泛型方法调用中更容易地创建你的UI .

    • 最后,你写了很多应用程序使用相同的工具包和库,你创建了一个 Framework ,它已经提供了这个样板代码的通用版本,所以你需要做的就是设计UI的外观并处理事件这是用户互动的结果 .

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

  • 53

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

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

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

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

  • 13

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

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

  • 5

    Library

    我认为一致的是,库是已编码的代码,您可以使用它,以便不必再次编码 . 必须以允许您查找所需功能并从您自己的代码中使用它的方式组织代码 .

    大多数编程语言都带有标准库,特别是一些实现某种集合的代码 . 这总是为了方便您不必自己编写这些东西 . 同样,大多数编程语言都有构造,允许您从库中查找功能,与动态链接,命名空间等等 .

    因此,经常需要重新使用的代码是很好的代码,可以放在库中 .

    Toolkit

    用于特定目的的一组工具 . 这是一致的 . 问题是,什么被认为是一种工具,什么不是 . 我会说没有固定的定义,它取决于自称为工具包的东西的上下文 . 工具示例可以是库,小部件,脚本,程序,编辑器,文档,服务器,调试器等 .

    另一件需要注意的是“特殊目的” . 这始终是正确的,但目的范围可以根据制作工具包的人员轻松更改 . 所以它很容易成为程序员的工具包,或者它可以是一个字符串解析工具包 . 一个是如此广泛,它可以让工具接触与编程相关的所有内容,而另一个更精确 .

    SDK通常是工具包,因为它们尝试将一组工具(通常是多种工具)捆绑到一个包中 .

    我认为共同的思路是,一个工具可以完全为你做点什么,或者它可以帮助你做到 . 工具包只是一组工具,可以执行或帮助您执行一组特定的活动 .

    Framework

    框架不是一致定义的 . 对于可以构建代码的任何内容来说,它似乎都是一个笼统的术语 . 这意味着:任何基础或支持您的代码的结构 .

    这意味着您要针对框架构建代码,而针对代码构建库 .

    但是,有时单词框架的使用方式与工具包甚至库相同 . .Net Framework主要是一个工具包,因为它由作为库的FCL和作为虚拟机的CLR组成 . 所以你会认为它是Windows上C#开发的工具包 . Mono是Linux上C#开发的工具包 . 然而他们称之为框架 . 以这种方式思考也是有道理的,因为它构成了你的代码框架,但框架应该更多地支持并将事物放在一起,然后做任何工作,所以我认为这不是你应该使用的方式字 .

    而且我认为业界正试图让框架意味着一个已编写的程序,缺少必须提供或定制的部分 . 我认为这是一件好事,因为工具包和库是“框架”其他用法的精确术语 .

  • 2

    它_1123429_只是一堆方法,可以使用的类 .
    库与框架问题我通过使用它们的方式有所不同 . 很久以前我在某处读到了完美的答案 . 框架调用您的代码,但另一方面您的代码调用库 .

  • 0

    Framework: 已安装在您的计算机上并允许您与其进行交互 . 没有框架,您无法向您的机器发送编程命令

    Library: 旨在解决某个问题(或与同一类别相关的几个问题)

    Toolkit: 许多代码的集合,可以解决多个问题上的多个问题(就像工具箱一样)

  • 118

    关于Mittag的正确答案:

    一个简单的例子 . 假设您在其中一个类中实现了 ISerializable 接口(.Net) . 您可以利用.Net的框架质量,而不是它的库质量 . 你填写"white spots"(正如mittag所说),你已完成骨架 . 您必须知道 in advance 框架如何使用您的代码"react" . 实际上.net是一个框架,这里我不同意Mittag的观点 .

    你的问题的 full, complete answerthis book的第19章(专门讨论这个主题的整章)中非常明确地给出了,顺便说一下,这是一个 very good book (根本不是"just for Smalltalk") .

  • 53

    其他人已经注意到.net可能既是框架又是库和工具包,取决于你使用哪个部分,但也许一个例子有帮助 . 处理数据库的实体框架是.net的一部分,它确实使用了控制模式的反转 . 你让它知道你的模型它会弄清楚如何处理它们 . 作为程序员,它要求您理解“框架的思想”,或者更现实地理解设计师的思维以及他们将如何处理您的输入 . 另一方面,datareader和相关调用只是一种工具,可以从表/视图中获取或放入数据,并使其可供您使用 . 它永远不会理解如何采用父子关系并将其从对象转换为关系,您将使用它这样做的多种工具 . 但是你可以更好地控制数据的存储方式,时间,交易等 .

相关问题