用流行的编程语言来说,这些术语之间有什么区别,并且有什么重叠?
还有其他相关条款吗?
Answers:
所有这三个都提供功能。
但是,有重要的区别。
一个库是只是一个的相关功能集合。仅此而已,也不过如此。库的定义特征是您处于控制之中,您称为库。
框架的定义特征是控制反转。框架调用您,而不是相反。(这被称为好莱坞原则:“不要打电话给我们,我们会打电话给您。”)框架处于控制之中。控制流和数据流由框架管理。
您可以这样想:在两种情况下,您都有一个应用程序,并且此应用程序中存在漏洞,其中遗漏了代码,并且需要填补这些漏洞。库和框架之间的区别是
使用库,您可以编写应用程序,而忽略了枯燥的细节,这些细节由library填充。
有了框架,框架作者就可以编写应用程序,并省略有趣的细节,您可以填写。
有时这可能会造成一些混乱,因为框架本身可能还包含无聊的细节,框架作者填充了库,您编写的部分可能包含了无聊的细节,您填充了库,并且框架可能提供了一组捆绑的库,它们要么与框架兼容,要么经常需要与框架结合使用。例如,当您使用Web框架编写Web应用程序时,可能会使用XML生成器库,并且该XML库可能已由该框架提供,甚至可能是该框架的组成部分。
但是,这并不意味着库和框架之间没有区别。区别非常明显:控制反转就是它的全部。
模块的定义特征是信息隐藏。模块具有接口,该接口显式但抽象地指定其提供的功能及其依赖的功能。(通常称为导出和导入功能。)此接口具有一个实现(实际上是多个实现),对于模块用户而言,这是一个黑匣子。
同样,库是相关功能的集合,而模块仅提供单个功能。这意味着,如果您的系统同时具有模块和库,则一个库通常将包含多个模块。例如,您可能有一个集合库,其中包含一个List
模块,一个Set
模块和一个Map
模块。
尽管您当然可以在不使用模块系统的情况下编写模块,但理想情况下,您希望模块可以单独编译(对于在这种概念甚至有意义的语言和执行环境中),可以分别部署,并且希望模块组成安全(即,编写模块应该在运行前运行或触发错误,但绝不会导致运行时错误或意外行为)。为此,您需要一个模块系统,例如Racket的单元,Standard ML的模块和函子或Newspeak的顶级类。
因此,让我们回顾一下:
您可以通过以下方式查看模块,库和框架:
您的手指/模块:
您可以移动它们,触摸事物,手里只有5个,因此您可以使用它们以更轻松的方式握住事物,它们不是人体的最大部位,而是最有用的部位之一,没有它们,您将无法破解!...模块是程序的一部分,您可以使用它们,将代码扩展到其他文件(不是包含很多代码的大文件),它们使阅读变得更容易。
您的手/库:
手是一组五个手指,您可以握住东西,移动东西,与之互动等。库也是程序的一部分!并且它们可以像一组模块一样看待,您可以使用它们与其他程序进行交互或与您的程序进行相关的事情。
您的身体/框架:
您的身体是一个完整的系统,您可以随心所欲地做任何事情(即使是飞行,只要走进飞机,然后走,飞机就是另一个系统),您就可以独到...一个框架是您的身体,一个完整的系统,它本身不起作用(您需要对herpderp进行编码),但是您可以通过一些黑客攻击来制作一个完整的程序...
只是我的解释...如果我错了,请修复我。
我从其他答案中了解到的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 :
: ... :
:...............................................:
怎么了:
开发人员安装library1和library2,使他们能够利用内部的这些模块提供的功能。
然后,它们包括l1_module1和l2_module3。(他们不需要 l1_module2)。
现在他们可以使用f1,f2,f4和f5的功能,因此他们可以编写应用程序。
现在,由于他们想在某个FRAMEWORK_X中使用该应用程序 ,因此他们必须实现该框架所需的接口:以便该框架可以调用该应用程序。
一些注意事项:
main()
)!或者您可以说bootloader是您的OS的框架,而BIOS是您的bootloader等的框架。在模块化编程的背景下,模块是可通过将编程能力(通常是编程语言或硬件描述语言)引入解决方案的编码语言来表达的实体。
一些语言明确支持模块的概念,并将其作为语言功能提供。一个值得注意的早期实例是Modular-2。尽管具有此功能,但用户仍可以通过约定在软件设计和项目管理中指定具有不同粒度的其他类型的模块,例如源文件和源文件目录。内置的语言功能并不能消除使用不同粒度模块的需求,但是人们可能会使用不同的术语来避免与语言功能可能产生的歧义。
其他一些语言没有提供名为模块的特定功能,但是用户可以选择将程序的某些部分指定为模块。例如,C语言没有模块,但是用户可以根据需要指定功能,源文件,翻译单元(包含头文件的源文件)甚至文件堆。在这种情况下,模块可以具有不同形式的代码:源代码,源代码的二进制代码或在其他地方提供的链接兼容性保证,甚至可以混合使用。
“模块”(如果有)的唯一真正限制是它应反映某些模块化设计的结果,因此模块中的组件应共享一些相似之处以使边界清楚。一个模块通常应该提供一些用户导出的接口。它可以选择导入从外部程序组件中依赖项。一些模块可以是其他模块的子模块。
代码管理工具可以利用与模块有关的概念。例如,Git具有子模块的概念,它实际上是存储库中代码的版本化子目录。
库是一种特殊类型的程序模块,包含(更具体地说,拥有)要以某种封装(即不允许在以后使用时直接修改)方式使用的(子)模块集合。通常,库被设计为可在非易失性存储中重用和部署。通常,以某些稳定的持久格式将库作为一个或多个磁盘文件提供。这样的库称为档案库,动态对象,程序包等。在外部程序数据库的支持下,还可以通过文件名或其他基于文件的属性之外的方法来标识库。例如,CLI使用GAC来提供库程序集。
框架是另一种特殊的程序模块,其中包含各种预定的代码功能。可以以一个或几个库的形式部署框架。框架和程序中其他类型模块之间的区别在于,前者强调某些共同工作的几乎完整,冻结但自适应和可扩展的解决方案,因此框架的用户可以专注于特定领域和特定项目问题,而不是编写胶合代码以将不同的库放在一起并使它们流畅地工作。但是,这在整个项目中都有设计复杂性的代价。值得注意的是,许多(但不是全部)框架会在IoC之后实施用户代码风格。结果,几乎不可能以惯用且自然的方式将相同种类但不同的框架平滑地组合在一起。使用具有一流控制效果的语言,框架中没有明确要求IoC。但是,这意味着将普通库与具有框架功能的组合更容易实现,因此,不需要像传统框架那样组织程序模块,而这些程序模块经常容易破坏灵活性。