软件工程-高内聚和低耦合

接口设计原则

好的接口应当满足设计模式六大原则,很多设计模式,框架都是基于高内聚低耦合这个出发点的。

  • 单一职责原则:一个类只负责一个功能领域中的相应职责。
  • 开闭原则:一个软件实体应当对扩展开放,对修改关闭。
  • 里氏代换原则:所有引用基类(父类)的地方必须能透明地使用其子对类的对象。
  • 依赖倒转原则:抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。
  • 接口隔离原则:使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口
  • 迪米特法则:一个软件实体应当尽可能少地与其他实体发生相互作用,例如外观模式,对外暴露统一接口

高内聚和低耦合

  • 内聚:每个模块尽可能独立完成自己的功能,不依赖于模块外部的代码
  • 耦合:模块与模块之间接口的复杂程度,模块之间联系越复杂耦合度越高,牵一发而动全身。
  • 目的:使得模块的"可重用性","移植性"大大增加。
  • 高内聚:指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。模块的内聚反映模块内部的紧密程度。一个模块只需要做好一件事,不要过分关心其他任务。高内聚的好处是可以提高程序的可靠性
  • 低耦合:模块与模块之间,系统与系统之间的交互,是不可避免的,但是我们要尽量减少由于交互引起的单个模块无法独立使用或者无法移植的情况发生,尽可能多的单独提供接口用于对外操作,这个就是所谓的"低耦合"。

通常程序结构中各模块的内聚程度越高,模块间的耦合程度就越低。

耦合性和内聚性是模块独立性的两个定性标准,将软件系统划分模块时,尽量做到高内聚低耦合,提高模块的独立性,为设计高质量的软件结构奠定基础

耦合的类型(耦合强度由低到高)
  1. 无直接耦合:两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的。耦合度最弱,模块独立性最强。子模块无需知道对方的存在,子模块之间的联系,全部变成子模块和主模块之间的联系

  2. 数据耦合:一个模块访问另一个模块时,彼此之间是通过简单数据参数(不是控制参数、公共数据结构或外部变量)来交换输入、输 出信息的

  3. 标记耦合:指两个模块之间传递的是数据结构,如高级语言中的数组名、记录名、文件名等这些名字即标记,其实传递的是这个数据结构的地址。

  4. 控制耦合:指一个模块调用另一个模块时,传递的是控制变量(如开关,标志等),被调模块通过该控制变量的值有选择地执行块内某一功能

  5. 外部耦合:一组模块都访问同一全局简单变量,而且不通过参数传递该全局变量的信息,则称为外部耦合

  6. 公共耦合:指通过一个公共数据环境相互作用的那些模块间的耦合。公共耦合的复杂程序随耦合模块的个数增加而增加。

    a. 无法控制各个模块对公共数据的存取,严重影响了软件模块的可靠性和适应性。

    b. 使软件的可维护性变差。若一个模块修改了公共数据,则会影响相关模块

    c. 降低了软件的可理解性。不容易清楚知道哪些数据被哪些 模块所共享,排错困难

  7. 内容耦合:这是最高程度的耦合,也是最差的耦合。

    a. 一个模块直接访问另一个模块的内部数据;

    b. 一个模块不通过正常入口转到另一个模块内部;

    c. 两个模块有一部分程序代码重叠

    d. 一个模块有多个入口。

    内容耦合可能在汇编语言中出现。大多数高级语言都已设计成不允许出现内容耦合。这种耦合的耦合性最强,模块独立性最弱。

内聚性分类(低–>高)
  1. 偶然内聚:指一个模块内的各处理元素之间没有任何联系。
  2. 逻辑内聚:指模块内执行几个逻辑上相似的功能,通过参数确定该模块完成哪一个功能。
  3. 时间内聚:把需要同时执行的动作组合在一起形成的模块称为时间内聚模块。
  4. 通信内聚:指模块内所有处理元素都在同一个数据结构上操作(又时称为信息内聚),或者模块中所有元素都使用相同的输入数据或产生相同的输出数据。
  5. 顺序内聚:指一个模块中各个处理元素都密切相关于同一功能且必须顺序执行,前一功能元素输出就是下一功能元素的输入
  6. 功能内聚:这是最强的内聚,指模块内所有元素共同完成一个功能,缺一不可。与其他模块的耦合是最弱的。

一般认为,偶然内聚、逻辑内聚和时间内聚属于低内聚,通信内聚属于中内聚,顺序内聚和功能内聚属于高内聚。在设计软件时尽可能做到高内聚,并且能辨认出低内聚的模块,从而通过修改设计提高模块的内聚性,降低模块之间的耦合程度,提高模块的独立性,为设计高质量的软件结构奠定基础。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

活火石

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值