耦合是指模块间联系的紧密程度, 内聚是指模块内处理单元连续的紧密程度.
高内聚低耦合的模块设计, 便于进行软件开发和维护.
设计模式是为了减少模块耦合,增强模块内聚而提出一系列设计指导性原则.
高内聚低耦合
耦合
耦合(coupling)也称块间联系,是指软件系统结构中各模块间相互联系紧密程度。
耦合的强度依赖于以下几个因素:
一个模块对另一个模块的调用
一个模块向另一个模块传递的数据
模块之间接口的复杂程度
耦合类型从强到弱可以分为:
内容耦合:当一个模块直接修改或操作另一个模块的数据,或者直接转入另一个模块时,就发生了内容耦合。
公共耦合: 一组模块都访问同一个全局数据结构,则称之为公共耦合。公共数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。
外部耦合: 一组模块都访问同一全局简单变量,而且不通过参数表传递该全局变量的信息,则称之为外部耦合。
控制耦合:一个模块通过接口传递一个信号控制另一个模块,称为控制耦合。
标记耦合:调用模块和被调用模块之间传递数据结构而不是简单数据,同时也称作特征耦合。
数据耦合:调用模块和被调用模块之间只传递简单的数据项参数。
非直接耦合:两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的。耦合度最弱,模块独立性最强。
内聚
内聚(cohesion)又称块内联系,是指一个模块内部各个元素彼此结合的紧密程度。
内聚类型从强到弱可以分为:
功能内聚:模块内所有元素的各个组成部分全部都为完成同一个功能而存在,模块仅包括为完成某个功能所必须的所有成分,这些成分紧密联系、缺一不可。
顺序内聚:一个模块中各个处理元素和同一个功能密切相关,而且这些处理必须顺序执行。 通常前一个处理元素的输出是后一个处理元素的输入。
信息内聚:指模块内各个组成部分都使用相同的数据或产生相同的数据结构, 也称为通信内聚。
过程内聚:一个模块内的处理元素必须以特定次序执行,允许处理元素之间没有数据进行传递。
时间内聚: 一个模块内的处理元素同时执行称为时间内聚。
逻辑内聚: 几种相关的功能组合在一起, 每次被调用时,由传送给模块参数来确定该模块应完成哪一种功能 ,称为逻辑内聚。
偶然内聚: 一个模块内的各处理元素之间没有任何联系,只是偶然地被凑到一起, 也称巧合内聚。
设计模式
Filters 过滤器
过滤器设计模式是让数据流通过一系列过滤器, 以使用过滤器处理数据流. 如Web Server通过过滤器链处理Web请求.
优点在于:
I/O关系表示明确
易于复用和修改
允许并发执行
缺点在于:
- 不适合交互式应用
Layering
将软件系统分为多层, 每一层只调用其下的一层, 只被其上一层调用. 典型应用如MVC模式, TCP/IP协议族.
优点:
- 耦合程度小, 便于修改
缺点:
设计阶段定义多层抽象困难
可能产生性能问题
Repositories
仓库模式又称为黑板模式, 不同的模块可以访问和修改同一块共享数据区. 如共享同一个数据库的多个web应用.
Interpreters
解释器模式将解释器与脚本分离, 常见应用如各种脚本语言的解释器.
Implicit Invocation 隐式调用
该模式典型应用为事件驱动模型, 首先在eventloop中注册handler, 在事件发生时由eventloop发布广播调用handler进行处理.