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


71

用流行的编程语言来说,这些术语之间有什么区别,并且有什么重叠?

还有其他相关条款吗?




3
@gavenkoa:请检查问题日期。这个问题是这个问题的重复。
akshay

这不是一个可以回答的问题。这些术语用于许多不同的事物。
詹姆斯·摩尔

Answers:


111

所有这三个都提供功能。

但是,有重要的区别。

一个只是一个的相关功能集合。仅此而已,也不过如此。库的定义特征是处于控制之中,称为库。

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

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

  • 谁编写应用程序,
  • 有什么洞和
  • 谁填补了漏洞。

使用库,您可以编写应用程序,而忽略了枯燥的细节,这些细节由library填充。

有了框架,框架作者就可以编写应用程序,并省略有趣的细节,您可以填写。

有时这可能会造成一些混乱,因为框架本身可能还包含无聊的细节,框架作者填充了库,您编写的部分可能包含了无聊的细节,您填充了库,并且框架可能提供了一组捆绑的库,它们要么与框架兼容,要么经常需要与框架结合使用。例如,当您使用Web框架编写Web应用程序时,可能会使用XML生成器库,并且该XML库可能已由该框架提供,甚至可能是该框架的组成部分。

但是,这并不意味着库和框架之间没有区别。区别非常明显:控制反转就是它的全部。

模块的定义特征是信息隐藏。模块具有接口,该接口显式但抽象地指定其提供的功能及其依赖的功能。(通常称为导出导入功能。)此接口具有一个实现(实际上是多个实现),对于模块用户而言,这是一个黑匣子。

同样,库是相关功能的集合,而模块仅提供单个功能。这意味着,如果您的系统同时具有模块和库,则一个库通常将包含多个模块。例如,您可能有一个集合库,其中包含一个List模块,一个Set模块和一个Map模块。

尽管您当然可以在不使用模块系统的情况下编写模块,但理想情况下,您希望模块可以单独编译(对于在这种概念甚至有意义的语言和执行环境中),可以分别部署,并且希望模块组成安全(即,编写模块应该在运行前运行或触发错误,但绝不会导致运行时错误或意外行为)。为此,您需要一个模块系统,例如Racket的单元,Standard ML的模块和函子或Newspeak的顶级类。

因此,让我们回顾一下:

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

1
@gavenkoa:“控制反转是扩展框架时经常遇到的现象。的确,它通常被视为框架的定义特征。” (马丁·福勒)。“框架包含将它们与普通库分开的关键区别功能:控制反转-在框架中,与库或普通用户应用程序不同,整个程序的控制流不是由调用者决定,而是由框架决定。” (维基百科)。如果我的时间超过30秒,则可能会找到更多来源。
约尔格W¯¯米塔格

2
@JörgWMittag在Java / C#世界广泛传播的情况下,通常基于IoC。但是在没有OOP的系统中(例如DejaGnu测试框架,它可以帮助您将代码下载到数百个系统板上),IoC可能无法实现。我认为框架是系统,它充当非常规有用的库,迫使您遵循约定。
Givenkoa

@gavenkoa IoC不限于OOP;我无法完全理解您的最后评论(也许是因为我不认识DejaGnu)
Alois Mahdal

1
我知道这已经很老了,但是我无法理解您对框架的解释如何涵盖所有框架。我可以将一段代码编译为库或框架。那只是编码标准吗?它的意图确定差异而不是文件扩展名吗?与框架相比,库中的机器代码是否有差异?
凯文

@JörgW Mittag,可以在时域上解释所有这一切,即在每个域上编译和运行时上下文吗?

37

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

  • 模块=您的手指
  • 图书馆=你的手
  • 框架=你的身体

您的手指/模块:
您可以移动它们,触摸事物,手里只有5个,因此您可以使用它们以更轻松的方式握住事物,它们不是人体的最大部位,而是最有用的部位之一,没有它们,您将无法破解!...模块是程序的一部分,您可以使用它们,将代码扩展到其他文件(不是包含很多代码的大文件),它们使阅读变得更容易。

您的手/库:
手是一组五个手指,您可以握住东西,移动东西,与之互动等。也是程序的一部分!并且它们可以像一组模块一样看待,您可以使用它们与其他程序进行交互或与您的程序进行相关的事情。

您的身体/框架:
您的身体是一个完整的系统,您可以随心所欲地做任何事情(即使是飞行,只要走进飞机,然后走,飞机就是另一个系统),您就可以独到...一个框架是您的身体,一个完整的系统,它本身不起作用(您需要对herpderp进行编码),但是您可以通过一些黑客攻击来制作一个完整的程序...

只是我的解释...如果我错了,请修复我。


13

我从其他答案中了解到的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                          :
:     ...                                       :
:...............................................:

怎么了:

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

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

  3. 现在他们可以使用f1f2f4f5的功能,因此他们可以编写应用程序。

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

一些注意事项:

  • 实际上,有一些框架。例如,操作系统是您的应用程序的框架(这就是您定义的原因main())!或者您可以说bootloader是您的OS的框架,而BIOS是您的bootloader等的框架。

2
是的,您的BIOS也有一个框架:硬件,也有一个框架:电力网络,也有一个框架:电力工业,也有一个框架:地球,也有一个框架:空间。 ..而我将在宗教事务之前就停在这里。
Alois Mahdal

您使用什么来创建ASCII?
Koray Tugay

1
@KorayTugay是什么意思?我不欺骗ASCII艺术...只是Vim!
Alois Mahdal

2

粗略地讲,我会这样考虑:模块是功能的可导入“原子”。它定义了可以使用的分组功能的最小子集(请注意,它不是功能的最小单元;而是一个类(或函数,取决于))。用这种方法,一个库将是一组模块;您可以使用库,而无需使用该库中的所有模块。框架是库(可能)所依赖的环境;它构成了以上所有工作的基准环境。

请注意,这些术语在某种程度上是可替代的,并且这些定义在每种情况下都不会始终如一。这只是我对遇到的一些常见用法的解释。


2

我相信框架和库是模块。由于模块是从您的代码导入或导出的代码。正如他们所说,框架调用您的代码,您的代码调用库。无论哪种方式,都涉及一个模块


2

从我的角度来看framework包含libraries和都是modules

例如,在Swift中, amodule是代码分发的单个单元-framework或作为单个单元构建和交付的应用程序。


1

在我看来,模块可以是库的子集,而库又可以是框架的子集。但是我敢肯定,对于这种情况以及基于上下文的各种解释都有例外-尤其是术语模块。


1

模组

模块是输出模块化设计,具有各种粒度的组分。

模块化编程的背景下,模块是可通过将编程能力(通常是编程语言或硬件描述语言)引入解决方案的编码语言来表达的实体。

一些语言明确支持模块的概念,并将其作为语言功能提供。一个值得注意的早期实例是Modular-2。尽管具有此功能,但用户仍可以通过约定在软件设计和项目管理中指定具有不同粒度的其他类型的模块,例如源文件和源文件目录。内置的语言功能并不能消除使用不同粒度模块的需求,但是人们可能会使用不同的术语来避免与语言功能可能产生的歧义。

其他一些语言没有提供名为模块的特定功能,但是用户可以选择将程序的某些部分指定为模块。例如,C语言没有模块,但是用户可以根据需要指定功能,源文件,翻译单元(包含头文件的源文件)甚至文件堆。在这种情况下,模块可以具有不同形式的代码:源代码,源代码的二进制代码或在其他地方提供的链接兼容性保证,甚至可以混合使用。

“模块”(如果有)的唯一真正限制是它应反映某些模块化设计的结果,因此模块中的组件应共享一些相似之处以使边界清楚。一个模块通常应该提供一些用户导出的接口。它可以选择导入从外部程序组件中依赖项。一些模块可以是其他模块的子模块。

代码管理工具可以利用与模块有关的概念。例如,Git具有子模块的概念,它实际上是存储库中代码的版本化子目录。

图书馆

库是一种特殊类型的程序模块,包含(更具体地说,拥有)要以某种封装(即不允许在以后使用时直接修改)方式使用的(子)模块集合。通常,库被设计为可在非易失性存储中重用和部署。通常,以某些稳定的持久格式将库作为一个或多个磁盘文件提供。这样的库称为档案库,动态对象,程序包等。在外部程序数据库的支持下,还可以通过文件名或其他基于文件的属性之外的方法来标识库。例如,CLI使用GAC来提供库程序集

构架

框架是另一种特殊的程序模块,其中包含各种预定的代码功能。可以以一个或几个库的形式部署框架。框架和程序中其他类型模块之间的区别在于,前者强调某些共同工作的几乎完整,冻结但自适应和可扩展的解决方案,因此框架的用户可以专注于特定领域和特定项目问题,而不是编写胶合代码以将不同的库放在一起并使它们流畅地工作。但是,这在整个项目中都有设计复杂性的代价。值得注意的是,许多(但不是全部)框架会在IoC之后实施用户代码风格。结果,几乎不可能以惯用且自然的方式将相同种类但不同的框架平滑地组合在一起。使用具有一流控制效果的语言,框架中没有明确要求IoC。但是,这意味着将普通库与具有框架功能的组合更容易实现,因此,不需要像传统框架那样组织程序模块,而这些程序模块经常容易破坏灵活性。


1

库:命名空间/模块化代码的集合。

框架:框架是可重复使用的某些代码段(无论是编译器,设计模式还是其他),从而使开发人员的工作更加轻松,从而使他们不必重新发明轮子。

模块:例如,在JavaScript中,模块只是具有公共属性的对象。我不确定,但是我认为模块一词没有通用的答案。


0

包,模块,库,框架:

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

  2. 模块-它是最小的软件。它是准备在其他地方使用的一组方法/功能。

  3. -它是软件包的集合。它提供了一组可以立即使用的功能,而无需担心其编写方式。我们只关心输入/输出。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.