Jör*_*tag 98
所有这三个都提供了功能.
但是,存在重要的差异.
一个库是只是一个的相关功能集合.没什么,但也没什么.图书馆的定义特征是你在控制,你调用库.
框架的定义特征是控制反转.框架呼唤你,而不是相反.(这被称为好莱坞原则:"不要打电话给我们,我们会打电话给你.")框架处于控制之中.控制流和数据流由框架管理.
您可以这样想:在这两种情况下,您都有一个应用程序,并且此应用程序中有漏洞,代码已被遗漏,并且需要填写这些漏洞.库和框架之间的区别是
使用库,您可以编写应用程序,并省略无聊的详细信息,这些信息将由库填充.
使用框架,框架编写器编写应用程序,并省略您填写的有趣细节.
这有点令人困惑,因为框架本身也可能包含无聊的细节,框架作者用库填充,你编写的部分可能包含无聊的细节,你用库填写,框架可能提供一组捆绑的库,它们可以很好地与框架配合使用,也可以与框架一起使用.例如,您可以在使用Web框架编写Web应用程序时使用XML生成器库,该XML库可能已由框架提供,甚至可能是其中不可或缺的一部分.
但是,这并不意味着库和框架之间没有区别.区别非常明确:控制倒置就是它的全部.
模块的定义特征是信息隐藏.模块有一个接口,它明确地,但抽象地指定它提供的功能以及它所依赖的功能.(通常称为导出和导入功能.)此接口具有一个实现(或实际上是多个实现),它来自模块的用户是黑盒子.
此外,库是相关功能的集合,而模块仅提供单一功能.这意味着,如果您的系统包含模块和库,则库通常包含多个模块.例如,您可能有一个包含List
模块,Set
模块和Map
模块的集合库.
虽然你可以在没有模块系统的情况下编写模块,但理想情况下你希望你的模块可以单独编译(对于那些概念甚至有意义的语言和执行环境),可以单独部署,并且你希望模块组合是安全的(即组合模块应该在运行时之前工作或触发错误,但永远不会导致运行时错误或意外行为).为此,您需要一个模块系统,如Racket的单元,Standard ML的模块和仿函数或Newspeak的顶级类.
那么,让我们回顾一下:
jms*_*ido 32
您可以通过以下方式查看模块,库和框架:
你的手指/模块:
您可以将它们移动,触摸的东西,你有5个在手,所以你可以用它们来装东西在一个更简单的方法,这些都不是身体最大的部分,但都是最有用的部分之一,没有它们你不能破解!... 模块是程序的一部分,你可以使用它们,将代码扩展到其他文件(不是包含大量代码的大文件),它们使阅读更容易.
你的手/图书馆:
手是一组5个手指,你可以拿东西,移动东西,与它们互动等等...... 图书馆也是一个程序的一部分!它们可以看作是一组模块,您可以使用它们与其他程序交互或与您的程序进行相关的操作.
你的身体/框架:
你的身体是一个完整的系统,你可以随心所欲地做你的身体(甚至飞行,只是走进一架飞机,你去,飞机是另一个系统),你是独一无二的......一个框架是你的身体,一个完整的系统,它不能为自己工作(你需要编写herpderp代码),但你可以制作一个完整的程序与一些黑客运行...
只是我的解释......如果我错了请修好我.
Alo*_*dal 11
我的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 :
: ... :
:...............................................:
Run Code Online (Sandbox Code Playgroud)
怎么了:
开发者安装LIBRARY1和library2,使他们能够利用内部的这些模块提供的功能.
然后它们包括l1_module1和l2_module3.(他们现在不需要 l1_module2).
现在他们可以使用f1,f2,f4和f5的功能,所以他们编写了他们的应用程序.
现在,由于他们想在一些FRAMEWORK_X中使用应用程序 ,他们必须实现此框架所需的接口:以便框架可以调用应用程序.
一些说明:
main()
)!或者您可以说引导加载程序是您的操作系统的框架,BIOS是引导加载程序的框架等.包 vs 模块 vs 库 vs 框架:
包- 类似功能的类/文件的集合。
模块- 它是最小的软件。它是一组可以在其他地方使用的方法/函数。
库- 它是包的集合。它提供了一组随时可用的功能,而无需担心它是如何编写的。我们所关心的只是输入/输出。
框架- 这是一组库。除了功能外,它还提供架构设计或线框。它为您的项目提供精心设计的模式。我们不包括框架。我们将我们的代码集成到其中。