【软件工程】模块分解之内聚和耦合

前言

模块是构成软件系统结构的基本元素。一个大的系统总是由若干个稍小的功能模块聚合而成的,而这些子模块可能又由更小的模块构成。模块出现在软件工程的软件设计中,作为软件设计中非常重点要的一部分,今天主要来总结一下关于模块的内聚与耦合。

模块分解

目的

模块分解的目的是将系统“分而治之”,以降低问题的复杂性,是软件结构清晰,易阅读、易理解、易于测试和调试,因而也有助于提高软件的可靠性。(通过对软件工程的学习,当然不光包括软件工程,我愈发发现我们学习到的所有东西(知识)在某种程度上(思想)来说都是相通的。)
但并非模块分的越小越好,因为模块数越多,模块之间的接口越多,模块之间的复杂度和工作量增加。显然,每个软件系统都有一个分解的最佳模块数M。选择分解的最佳模块数,可以在降低问题复杂度的同时获得较低的成本。
图片名称

模块的独立性

模块独立性

模块具有如下3个属性。

  1. 功能
    即指该模块实现什么功能,做什么事情。必须注意,这里所说的模块功能,应是该模块本身的功能加上它所调用的所有子模块的功能。

  2. 逻辑
    即描述该模块内部怎么做。

  3. 状态
    即该模块使用时的环境和条件。

所谓模块的独立性,是指软件系统中每个模块只涉及软件要求的具体的子功能,而和软件系统中其他的模块的接口是简单的。即具有独立性的模块应该是具有专一功能,模块之间无过多的相互作用的模块。
这种类型的模块可以并行开发,模块独立性越强,并行开发越容易。独立性强的模块,还能减少错误的影响,使模块容易组合、修改及测试。
模块独立性的度量标准是两个定性准则:耦合性和内聚性。

耦合性

耦合性是指软件结构中模块相互连接的紧密程度,是模块间相互连接性的度量。模块分解的一个目标是使模块之间的联系尽可能小,模块间联系的大小可以从3个方面来衡量。
图片名称

  1. 方式。块间联系方式有直接引用和过程语句调用。显然直接引用方式块间联系紧密。
  2. 作用。块间传送的共用信息(参数)类型,可为数据型、控制型和混合型(数据/控制型),控制型信息使块间联系增高。
  3. 数量。块间传送的共用信息的数量越大,块间联系越紧密。模块间公用的信息(如参数等)尽量少。

按照耦合性的高低,分为5中类型,如下图所示。
耦合性的高低

  1. 内容耦合
    内容耦合的模块常具有以下特征:一个模块直接访问另一个模块的内部数据,一个模块不通过正常入口转到另一模块的内部,一个模块有多个入口或者两个模块有部分代码重叠。
  2. 公共耦合
    若干模块访问一个公共的数据环境,则它们之间的耦合称为公共耦合。公共环境可为全局数据结构、共享的通信区、内存的公共覆盖区等。显然,公共数据区的变化,将影响所有公共耦合模块,严重影响模块的可靠性和可适应性,降低软件的可读性。
  3. 控制耦合
    一个模块传递给另一个模块的信息是用于控制该模块内部逻辑的控制信号。显然,对被控制模块的任何修改,都会影响控制模块。
  4. 复合耦合
    一个模块传送给另一个模块的参数是一个复合的数据结构,例如,包含几个数据单项的记录。
  5. 数据耦合
    一个模块传送给另一个模块的参数是一个单个的数据项或者单个数据项组成的数据。
内聚性

内聚性表示一个模块内部各种数据和各种处理之间联系的紧密程度,它是从功能的角度来度量模块内的联系。显然,块内联系越紧,即内聚性越强,模块独立性越好。
块内联系的类型分为6类,如下图所示。
这里写图片描述

  1. 偶然型内聚
    又称为巧合型,为了节约空间,将毫无关系(或联系不多)的各成分放在一个模块中,这样的模块显然不易理解,不易修改。
  2. 逻辑型内聚
    将几个逻辑上相似的功能放在一个模块中,调用时由调用模块传递的参数确定执行的功能。由于要进行控制参数的传递,必然要影响模块的内聚性。
  3. 瞬时型内聚
    将需要同时执行的成分房子一个模块中,因为模块中的个功能与时间有关,因此又称为时间内聚或经典内聚。例如,初始化模块、中止模块等这类模块内部结构比较简单,一般较少判定,因此比逻辑型内聚强,但是由于将多个功能放在一起修改,给修改和维护造成困难。
  4. 通信型内聚
    模块中的成分引用共同的输入数据,或者产生相同的输出数据,则称为通信内聚模块。通信型模块比瞬时型模块的内聚性强,因为模块中包含了许多独立的功能,但却引用相同数据。通信型模块一般可以通过数据流图来定义。
  5. 顺序型内聚
    模块中某个成分的输出是另一成分的输入。由于这类模块无论是数据还是在执行顺序上,模块中的一部分都依赖于另外一部分,因此具有较好的内聚性。
  6. 功能型内聚
    一个模块包括而且仅包括完成某一具体功能所必需的所有成分,或者说,模块的所有成分都是为完成该功能而协同工作、紧密联系、不可分割的,则称该模块是功能型的。

软件总体设计的总则是:降低块间联系,提高快内联系。

后记

简单一点来说吧,高内聚、低耦合讲的是程序单位协作的问题。
你可以这样理解,一个企业的管理,最理想的情况就是各个部门各司其职,井然有序,互不干涉,但是需要沟通的时候呢,各个 部门都可以找到接口人专门负责部门沟通以及对外沟通。
在软件里呢,就是说各个模块要职能明确,一个功能尽量由一个模块实现,同样,一个模块最好只实行一个功能,这就是所谓的“内聚”。模块与模块之间、系统与系统之间的交互,是不可避免的,但是我们要尽量减少由于交互引起的单个模块无法独立使用或者无法移植的情况发生,尽可能多的单独提供接口用于对外操作,这个就是所谓的“低耦合”。
但是在实际的设计开发过程中,总会发生这样那样的问题与情况。真正做到高内聚、低耦合是很难的,很多时候未必一定要这样,更多的时候“最适合”的才是最好的,不过,理解思想,审时度势地使用;融会贯通、灵活运用才是设计的王道。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 19
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值