模块、库和框架的区别

97

在流行的编程术语中,这些术语有什么区别,它们之间有哪些重叠?

还有其他相关的术语吗?


可能是[框架 vs 工具包 vs 库]的重复问题 (https://dev59.com/O3A75IYBdhLWcg3w3NPf)。 - Matt Ball
类 vs 包 vs 模块 vs 组件 vs 容器 vs 服务 vs 平台 在Java下的区别是什么? - gavenkoa
4
请检查问题的日期。那个问题是这个问题的重复。 - akshay
这不是一个可以回答的问题。这些术语被用于许多不同的事情。 - James Moore
11个回答

145

这三者都提供功能。

然而,它们之间有重要的区别。

只是一组相关的功能。没有更多或更少。定义库的特征是 控制, 调用库。

框架 的特征是 控制反转。框架会调用 ,而不是反过来。(这被称为“好莱坞原则”: “别打电话给我们,我们会打电话给你。”) 框架在控制。控制和数据的流动由框架管理。

你可以这样想:在两种情况下,你都有一个应用程序,这个应用程序有空缺,在这些空缺中留下了代码,并且需要填补这些空缺。库和框架的区别在于

  • 谁写应用程序
  • 空缺是什么
  • 谁填补空缺。

使用库时, 写应用程序,并省略了 无聊的 细节,由 填充。

使用框架时,框架作者 编写应用程序,省略了 有趣的 细节,由 填写。

这有时可能会有点混淆,因为框架本身可能还包含无聊的细节,框架作者使用库填充了其中的部分,你编写的部分可能也包含无聊的细节,可以使用库填充,框架可能会提供一组捆绑库,这些库要么与框架很好地配合,要么与框架经常需要配合使用。例如,在使用 Web 框架编写 Web 应用程序时,可能会使用 XML 生成器库,该 XML 库可能由框架提供或甚至是其固有部分。

然而,这并不意味着库和框架之间没有区别。区别非常明显:控制反转是关键。

模块的定义特征是信息隐藏。一个模块有一个接口,明确但抽象地指定了它提供的功能以及它依赖的功能(通常称为导出和导入功能)。该接口有一个实现(或多个实现),对于使用模块的用户来说,它们是黑盒。

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

虽然可以编写没有模块系统的模块,但最好让模块能够分别编译(对于那些甚至支持这种概念的语言和执行环境而言)、分别部署,并且希望模块组合是安全的(即,组成模块应该工作或在运行时触发错误,但永远不要导致运行时错误或意外行为)。为此,需要模块系统,例如Racket的单元、标准ML的模块和函数器或Newspeak的顶级类。

因此,让我们回顾一下:

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

3
控制反转是在扩展框架时遇到的常见现象。实际上,这通常被视为框架的一个关键特征。框架包含与普通库不同的关键区别:控制反转 - 在框架中,与库或常规用户应用程序不同,整个程序的控制流程不是由调用者决定,而是由框架决定。如果我有超过30秒的时间,我可能可以找到更多的来源。 - Jörg W Mittag
2
通常情况下,Java/C#世界中广泛使用IoC。但在没有面向对象编程(例如DejaGnu测试框架)的系统中,可能无法实现IoC。我认为框架是一种行为不规则但有帮助的库,它强制你遵循其约定。 - gavenkoa
@gavenkoa IoC 不仅限于 OOP;我无法完全理解你的最后一条评论(可能是因为我不知道 DejaGnu)。 - Alois Mahdal
1
我知道这很老旧,但我无法理解你对框架的解释如何涵盖所有框架。我可以将一段代码编译为库或框架。那只是一种编码标准吗?它的意图决定了区别,而不是文件扩展名吗?在库和框架之间的机器代码中是否存在任何差异? - kevin
1
@Jörg W Mittag,您可以在时间域内解释所有这些内容,即在每个编译和运行时上下文中吗? - user14870706
又一个框架的定义并不吸引我;它已经被证明是一个过于开放的概念。但是,我仍然不明白为什么要使用模块,因为库可以轻松地完成它们所能做的一切,包括分区信息。在Java的情况下,模块中是否存在有用的障碍,而这些障碍在简单的jar文件中不存在?模块是否以某种方式防止从命令行上的一个jar到另一个jar的交叉链接,具体取决于它们的顺序? - alife

49
您可以这样理解模块、库和框架:
  • 模块 = 您的手指
  • 库 = 您的手
  • 框架 = 您的身体

您的手指 / 模块:
您可以移动它们、触摸物品,在一只中有5个,因此可以更轻松地使用它们来握住物品,尽管它们不是身体最大的部分,但却是最有用的部分之一,没有它们,您将无法进行编程!... 模块是程序的一部分,您可以使用它们,将代码扩展到其他文件(而不是一个包含大量代码的大文件),这样可以使代码更易于阅读。

您的手 / 库:
手是由5个手指组成的,您可以拿着物品、移动物品、与它们交互等... 也是程序的一部分!它们就像一组模块,您可以使用它们与其他程序进行交互或者在您的程序中实现相关功能。

您的身体 / 框架:
您的身体是一个完整的系统,您可以随心所欲地使用它(甚至可以飞行,只需走进一个飞机上即可,飞机是另一个系统),您是独一无二的... 框架就像您的身体,是一个完整的系统,但它本身并不能工作(您需要编写代码herpderp),但是您可以通过一些编程技巧制作出完整的程序。

这只是我的解释... 如果有错误请指出。


15

我从其他答案中理解到的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()!)或者您可以说引导加载程序是操作系统的框架,BIOS是引导加载程序的框架等。

3
没错,你的BIOS也有一个框架:硬件,它也有一个框架:电力网络,它还有一个框架:电力工业,它还有一个框架:地球,它还有一个框架:太空...在涉及宗教问题之前,我就说到这里吧。 - Alois Mahdal
你用什么工具创建ASCII? - Koray Tugay
1
@KorayTugay 你是什么意思?我不会在ASCII艺术上作弊...只用Vim! - Alois Mahdal

11

包 vs 模块 vs 库 vs 框架:

  1. - 一组具有类似功能的类/文件。

  2. 模块 - 它是最小的软件单元。它是一组方法/函数,已准备好在其他地方使用。

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

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


2

在我看来,框架包含了,两者都是模块

例如,在Swift中,一个模块是代码分发的单个单位 - 作为单个单位构建和发布的框架或应用程序。


2
大致而言,我认为它是这样的:一个模块是可导入的功能“原子”; 它定义了可以使用的最小分组功能子集(请注意,它不是最小的功能单元; 那将是一个类(或函数,具体取决于情况))。 在这种方法中,库将是一组模块; 您可以在不使用该库的所有模块的情况下使用库。 框架是库(很可能)依赖的环境; 它构成了上述所有工作的基线环境。
请注意,这些术语有些可互换,并且这些定义在每种情况下都不总是确定的; 这只是我对我遇到的一些常见用法的解释。

1

模块

模块模块化设计的输出,是一个具有不同粒度的组件。

模块化编程的上下文中,模块是可以用编程语言表达的实体(通常是编程语言或硬件描述语言),引入可编程性以解决问题。

一些语言明确支持模块概念,并将其作为语言特性提供。一个著名的早期实例是Modular-2。尽管有这个特性,用户仍然可以按照软件设计和项目管理的不同粒度约定其他种类的模块,如源文件和源文件目录。内置的语言特性并不能消除需要不同粒度模块的需求,但人们可能会使用不同的术语来避免与语言特性可能产生的歧义。

一些编程语言并没有提供名为“模块”的特定功能,但用户可以选择将程序的某些部分指定为模块。例如,C语言没有模块,但用户可以按需将函数、源文件、翻译单元(包含其头文件的源文件)甚至一堆文件指定为模块。在这种情况下,模块可以具有不同形式的代码:源代码、来自源代码的二进制代码或提供其他地方的链接兼容性保证,甚至是混合的。
“模块”的唯一真正限制(如果有的话)是它应该反映出某种模块化设计的结果,因此模块中的组件应该共享某些相似之处,以使边界清晰。模块通常应向用户提供某些类型的导出接口;它还可以选择从外部程序组件导入依赖项。其中一些模块可以是其他模块的子模块。
代码管理工具可能利用与模块相关的概念。例如,Git具有子模块的概念,它实质上是存储库中代码的版本化子目录。
图书馆

一个库是一种专门的程序模块,包含(更具体地说,拥有)一组(子)模块,以一种封装的方式使用(即,在后续使用中不允许直接修改)。通常,库被设计成可重用并部署在非易失性存储器中。通常,库作为一个或多个稳定持久格式的磁盘文件提供。这样的库被称为存档、动态对象、包等。通过外部程序数据库的支持,库也可以通过文件名或其他基于文件的属性之外的方式进行标识。例如,CLI通过GAC的帮助提供库程序集

框架

框架是另一种专门的程序模块,其中包含各种预先设计好的代码功能。一个框架可以以一个或多个库的形式部署。框架与程序中其他类型的模块的区别在于前者强调了某些常见工作的“大体上完成、冻结但是可适应和可扩展的解决方案”,因此框架的用户可以专注于特定于领域和项目的问题,而不是编写粘合代码将不同的库放在一起并使其流畅地运行。然而,这会导致整个项目的设计复杂性成本增加。值得注意的是,许多(但不是全部)框架会强制要求用户遵循IoC风格的代码。因此,几乎不可能以惯用且自然的方式顺利地将相同类型但不同的框架组合在一起。使用具有一级控制效果的语言,框架中不需要显式要求使用IoC。但是,这意味着将普通库组合成具有框架功能的组合更容易实现,因此无需像传统框架那样组织程序模块,这通常会轻易破坏灵活性。

1
在我看来,一个模块可以是库的子集,而库又可以是框架的子集。但我相信在不同的上下文中,特别是对于“模块”这个术语,可能会有例外和不同的解释。

1

我认为框架和库是模块。因为模块是从你的代码中导入或导出的代码。 就像他们说的,框架调用你的代码,你的代码调用库。无论哪种方式,都涉及到一个模块。


1

库(Library): 一些命名空间化/模块化的代码集合。

框架(Framework): 框架是指一些可重复使用的代码(无论是编译器、设计模式还是其他什么),使得开发者的生活更加便捷,不需要重新发明轮子。

模块(Module): 在JavaScript中,例如一个模块就是一个带有公共属性的对象。我不确定,但我认为对于“模块”这个术语,没有通用的答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接