用流行的编程语言来说,这些术语之间有什么区别以及有哪些重叠?
我遗漏了任何相关术语吗?
最佳答案
所有这三个都提供功能。
但是,存在重要的差异。
库只是相关功能的集合。不多,但也不少。库的定义特征是您掌控一切,您调用库。
框架的定义特征是控制反转。框架调用你,而不是相反。 (这被称为好莱坞原则:“不要调用我们,我们会调用你。”)框架处于控制之中。控制流和数据流由框架管理。
你可以这样想:在这两种情况下,你都有一个应用程序,而这个应用程序有漏洞,代码被遗漏了,这些漏洞需要填补。库和库之间的区别一个框架是
- 谁编写了应用程序,
- 有哪些漏洞以及
- 谁来填补漏洞。
使用库,您编写应用程序,并省略无聊的细节,这些细节将由库填充。
使用框架,框架编写者编写应用程序,并省略有趣的细节,这些细节由您填写。
这有时可能会有点令人困惑,因为框架本身也可能包含无聊的细节,框架作者用库填充,您编写的部分可能包含无聊的细节,您用库填充,以及框架可能会提供一组捆绑库,这些库要么与框架配合良好,要么经常需要与框架结合使用。例如,您在使用 Web 框架编写 Web 应用程序时可能会使用 XML 生成器库,并且该 XML 库可能已由框架提供,甚至可能是框架的组成部分。
但这并不意味着库和框架之间没有区别。区别非常明显:控制反转就是它的全部内容。
模块的定义特征是信息隐藏。模块有一个接口(interface),它明确但抽象地指定了它提供的功能以及它所依赖的功能。 (通常称为导出和导入功能。)该接口(interface)有一个实现(实际上是多个实现),从用户那里模块是一个黑盒子。
此外,库是相关功能的集合,而模块仅提供单个功能。这意味着,如果您的系统同时包含模块和库,则库通常会包含多个模块。例如,您可能有一个集合库,其中包含 List
模块、Set
模块和 Map
模块。
虽然您当然可以在没有模块系统的情况下编写模块,但理想情况下您希望您的模块可以单独编译(对于该概念甚至有意义的语言和执行环境),可以单独部署,并且您希望模块组合是安全的(即组合模块应该在运行时之前工作或触发错误,但绝不会导致运行时错误或意外行为)。为此,您需要一个模块系统,例如 Racket 的单元、Standard ML 的模块和仿函数或 Newspeak 的顶级类。
那么,让我们回顾一下:
- 库:相关功能的集合
- 框架:控制反转
- 模块:具有显式导出和导入的抽象接口(interface),实现和接口(interface)是分离的,可以有多个实现并且实现是隐藏的
关于frameworks - 模块、库和框架之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4099975/