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

在stream行的编程中,这两个术语之间有什么区别,重叠是什么?

任何有关的条款,我错过了?

所有这三个提供function。

但是,有重要的区别。

只是一个相关function的集合。 没有更多,但也没有什么。 图书馆的决定性特征是掌控了的图书馆。

一个框架的定义特征是控制反转 。 框架称呼 ,而不是相反。 (这就是所谓的好莱坞原则 :“不要打电话给我们,我们会打电话给你。”)框架是在控制之下。 控制stream和数据stream由框架pipe理。

你可以这样想:在这两种情况下,你都有一个应用程序,这个应用程序有一些漏洞,代码已经被遗漏了,这些漏洞需要被填充。库和框架之间的区别是

  • 谁写的应用程序,
  • 什么是洞和
  • 谁填补了漏洞。

有了图书馆, 你就可以编写这个应用程序,而且你可以省去那些由图书馆填写的无聊的细节。

使用框架, 框架编写者编写应用程序,并留下填写的有趣的细节。

这有时候可能会有点混乱,因为框架本身也可能包含无聊的细节,框架作者用库填充,你编写的部分可能包含无聊的细节,你用库填充,框架可能提供一套捆绑的库,可以与框架一起工作,或者与框架结合使用。 例如,在使用Web框架编写Web应用程序时,您可能会使用XML生成器库,并且该XML库可能已由框架提供,甚至可能是其中不可或缺的一部分。

但是,这并不意味着图书馆和框架之间没有区别。 这个区别非常明显:控制反转就是一切。

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

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

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

所以,让我们回顾一下:

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

你可以这样看到一个模块,一个库和一个框架:

  • 模块=你的手指
  • 库=你的手
  • 框架=你的身体

你的手指/模块:
你可以移动它们,触摸东西,你可以用一个更简单的方式来保存东西,这些东西不是身体最大的部分,但是是最有用的部分之一,没有它们,你不能!… 模块是程序的一部分,您可以使用它们,将代码扩展到其他文件(而不是一个包含大量代码的大文件),它们使得阅读更容易。

你的手/图书馆:
手是每一个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 : : ... : :...............................................: 

怎么了:

  1. 开发人员安装library1library2,以便他们可以使用这些模块内提供的function。

  2. 然后它们包含l1_module1l2_module3 。 (现在他们不需要l1_module2 )。

  3. 现在他们可以使用f1f2f4f5的function了,于是他们编写了他们的应用程序。

  4. 现在,因为他们想在某些FRAMEWORK_X中使用应用程序,所以他们必须实现这个框架所需的接口:以便框架可以调用应用程序。

一些说明:

  • 实际上总是有一些框架。 例如,操作系统是你的应用程序的框架(这就是为什么你定义main() )! 或者你可以说bootloader是你的操作系统的框架,BIOS是你的bootloader的框架。

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

请注意,这些术语是可以替代的,这些定义在任何情况下都不会一成不变; 这只是我对我所遇到的一些常见用法的解释。

在我看来,一个模块可能是一个库的一个子集,而这个库又可能是一个框架的一个子集。 但是我相信在这个上下文中有一些例外情况,并且基于上下文的各种解释 – 特别是对于术语模块。

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

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

例如,在Swift中,一个module是代码分发的一个单元 – 一个framework或应用程序,它是作为一个单元构build和交付的。