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

时间:2010-11-04 18:32:10

标签: frameworks module

在热门节目中,这些术语与重叠之间有什么区别?

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

10 个答案:

答案 0 :(得分:95)

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

但是,存在重要的差异。

只是相关功能的集合。没什么,但也没什么。库的定义特征是处于控制之中,调用库。

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

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

是一个框架
  • 谁写了这个应用程序,
  • 什么是洞和
  • 谁填补了这些漏洞。

使用库编写应用程序,然后省略无聊的详细信息,这些信息由填写。< / p>

使用框架,框架编写器编写应用程序,并省略有趣的详细信息,填写。

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

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

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

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

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

所以,让我们回顾一下:

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

答案 1 :(得分:32)

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

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

你的手指/模块:
你可以移动它们,触摸它们,你有5个,这样你就可以用它们来更轻松地抓住东西,那些不是身体的最大部分,但却是最有用的部分之一部件,没有它们你不能破解!... 模块是程序的一部分,你可以使用它们,将代码扩展到其他文件(不是一个包含大量代码的大文件),它们使阅读更容易。

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

您的身体/框架:
你的身体是一个完整的系统,你可以随心所欲地做你的身体(甚至飞行,只是走进一架飞机,你去,飞机是另一个系统),你是独一无二的...... 框架是你的身体,一个完整的系统,它本身不起作用(你需要编写herpderp代码)但是你可以通过一些黑客攻击制作一个完整的程序......

  

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

答案 2 :(得分:10)

我的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. 开发人员安装 library1 library2 以便他们可以 使用这些模块中提供的功能。

  2. 然后他们包括 l1_module1 l2_module3 。 (他们不需要 l1_module2 现在。)

  3. 现在,他们可以使用 f1 f2 f4 f5 的功能, 所以他们写了他们的申请。

  4. 现在,因为他们想在一些内部使用应用程序 FRAMEWORK_X ,他们必须实现这个接口 框架需求:这样框架可以调用 应用

  5. 一些注意事项:

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

答案 3 :(得分:4)

包 vs 模块 vs 库 vs 框架:

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

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

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

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

答案 4 :(得分:2)

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

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

答案 5 :(得分:2)

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

答案 6 :(得分:2)

从我的角度来看一个framework包含libraries,两者都是modules

E.g。在 Swift 中,module是一个代码分发单元 - framework或构建并作为单个单元发布的应用程序。

答案 7 :(得分:0)

在我看来,模块可以是库的子集,而库也可以是框架的子集。但我确信这有例外情况以及基于背景的各种解释 - 特别是对于术语模块。

答案 8 :(得分:0)

模块

modulemodular design(具有各种粒度的组件)的输出。

modular programming的上下文中,模块是可以通过将语言的可编程性(通常是编程语言或硬件描述语言)引入解决方案的编码语言来表达的实体。

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

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

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

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

图书馆

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

框架

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

答案 9 :(得分:0)

图书馆:     命名空间/模块化代码的集合。

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

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