乐于分享
好东西不私藏

软件设计中内聚与耦合层次识别与理解

软件设计中内聚与耦合层次识别与理解

       大家好,我是架构师小蒽,为您趣味讲解软考高级架构师,系统分析师备考知识,希望能够在信息技术方面帮到您!分享内容不是课本知识的照搬,而是基于理解和项目实践的体会,如有疏忽不对的地方,欢迎指教。

下面是#系分架构100个知识点精讲内容专栏 

在软件工程领域构建复杂系统时,开发者往往需要考虑:如何将庞大系统拆分为模块,并让这些模块既能高效协作,又能方便维护

说人话:为了方便程序模块的扩展与复用等需求,模块间应该如何“保持距离”,模块内部又该怎样“紧密结合”

一、内聚(Cohesion)

原则:内聚越高越好,表示模块职责单一、清晰。

表示模块内部联系的紧密程度,从最密切到疏远

内聚类型

说明

示例

功能内聚

模块内所有元素共同完成一个单一的、明确的功能

一个 CalculateSquareRoot() 模块,只做计算平方根一件事

顺序内聚

模块内元素按顺序执行,上一个的输出是下一个的输入,且共享数据

先读取温度值,再根据温度计算冷却时间,最后输出控制信号

通信内聚

模块内元素操作同一个数据集(如同一数据结构或数据库表)

多个函数都访问同一个订单表:新增、修改、删除订单

过程内聚

模块内元素按某种流程顺序执行,但之间不一定传递数据

一个“初始化设备”模块:先开电源,再自检,再设置参数,但彼此无数据依赖

时间内聚

模块内元素仅在时间上相关(如都必须在同一时间执行)

一个“系统启动”模块:加载配置文件、初始化日志、连接数据库

逻辑内聚

模块内元素通过一个控制标志选择执行,逻辑上相关但功能不同

一个 ProcessAll() 模块,根据参数 type 分别处理 ADDDELETEUPDATE

偶然内聚、巧然内聚

模块内元素毫无关联,只是为了方便而放在一起

一个 Utils 模块里既有字符串处理、又有数学计算、还有文件读写

在开发中,函数功能尽量单一设计,哪怕是Utils工具类都要进行细分,避免不相关的数据整合在一起。

二、耦合(Coupling)

原则:耦合越低越好,表示模块独立性强、修改影响小。

模块之间相互依赖的程度从最低程度到最高如下:

耦合类型

说明

示例

非直接耦合

两个模块之间没有直接的数据或控制联系,完全通过外层模块调用

非直接耦合指两个模块没有相互传递信息,各自独立。典型例子:两个互不调用的工具函数

数据耦合

模块之间通过参数传递基本数据类型(如 int, float)交换信息

calcArea(width, height) 调用 printResult(area),传递整数或浮点数

标记耦合

模块之间传递数据结构(如记录、对象),但只使用其中部分字段

传递整个 Employee 对象给函数,而该函数只用 Employee.name

控制耦合

一个模块向另一个模块传递控制信息(如标志位、命令码),使其执行不同逻辑

ProcessData(data, flag) 中,flag=1 做排序,flag=2 做统计

外部耦合

模块与外部环境(如 I/O、操作系统、硬件)交互,依赖外部约束

模块直接读写固定路径的文件 C:\temp\data.txt

公共耦合

多个模块共享全局数据区(如公共变量、全局数据库表)

模块 A、B、C 都读写同一个全局变量 g_balance

内容耦合

一个模块直接访问另一个模块的内部数据或代码(如跳转到内部标号)

模块 A 修改模块 B 的局部变量,或调用模块 B 的内部私有函数(汇编级跳转)

在开发中,内容耦合是大忌,对后续的修改和扩展非常不友好,另外采用消息队列、通知订阅等方式实现解耦。

真题

(1)指多个模块都访问同一个公共的数据环境,(2)指处理元素相关,而且按照特定次序执行。

请回答第1个问题

A:公共耦合  B:内容耦合  C:数据耦合  D:标记耦合

请回答第2个问题

A:过程内聚  B:顺序内聚  C:逻辑内聚  D:时间内聚

答案:1:A   2:A

文章声明:本文含AI辅助创作内容,内容经过检查核实

作者简介:知行小蒽,一个喜欢演讲写作的10年IT老兵,擅长中大型信息系统解决方案咨询规划、架构分析设计、APP网站设计开发上线,欢迎私信交流!