0%

模块设计

模块设计:高内聚低耦合的核心原则与实践

模块设计是结构化开发和面向对象开发中的核心环节,其目标是将系统分解为独立、可复用的模块,通过合理的模块划分和关系设计,提升系统的可维护性、可扩展性和开发效率。模块设计的核心原则是高内聚、低耦合,以下从设计准则、内聚类型、耦合类型三个维度详细解析.

模块设计的基本原则

模块设计需遵循以下关键准则,确保模块结构清晰、功能明确:

  1. 规模适中
    模块的大小应平衡 “可理解性” 和 “复用性”:过大的模块难以理解和维护,过小的模块会增加模块间的协作成本(如一个简单的 “加法” 功能无需拆分为多个模块)。
  2. 减少调用深度
    模块间的调用层次不宜过深(如避免 A 调用 B,B 调用 C,C 调用 D…… 的多层嵌套),过深的调用链会增加调试难度和系统复杂度。
  3. 扇入与扇出适中
    • 扇出:一个模块直接调用的其他模块数量(如模块 A 调用 B、C、D,则扇出为 3)。扇出过大意味着模块职责过多,扇出过小则可能拆分过细。
    • 扇入:调用该模块的上级模块数量(如 B、C 都调用 A,则扇入为 2)。扇入越大,说明模块复用性越高(如通用工具类的扇入通常较大)。
      一般建议扇出控制在 3~7 之间,扇入根据复用需求调整。
  4. 单入口、单出口
    模块应只有一个入口(被调用的起始点)和一个出口(执行结束的返回点),避免多入口导致的逻辑混乱(如函数中多个return语句需谨慎使用,确保流程清晰)。
  5. 作用域小于控制域
    • 作用域:模块内定义的变量、常量等可被访问的范围。
    • 控制域:模块直接或间接调用的所有模块范围。
      原则上,模块的作用域应局限于自身控制域内,即被访问的元素不应超出其调用链覆盖的范围,否则会导致依赖关系混乱。
  6. 功能可预测
    模块的输出应仅由输入决定,不受外部环境或执行顺序的干扰(如纯函数:相同输入始终返回相同输出),避免 “隐藏状态” 导致的不可控行为。

内聚类型:衡量模块内部元素的关联程度

内聚(Cohesion)是指模块内部各元素(语句、函数、数据)之间的关联强度,内聚度越高,模块的独立性越好。内聚类型从高到低可分为 7 类:

内聚类型 核心特征 示例 内聚度
功能内聚 模块内所有元素协同完成单一功能,缺一不可。 一个 “计算圆面积” 的模块(包含半径输入、π 值定义、面积计算、结果返回)。 最高
顺序内聚 模块内元素处理相关数据,且需按固定顺序执行(前一步的输出是后一步的输入)。 一个 “读取文件→解析数据→保存到数据库” 的模块。
通信内聚 模块内所有元素操作同一数据集或生成同一数据集 一个 “查询学生成绩→统计平均分→打印成绩单” 的模块(均围绕 “学生成绩” 数据集)。 中高
过程内聚 模块完成多个独立任务,任务按指定流程执行(顺序不严格依赖数据)。 一个 “用户登录→验证权限→显示首页” 的模块(步骤有顺序,但数据关联性弱)。
时间内聚 模块内任务需在同一时间间隔内执行(如初始化、清理)。 一个 “系统启动时初始化数据库→加载配置→启动服务” 的模块。 中低
逻辑内聚 模块内任务逻辑相似,通过参数选择执行其中一个(功能发散)。 一个 “根据参数执行‘添加 / 删除 / 修改’用户” 的模块(三个功能逻辑相似但独立)。
偶然内聚 模块内元素无任何关联,仅因代码片段凑在一起。 一个包含 “计算面积、打印日志、生成随机数” 的模块(功能完全无关)。 最低

设计目标:优先采用功能内聚和顺序内聚,避免逻辑内聚和偶然内聚。例如,将 “用户管理” 拆分为 “添加用户”“删除用户” 等功能内聚的模块,而非一个包含所有操作的逻辑内聚模块。

耦合类型:衡量模块间的依赖程度

耦合(Coupling)是指模块之间的依赖强度,耦合度越低,模块的独立性越好。耦合类型从低到高(从优到劣)可分为 7 类:

耦合类型 核心特征 示例 耦合度
非直接耦合 模块间无直接联系,仅通过主模块协调(最理想)。 模块 A 和模块 B 均被主模块调用,但 A 和 B 之间无任何交互。 最低
数据耦合 模块间通过参数传递简单数据(如整数、字符串)。 模块 A 向模块 B 传递 “用户 ID(整数)”,B 返回 “用户名(字符串)”。
标记耦合 模块间传递记录或数据结构(如对象、结构体),但仅使用其中部分字段。 模块 A 向模块 B 传递 “用户对象”,但 B 仅使用其中的 “年龄” 字段。 中低
控制耦合 模块间传递控制变量(如开关、标志位),被调用模块根据变量选择执行逻辑。 模块 A 向模块 B 传递 “flag=1”,B 根据 flag 值执行 “查询” 或 “修改” 操作。
外部耦合 多个模块共享同一全局简单变量(非数据结构)。 模块 A 和模块 B 均直接访问全局变量 “count”(未通过参数传递)。 中高
公共耦合 多个模块共享同一公共数据环境(如全局数组、数据库表、文件)。 模块 A、B、C 均直接读写同一个全局配置文件。
内容耦合 一个模块直接访问另一个模块的内部数据或代码(如修改私有变量、调用私有函数)。 模块 A 直接修改模块 B 的私有变量 “password”。 最高

设计目标:优先采用数据耦合和非直接耦合,避免控制耦合及以上的高耦合。例如,模块间通过参数传递必要的简单数据(数据耦合),而非共享全局变量(外部耦合)或直接修改内部数据(内容耦合)。

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10