软件设计师-结构化分析方法-耦合
耦合类型
内容耦合 - 最差
-
表现:一个模块直接修改或依赖于另一个模块的内部数据或实现细节(例如,直接操作另一个模块的内部变量)。
-
例子:模块A直接修改模块B内部的一个全局变量或私有成员变量。
-
违反原则:严重违反封装和信息隐藏原则。
公共耦合
-
表现:多个模块都依赖于同一个全局数据区(如全局变量、共享的数据库表)。
-
例子:多个类都直接读写同一个全局变量。修改这个全局变量的结构,所有依赖它的模块都可能需要调整。
-
问题:数据流向不清晰,难以追踪是谁在什么时候修改了数据。
外部耦合
-
表现:模块都依赖于同一个外部接口或协议(例如,都依赖同一个文件格式、硬件接口)。
-
例子:多个模块都需要按照特定格式读写同一个文件。如果文件格式改变,所有模块都受影响。
-
注意:这种耦合有时是不可避免的,但应将其限制在少数模块内。
控制耦合
-
表现:一个模块通过传递控制信号(如标志、开关参数)来影响另一个模块的内部逻辑。
-
例子:调用一个函数时,传入一个
isSorted参数,函数内部根据这个参数是true还是false执行完全不同的逻辑。 -
问题:被调用模块的行为不完全由自身决定,而是受调用者控制,增加了理解的复杂性。
标记耦合
-
表现:模块之间通过复杂的数据结构(如对象、结构体)进行交互,但可能只使用了该结构的一部分数据。
-
例子:函数A需要用户的名字,但函数B将一个完整的
User对象(包含名字、年龄、地址等)传给A。A只用了名字,但如果User对象的结构改变,A也可能需要重新编译。 -
改进:应该只传递必需的数据(如只传名字字符串)。
数据耦合 - 理想
-
表现:模块之间通过参数传递必需的基本数据类型进行通信,没有上述各种复杂的依赖。
-
例子:函数A调用函数B,并传递两个整数作为参数。B返回一个计算结果。这是最理想的耦合方式。
-
特点:依赖关系清晰、简单。
记忆技巧
| 耦合类型 | 核心特征 | 形象比喻 | 代码示例 | 好坏程度 |
|---|---|---|---|---|
| 内容耦合 | 直接修改对方内部 | 闯进别人家乱翻抽屉 |
| 🔴 最差 |
| 公共耦合 | 通过全局数据交互 | 多人共用一个公告板 | 多个模块读写同一个全局变量 | 🔴 很差 |
| 外部耦合 | 依赖相同外部环境 | 团队共用同一套工具 | 模块都依赖特定文件格式 | 🟡 较差 |
| 控制耦合 | 传递标志控制逻辑 | 遥控器指挥对方行动 |
| 🟡 中等 |
| 标记耦合 | 传递复杂数据结构 | 寄整个行李箱只为送钥匙 |
| 🟢 较好 |
| 数据耦合 | 只传必要基本数据 | 精准递送需要的东西 |
| 🟢 最佳 |
2024年下半年
以下哪个不能提高软件可维护性()
A. 多利用硬件的特点
B. 完善模块内容
C. 模块间联系加强
D. 确认各阶段软件设计文档的正确性
答案:C错误
解析:因为模块间的联系加强,说明模块之间的耦合程度高了,对于软件维护是不利的
2021年上半年
模块A通过非正常入口转入模块B内部,则这两个模块之间是()耦合。
A. 数据
B. 公共
C. 外部
D. 内容
答案:D
分析:直接操作另一个模块的内部变量
2019年上半年

答案:D
分析:通过复杂的数据结构传递,就是标记耦合
2018年下半年

答案:A
分析:
-
分析传递的内容:采购子系统向财务子系统传递的是“采购金额、收款方和采购日期”。这些是具体的业务数据项(金额是数值,收款方和日期是基本信息),而不是控制信号或复杂数据结构。
-
判断耦合类型:
-
这些数据是财务子系统直接需要的,没有提到传递多余或不相关的数据。
-
传递方式像是直接参数传递,而不是通过一个庞大的数据结构(如包含地址、电话等完整采购对象)。
-
没有控制标志(如“是否审核”),也没有通过外部媒介(如文件或数据库)。
-
因此,这符合数据耦合的特征:模块间只交换必要的基本数据,耦合度低。
-
- 为什么不是其他选项?
-
B. 标记耦合:如果传递的是整个采购订单对象(包含金额、收款方、日期等,但可能还有其他字段),而财务子系统只使用部分字段,才属于标记耦合。但题干强调传递的是具体信息(金额、收款方、日期),没有提到多余字段,因此更偏向数据耦合。
-
C. 控制耦合:如果传递的是控制信号(如“开始结算”、“取消操作”),才属于控制耦合。但这里传递的是业务数据,所以排除。
-
D. 外部耦合:如果数据通过全局变量或共享文件传递,才属于外部耦合。但题干没有提到外部介质,所以排除。
2018年上半年

答案:D错误
分析:
-
A. 调用模块的方式:会影响耦合程度(如直接调用耦合度高,间接调用耦合度低)。
-
B. 各个模块之间接口的复杂程度:接口越复杂,耦合度通常越高。
-
C. 通过接口的信息类型:会影响耦合类型(如传递数据耦合度低,传递控制信息耦合度高)。
-
D. 模块提供的功能数:这是模块内聚性的相关概念,不直接影响模块间的耦合程度。耦合程度只关心模块间的连接,而不关心模块内部有多少功能。
2017年下半年

答案:B
分析:传递数据结构,就是标记耦合
2016年上半年

答案:A
分析:多个模块都依赖于同一个全局数据区(如全局变量、共享的数据库表)。
2011年上半年
模块A之间访问模块B的内部结构,则模块A和模块B的耦合类型为()
A. 数据耦合
B. 标记耦合
C. 公共耦合
D. 内容耦合
答案:D
分析:一个模块直接修改或依赖于另一个模块的内部数据或实现细节(例如,直接操作另一个模块的内部变量)。是最差的耦合。
