控制耦合与公共耦合的核心差异及LogLevel场景判定疑问
模块间存在多种耦合层级:
根据定义:
控制耦合:若模块间通过传递控制信息进行通信,则称它们为控制耦合。若参数指示完全不同的行为则存在弊端,若参数支持功能分解与复用则为良性。示例:接收比较函数作为参数的排序函数。
公共耦合:模块共享全局数据结构等数据。全局数据的变更需要追溯所有访问该数据的模块,以评估变更影响。
比如,我们可以将LogLevel传递给外部日志器,它可被视为控制信息。
那么能否认为程序与外部日志器之间存在控制耦合?LogLevel枚举也可被视为全局数据结构,这是否属于公共耦合?
我尚未理解二者的核心差异。
核心差异解析
通信方式与目的不同
控制耦合是主动传递控制指令/参数,目的是让被调用模块根据传入的控制信息调整自身行为。比如传递LogLevel给日志器,是明确告知日志器“只输出该级别及以上的日志”,属于模块间的主动交互。
公共耦合是共享全局数据实体,模块直接依赖全局存在的数据结构,而非通过参数传递。只有当LogLevel是全局变量,所有模块直接读取这个全局变量的值来决定行为时,才属于公共耦合;作为参数传递的情况不算。依赖关系的性质不同
控制耦合的依赖是显式、局部的:控制信息通过函数参数等方式显式传递,依赖关系仅存在于调用与被调用模块之间,变更影响范围容易界定。
公共耦合的依赖是隐式、全局的:所有共享全局数据的模块都依赖该数据的结构和值,一旦全局数据变更,所有访问它的模块都可能受影响,影响范围难以追溯。对复用性的影响不同
良性的控制耦合能提升复用性:比如排序函数接收比较函数参数,让排序逻辑可适配不同规则,复用性更强。传递LogLevel给日志器也属于这类,日志器可根据不同级别参数处理日志,复用性更好。
公共耦合会降低复用性:依赖全局数据的模块无法独立于全局环境使用,复用前必须确保全局数据的结构和值符合预期,限制了模块的独立使用场景。
针对你的例子的结论
- 把
LogLevel作为参数传递给外部日志器,属于控制耦合:你在传递控制信息,让日志器根据参数调整输出行为,是显式的模块间交互。 - 只有当
LogLevel是全局共享的实体(如全局变量、全局常量集合,且多个模块直接读取该全局实体而非通过参数传递),才属于公共耦合。
内容的提问来源于stack exchange,提问作者Bondarenko

