我对术语模块和组件有一些疑问。在我看来,模块是捆绑的类,只能通过定义明确的接口访问。它们隐藏了所有实现细节,并且可以重用。模块定义了它们所依赖的模块。
组件有什么区别?我在一些书中进行了查找,但是组件的描述非常相似。
我对术语模块和组件有一些疑问。在我看来,模块是捆绑的类,只能通过定义明确的接口访问。它们隐藏了所有实现细节,并且可以重用。模块定义了它们所依赖的模块。
组件有什么区别?我在一些书中进行了查找,但是组件的描述非常相似。
Answers:
这些术语是相似的。我通常认为“模块”大于“组件”。组件是单个部分,通常范围较小,可能是通用的。示例包括UI控件和“后台组件”,例如计时器,线程助手等。“模块”是整体的较大部分,通常执行复杂的主要功能而不受外界干扰。它可能是提供与电子邮件或数据库集成的应用程序的类库。它可能与套件的单个应用程序一样大,例如ERP /会计平台的“应收帐款模块”。
我也认为“模块”更具互换性。组件可以被复制,新的组件看起来像旧的组件,但是以某种方式“更好”,但是通常系统的设计更严格地依赖于组件(或替代组件,该组件旨在符合该组件的特定行为)。用非计算机术语来说,“组件”可以是汽车的引擎;您可以修补引擎,甚至可以完全替换它,但是汽车必须具有引擎,并且必须符合非常严格的规格,例如尺寸,重量,安装点等,以便替换汽车上的“现货”引擎本来是为了拥有 另一方面,“模块”意味着“插件”类型的功能。不管那个模块是什么 可以以一种轻量级的方式与之通信,以使模块的拆卸和/或更换对系统的其他部分影响最小。房屋的电气系统是高度模块化的;您可以将带有120V15A插头的任何东西插入任何120V15A插座,并期望插入的东西能够正常工作。只要系统的任何单个分支中的功率需求不超过安全限制,房屋布线就不会在乎插入什么地方。
模块的一般含义是一组可重用的代码,与特定的程序无关。从一整套GUI库到单个类,一切都可以。
组件的一般含义是使用特定接口具有可替代性附加限制的模块。如果创建GUI Widget组件,则可以在需要Widget的任何地方使用它,而不必在调用代码中做任何特殊的事情。模块通常没有这种限制。Qt和GTK +是模块,但是如果没有大量的代码调用工作,我不能将它们交换出来,因此它们不是组件。
许多框架或编程语言都使用这些术语来表示更具体的内容,这就是人们询问上下文的原因。某种意义上来说,某些东西可能是一个组件,但是,如果它没有实现非常特定的IComponent
接口,则在上下文中可能不会将其视为组件。在python中,它module
具有非常特殊的技术含义,您可以使用import
命令来获得某些东西。通常,人们指的是这些特定于上下文的含义。
如果要从特定的语言,框架和它们自己的解释中进行抽象,则抽象软件粒度层次结构如下:
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框架,则模块化可以轻松,安全地进行操作而不会中断到处编码。
一个模块封装了一组组件,这些组件都可以满足模块要求所定义的共同目的。一个模块应该是独立的和完整的,虽然不能真正单独使用,但它应该能够与任何符合要求的实现一起使用。
就粒度而言,组件位于模块和对象之间。组件的目的是将通用对象的集合放在一起以形成特定目的的单元。
顾名思义,与模块不同,组件不是“独立的”,而是更大功能整体的一部分。
对象是组件的较小组成部分。对象是基元的集合,并将它们耦合在一起以提供一个较低级别,更通用的对象,同时仍具有某些特定目的。
基元是最小,最简单和最低级别的软件开发粒度。它基本上只是整数和实数以及函数/运算符,尽管大多数语言都有自己的附加“一流公民”。
使用原语几乎无济于事,同时,它处于一个很低的水平,您几乎可以用它来完成所有事情。在直接使用基元时,要完成的代码非常非常冗长,疯狂且复杂。
如上所述,直接使用基元是一个非常糟糕的主意。不仅因为它对于现代软件开发而言是不可能的复杂,缓慢且乏味,而且对测试和维护也极具干扰性和阻碍性。
将所有这些概念性部分整合到软件开发中可以使其变得更容易,更快,更简单和更安全。不管原子的通用性和通用性如何,您都不能用原子制造房子。那将是徒劳的。您的原子是您的图元,粘土是您的对象,砖块是您的组件,墙壁,地板和屋顶是您的模块,组装在一起就可以显示最终产品。
人类并没有真正发明任何东西,我们只发现宇宙中已经存在的事物,然后将其复制并应用到我们的生活中。相同的粒度层次结构是宇宙本身固有的,从原子甚至更低,再到有机分子,蛋白质,组织,器官,有机体及以上,现实本身遵循相同的原理-将小型,简单,功能受限和有目的的抽象事物组合到更大,更复杂,更实用的功能以及针对特定目的的功能。
从技术上讲,它们都是软件开发的“对象”,都是软件开发的“组件”,它们都是“模块化”的,足以将它们组合在一起,从意义上来说,它们都是“产品”,以此类推。 ..
这与术语或术语无关,而与扩大和缩小事物如何影响创造力和生产力的各个方面有关。关于不仅使用所有这些不同级别的重要性,而且关于不要试图在错误的级别上实现目标的重要性,这只会适得其反。
这取决于您的上下文。在某些语言中,模块已用于引用DLL级别组,在其他语言中,类似于“包”或“汇编”。组件用于COM事物以及游戏开发中常见的基于实体的组件。
用一般的体系结构术语来说,模块和组件都倾向于引用定义良好的接口背后的一些代码。通常,模块倾向于引用较大的包。通常会有一组接口,并且模块往往能够独立存在。
另一方面,组件往往是较小的代码束,通常小于完整的类。用他们的名字,他们往往是更大的东西的组成部分。有时这是应用程序本身,但是随着类设计中组合使用的增加,它通常意味着更大对象的组成部分。组件定义良好的界面还倾向于允许应用程序相互交换组件。模块往往没有这种可交换性。