模块,库和框架之间的区别

jet*_*tru 61 frameworks module

在流行的节目中,这些术语之间有什么区别,重叠是什么?

我错过了相关的任何条款?

Jör*_*tag 98

所有这三个都提供了功能.

但是,存在重要的差异.

一个只是一个的相关功能集合.没什么,但也没什么.图书馆的定义特征是在控制,调用库.

框架的定义特征是控制反转.框架呼唤,而不是相反.(这被称为好莱坞原则:"不要打电话给我们,我们会打电话给你.")框架处于控制之中.控制流和数据流由框架管理.

您可以这样想:在这两种情况下,您都有一个应用程序,并且此应用程序中有漏洞,代码已被遗漏,并且需要填写这些漏洞.库和框架之间的区别是

  • 谁写了这个应用程序,
  • 什么是洞和
  • 谁填补了洞.

使用库,您可以编写应用程序,并省略无聊的详细信息,这些信息将由填充.

使用框架,框架编写器编写应用程序,并省略填写的有趣细节.

这有点令人困惑,因为框架本身也可能包含无聊的细节,框架作者用库填充,你编写的部分可能包含无聊的细节,你用库填写,框架可能提供一组捆绑的库,它们可以很好地与框架配合使用,也可以与框架一起使用.例如,您可以在使用Web框架编写Web应用程序时使用XML生成器库,该XML库可能已由框架提供,甚至可能是其中不可或缺的一部分.

但是,这并不意味着库和框架之间没有区别.区别非常明确:控制倒置就是它的全部.

模块的定义特征是信息隐藏.模块有一个接口,它明确地,但抽象地指定它提供的功能以及它所依赖的功能.(通常称为导出导入功能.)此接口具有一个实现(或实际上是多个实现),它来自模块的用户是黑盒子.

此外,库是相关功能的集合,而模块仅提供单一功能.这意味着,如果您的系统包含模块和库,则库通常包含多个模块.例如,您可能有一个包含List模块,Set模块和Map模块的集合库.

虽然你可以在没有模块系统的情况下编写模块,但理想情况下你希望你的模块可以单独编译(对于那些概念甚至有意义的语言和执行环境),可以单独部署,并且你希望模块组合是安全的(即组合模块应该在运行时之前工作或触发错误,但永远不会导致运行时错误或意外行为).为此,您需要一个模块系统,如Racket的单元,Standard ML的模块和仿函数或Newspeak的顶级类.

那么,让我们回顾一下:

  • library:相关功能的集合
  • 框架:控制反转
  • 模块:具有显式导出和导入的抽象接口,实现和接口是分开的,可能有多个实现并且实现是隐藏的

  • @gavenkoa:“控制反转是您在扩展框架时遇到的一种常见现象。实际上,它通常被视为框架的**定义特征**。” (马丁福勒)。“框架包含**关键区别特性**,将它们与普通库分开:控制反转——在框架中,与库或普通用户应用程序不同,整个程序的控制流不是由调用者决定的,而是由框架决定的.” (维基百科)。如果我有超过 30 秒的时间,我可能会找到更多的来源。 (2认同)
  • @JörgWMittag它通常基于IoC,适用于广泛传播的Java/C#世界.但是在没有OOP的系统中(比如DejaGnu测试famework,它可以帮助您将代码下载到数百个系统板)IoC可能无法实现.我认为框架作为系统,表现为非常规有用的库,迫使你遵循它的惯例. (2认同)

jms*_*ido 32

您可以通过以下方式查看模块,库和框架:

  • module =你的手指
  • 库=你的手
  • framework =你的身体

你的手指/模块:
您可以将它们移动,触摸的东西,你有5个在,所以你可以用它们来装东西在一个更简单的方法,这些都不是身体最大的部分,但都是最有用的部分之一,没有它们你不能破解!... 模块是程序的一部分,你可以使用它们,将代码扩展到其他文件(不是包含大量代码的大文件),它们使阅读更容易.

你的手/图书馆:
手是一组5个手指,你可以拿东西,移动东西,与它们互动等等...... 图书馆也是一个程序的一部分!它们可以看作是一组模块,您可以使用它们与其他程序交互或与您的程序进行相关的操作.

你的身体/框架:
你的身体是一个完整的系统,你可以随心所欲地做你的身体(甚至飞行,只是走进一架飞机,你去,飞机是另一个系统),你是独一无二的......一个框架是你的身体,一个完整的系统,它不能为自己工作(你需要编写herpderp代码),但你可以制作一个完整的程序与一些黑客运行...

只是我的解释......如果我错了请修好我.


Alo*_*dal 11

我的ASCII艺术解释了我从其他答案中理解的内容:

+-----------------------------------------------+
|  ...........................  ..............  |
|  : f1() f2()  :  f3()      :  : f4() f5()  :  |
|  :            :            :  :            :  |
|  : l1_module1 : l1_module2 :  : l2_module3 :  |
|  :            :            :  :            :  |
|  --library1-----------------  --library2----  |
|                                               |
|   application.c                               |
|                                               |
|       #include l1_module2                     |
|       #include l2_module3                     |
|                                               |
|       int main() {                            |
|           # case 'reload'                     |
|           f5();                               |
|           # case 'start'                      |
|           f1();                               |
|           # case 'stop'                       |
|           f4();                               |
|       }                                       |
|                                               |
+-----------------------------------------------+

.................................................
: FRAMEWORK_X                                   :
:                                               :
:     application start                         :
:     ...                                       :
:     application reload                        :
:     application stop                          :
:     ...                                       :
:...............................................:
Run Code Online (Sandbox Code Playgroud)

怎么了:

  1. 开发者安装LIBRARY1library2,使他们能够利用内部的这些模块提供的功能.

  2. 然后它们包括l1_module1l2_module3.(他们现在不需要 l1_module2).

  3. 现在他们可以使用f1,f2,f4f5的功能,所以他们编写了他们的应用程序.

  4. 现在,由于他们想在一些FRAMEWORK_X中使用应用程序 ,他们必须实现此框架所需的接口:以便框架可以调用应用程序.

一些说明:

  • 在实践中,有一些框架.例如,操作系统是您的应用程序的框架(这就是您定义的原因main())!或者您可以说引导加载程序是您的操作系统的框架,BIOS是引导加载程序的框架等.

  • 是的,你的BIOS也有一个框架:硬件,它也有一个框架:电源网络,它也有一个框架:电力行业,它也有一个框架:地球,它也有一个框架:空间. ..在进入宗教事务之前,我会在这里停下来. (2认同)

Rit*_*pta 5

包 vs 模块 vs 库 vs 框架:

  1. - 类似功能的类/文件的集合。

  2. 模块- 它是最小的软件。它是一组可以在其他地方使用的方法/函数。

  3. - 它是包的集合。它提供了一组随时可用的功能,而无需担心它是如何编写的。我们所关心的只是输入/输出。

  4. 框架- 这是一组库。除了功能外,它还提供架构设计或线框。它为您的项目提供精心设计的模式。我们不包括框架。我们将我们的代码集成到其中。