组件和模块之间有区别吗


30

我对术语模块和组件有一些疑问。在我看来,模块是捆绑的类,只能通过定义明确的接口访问。它们隐藏了所有实现细节,并且可以重用。模块定义了它们所依赖的模块。

组件有什么区别?我在一些书中进行了查找,但是组件的描述非常相似。


5
哪种语言?哪个架构?您对模块的定义有效。我认为组件是某种东西,例如可以插入GUI的东西,而模块不能插入GUI。如果GUI结构包装/支持,则模块可以在GUI中工作。
Guy Coder 2012年

3
请参见类与组件与控件。注意:我没有回答,因为您的问题没有提到语言或体系结构。
Guy Coder 2012年

是的,在这种情况下,我会考虑一般的定义
Mirco

2
确定要得到有效答案后,我不会再加分了。如果您发现此答案有效,请随时编辑问题并将链接添加为所需的答案。我不会将其发布为答案,因为问题过于笼统,特定的答案可能会使其他人陷入困境。
Guy Coder 2012年

是的,我想我的问题很笼统,答案确实取决于所使用的语言或环境。Nerver认为这些术语有太多不同的定义
Mirco,

Answers:


12

这些术语是相似的。我通常认为“模块”大于“组件”。组件是单个部分,通常范围较小,可能是通用的。示例包括UI控件和“后台组件”,例如计时器,线程助手等。“模块”是整体的较大部分,通常执行复杂的主要功能而不受外界干扰。它可能是提供与电子邮件或数据库集成的应用程序的类库。它可能与套件的单个应用程序一样大,例如ERP /会计平台的“应收帐款模块”。

我也认为“模块”更具互换性。组件可以被复制,新的组件看起来像旧的组件,但是以某种方式“更好”,但是通常系统的设计更严格地依赖于组件(或替代组件,该组件旨在符合该组件的特定行为)。用非计算机术语来说,“组件”可以是汽车的引擎;您可以修补引擎,甚至可以完全替换它,但是汽车必须具有引擎,并且必须符合非常严格的规格,例如尺寸,重量,安装点等,以便替换汽车上的“现货”引擎本来是为了拥有 另一方面,“模块”意味着“插件”类型的功能。不管那个模块是什么 可以以一种轻量级的方式与之通信,以使模块的拆卸和/或更换对系统的其他部分影响最小。房屋的电气系统是高度模块化的;您可以将带有120V15A插头的任何东西插入任何120V15A插座,并期望插入的东西能够正常工作。只要系统的任何单个分支中的功率需求不超过安全限制,房屋布线就不会在乎插入什么地方。


4
所有答案确实对我有帮助,但我只能接受一个。因此,我接受KeithS,因为他的代表人数最低
Mirco

12

模块的一般含义是一组可重用的代码,与特定的程序无关。从一整套GUI库到单个类,一切都可以。

组件的一般含义是使用特定接口具有可替代性附加限制的模块。如果创建GUI Widget组件,则可以在需要Widget的任何地方使用它,而不必在调用代码中做任何特殊的事情。模块通常没有这种限制。Qt和GTK +是模块,但是如果没有大量的代码调用工作,我不能将它们交换出来,因此它们不是组件。

许多框架或编程语言都使用这些术语来表示更具体的内容,这就是人们询问上下文的原因。某种意义上来说,某些东西可能是一个组件,但是,如果它没有实现非常特定的IComponent接口,则在上下文中可能不会将其视为组件。在python中,它module具有非常特殊的技术含义,您可以使用import命令来获得某些东西。通常,人们指的是这些特定于上下文的含义。


您的定义很好,但是您的示例(Qt与GTK +)存在缺陷(尽管我同意我也不会将其中任何一个称为组件)。IMHO Qt和GTK +都包含数百个小组件,因此产生了非常广泛的接口集合。这使得几乎没有人会花时间为其中的一个创建兼容接口的替代品,就是恕我直言,为什么他们没有组件。但是,仅由于不能互换两个软件并不能使它们失去组件的资格,而只能成为具有公共接口的组件。
布朗

8

如果要从特定的语言,框架和它们自己的解释中进行抽象,则抽象软件粒度层次结构如下:

Product - application, library, service
  Module - GUI, core logic, data, etc...
    Component - purpose specific collection of objects
      Object - collection of primitives
        Primitive - numbers, functions, etc...
  • 产品

该产品简单明了,是连接的功能模块的有效集合。

  • 模组

顾名思义,模块的动机是模块化。与许多人声称的相反,它实际上并不意味着代码重用。有许多模块不是真正可重用的,并且与它们原本不适合的任何模块都不匹配。

分离不同的软件层非常重要,这可以使软件更易于实现和维护,并且如果需要将诸如前端之类的东西重新实现到不同的GUI框架,则模块化可以轻松,安全地进行操作而不会中断到处编码。

一个模块封装了一组组件,这些组件都可以满足模块要求所定义的共同目的。一个模块应该是独立的和完整的,虽然不能真正单独使用,但它应该能够与任何符合要求的实现一起使用。

  • 零件

就粒度而言,组件位于模块和对象之间。组件的目的是将通用对象的集合放在一起以形成特定目的的单元。

顾名思义,与模块不同,组件不是“独立的”,而是更大功能整体的一部分。

  • 宾语

对象是组件的较小组成部分。对象是基元的集合,并将它们耦合在一起以提供一个较低级别,更通用的对象,同时仍具有某些特定目的。

  • 原始

基元是最小,最简单和最低级别的软件开发粒度。它基本上只是整数和实数以及函数/运算符,尽管大多数语言都有自己的附加“一流公民”。

使用原语几乎无济于事,同时,它处于一个很低的水平,您几乎可以用它来完成所有事情。在直接使用基元时,要完成的代码非常非常冗长,疯狂且复杂。

  • 这一切有什么意义?

如上所述,直接使用基元是一个非常糟糕的主意。不仅因为它对于现代软件开发而言是不可能的复杂,缓慢且乏味,而且对测试和维护也极具干扰性和阻碍性。

将所有这些概念性部分整合到软件开发中可以使其变得更容易,更快,更简单和更安全。不管原子的通用性和通用性如何,您都不能用原子制造房子。那将是徒劳的。您的原子是您的图元,粘土是您的对象,砖块是您的组件,墙壁,地板和屋顶是您的模块,组装在一起就可以显示最终产品。

人类并没有真正发明任何东西,我们只发现宇宙中已经存在的事物,然后将其复制并应用到我们的生活中。相同的粒度层次结构是宇宙本身固有的,从原子甚至更低,再到有机分子,蛋白质,组织,器官,有机体及以上,现实本身遵循相同的原理-将小型,简单,功能受限和有目的的抽象事物组合到更大,更复杂,更实用的功能以及针对特定目的的功能。

  • 术语警告

从技术上讲,它们都是软件开发的“对象”,都是软件开发的“组件”,它们都是“模块化”的,足以将它们组合在一起,从意义上来说,它们都是“产品”,以此类推。 ..

这与术语或术语无关,而与扩大和缩小事物如何影响创造力和生产力的各个方面有关。关于不仅使用所有这些不同级别的重要性,而且关于不要试图在错误的级别上实现目标的重要性,这只会适得其反。


1
您的模块版本听起来像一个包。
JM Becker

1
@JMBecker并非如此,就粒度而言,包可以包括从对象集合到完整的独立产品的任何内容。打包比粒度链中的链接更能方便代码重用。
dtech

3

这取决于您的上下文。在某些语言中,模块已用于引用DLL级别组,在其他语言中,类似于“包”或“汇编”。组件用于COM事物以及游戏开发中常见的基于实体的组件。

用一般的体系结构术语来说,模块和组件都倾向于引用定义良好的接口背后的一些代码。通常,模块倾向于引用较大的包。通常会有一组接口,并且模块往往能够独立存在。

另一方面,组件往往是较小的代码束,通常小于完整的类。用他们的名字,他们往往是更大的东西的组成部分。有时这是应用程序本身,但是随着类设计中组合使用的增加,它通常意味着更大对象的组成部分。组件定义良好的界面还倾向于允许应用程序相互交换组件。模块往往没有这种可交换性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.