模块化与组件化设计

41

模块设计与组件设计有什么区别?


2
这取决于你所谈论的语言/环境(例如,.Net模块与perl模块完全不同)。你感兴趣的是哪一个? - Foxfire
我能想到唯一有意义的背景是 Joomla!,但在我们得到澄清之前,我不会回答这个问题。 - cHao
就框架而言,您能否给我一个 PHP 框架的例子,它是模块化的而不是组件化的? - ms80
我也在努力理解这种分离。我从合成/分析的角度考虑它。组件是通过合成来构建软件的(合成),而模块则是通过将代码进行分割来得到的(分析)。因此,组件涉及软件的高级设计,而模块更多地涉及代码层面的组织。 - Patrick Bucher
7个回答

28
我想分享一下我对于这个区别的看法。
组件和模块都被用来指代一组函数或者一个函数的一部分。模块更多地是从逻辑角度出发,例如在ERP系统中有“财务模块”,“人力资源模块”,“制造模块”等等。另一方面,组件则更加注重物理层面。在软件中,组件可以是dll、ocx、exe等等。
没有标准可以衡量哪个比另一个更重要。一个组件可以包含许多模块,而一个模块也可以包含很多组件。组件被用于以技术视角建模系统,而模块则被用于以功能视角建模系统(即系统的功能)。

1
这绝对是错误的答案。引用自https://support.microsoft.com/en-us/kb/815065:“使用DLL有助于促进代码模块化、代码重用[...]”-你不能说“组件更具物理性”,DLL完全是关于模块化的,而且你无法比这更具物理性了。 - arpadf
同样适用于OSGI捆绑包https://www.osgi.org/developer/architecture/:“因此,模块化是OSGi规范的核心,并体现在捆绑包概念中。从Java的角度来看,捆绑包是一个普通的JAR文件”-再次强调模块是物理实体。 - arpadf
1
我同意@Tin的观点,使用术语“物理”的可争议性可能存在,但总体而言,Tin的回答更清晰明了。 - Klent Abistado

15
组件和模块经常混淆。然而,它们不是相同的,一个的影响并不一定适用于另一个。
模块化是将代码分为相关功能模块的过程。在许多编程语言中,模块只是一个源文件。通常做法是,如果源文件变得太大,可以将其拆分为两个或更多源文件,并将其放入新目录中;虽然目录通常不被称为模块,但这种分解仍然是模块化的。
另一方面,组件可以以不同的方式与其他组件组合形成不同的程序。也就是说,有一个单独的组合阶段,现实的人们决定应该使用哪些组件。
我曾看到过使用组件设计来强制某种硬性模块化的方法。由于组合的显着开销,无法推荐此方法:组合复杂度随组件数量呈多项式增长。而组件的数量随着功能组数的增加而线性增长,因为一旦你开始使用组件分解进行模块化,你就会迫使自己创建一个新的组件,每当你只需要一个新的模块时,否则那个新的模块就没有真正的归属地方。在100个组件时,组合开销成为全职工作,每个组合迭代需要数周时间,尽管有众多自动化努力。这严重阻碍了开发。
我最简单的建议是尽可能避免使用组件;虽然知道有时组件可能是必需的。例如,如果多个独立组织参与一个项目,则每个组织一个组件似乎是可以接受的。
模块分解成多细腻程度是品味问题,但所有人都认为模块化是一件好事。
如果我知道函数的名称,我的编辑器很快就会找到它。另一方面,如果由于某种原因我不知道函数(或类)的名称,模块化变得更加重要。
我预计后一种情况只会影响那些功能,这些功能可能很少用或者非常复杂,所以通常是不必要的。您可以从使用该程序中获得经验,因此请尝试使您的程序分解为模块反映程序行为按功能区域的直观分解。


14

《OSGi实战》一书中有一段引用,我认为解释了组件和模块之间的差异。

模块与组件

模块与组件听起来很像?它们都提供彼此所需的内容并从彼此消耗。它们也被封装为独立的部署单元。这两者难道不能被视为相同的东西或至少可以合并吗?是的, 可以, 但组件和模块服务于不同的目的,而且有些是正交的(它们不完全正交,因为组件由代码组成,最终可以打包成模块)。

模块处理代码的打包和代码之间的依赖关系。组件处理实现高级功能和组件之间的依赖关系。组件需要管理其代码依赖关系,但技术上不需要一个模块系统来实现这一点(通常是我们程序员通过类路径来实现)。

一个好的总结是您可以将模块视为处理静态代码和编译时依赖关系,而将组件视为处理实例和执行时依赖关系。

— 《OSGi实战》(第347页),11.1.1什么是组件?


1
同意;我只想強調這個觀點。理解模塊和組件之間區別的關鍵在於我們如何看待系統:靜態視圖中,模塊及其之間的依賴是直接從代碼中推導出來的;實例視圖中,組件及其之間的依賴/連接是運行時處理和/或獨立的預執行配置步驟的結果。 - arpadf
我同意你的看法,@arpadf。 - Klent Abistado

6
如果您提到模块性,IEEE软件工程术语标准词汇表中有一个定义:
“模块化是指系统或计算机程序由离散组件组成的程度,这样对一个组件的更改对其他组件的影响最小。” Bertrand Meyer博士提出了五个模块化标准:
- 将问题分解为子问题 - 模块可组合以生成新系统 - 单独理解某个模块 - 连续性 - 小变化具有局部影响 - 保护 - 故障隔离

6
如果您要引用官方来源,最好确保引用正确:“系统或计算机程序由离散组件构成的程度越高,一个组件的更改对其他组件的影响就越小。” - Gerrat

5

为了数字化发展和UI设计(HTML/CSS/JS)的考虑,我采用这种方法来确保自己保持组织和先思考后行动。证明这种方法可以创造更清晰、更有组织的代码,并将其转化为更高效的工作。

在典型的样式表中,我目前设置如下:

/* Style Guide – Mobile First
   1. =Setup
   2. =Modules as independent units made up of components
   3. =Components as group of reusable code containing more than one element
   4. =Classes
   5. =Responsive as enhancement
*/
  • 模块是由组件构成的独立单元:头部、底部、章节、文章、侧边栏等。房子由许多房间组成,每个房间都有特殊的风格和功能,以创建一个独立的整体。
  • 组件是包含多个元素的可重用代码组:无序列表、引用、卡片、表格等。

我在这里写了更详细的解释,您可以阅读此处

希望这能帮到您!


2

组件是运行时实体(可以由模块组成),独立的可运行单元。

模块是一个被分隔为实现单元的系统,它具有独立的任务分配。模块可能是也可能不是组件。


1
在我看来,ModuleComponent都只是一些函数和资源。
它们之间的区别在于:组件具有业务逻辑而模块没有。 例如,这个文本输入区域只是一个模块,但当有一些帖子API被调用时,它就变成了一个组件。你可以把模块放在任何地方,它都能正常工作,但组件只能在特定的页面或视图中使用(因为它有一个特定的API调用)。

2
我喜欢这种说法,即组件包含业务逻辑而模块则不包含。 - ESR
我也同意 @ESR,那是一个观点。 - Klent Abistado

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接