对系统耦合的思考
常见的系统耦合有这么几种:
- 调用关系耦合:
- 简单数据参数耦合:当两个模块间通过参数来传递数据,并且所有的数据都是简单数据类型的时候,这两个模块之间的耦合关系就是简单数据参数耦合。这种耦合关系是正常的,可以接受的。
- 简单对象耦合: 如果一个模块实例化一个对象,那么它们之间的耦合关系就是简单对象耦合关系。这种耦合也不错
- 复杂对象耦合:区别于“简单对象耦合”,复杂对象的耦合是因为实例化对象比较复杂,比如对象的嵌套的层次比较深或者不确定的扩展参数。这种复杂性会导致理解成本和沟通成本的变大,而且过于复杂特别是灵活的扩展参数会导致耦合关系的不稳定性。
- 对象参数耦合:如果是Object1要求Objects2传递给他一个Object3,那么这两个模块就是对象参数的耦合。于Object尽要求Object2传递给它简单数据类型相比,这种耦合关系要更复杂,因为它要求Object2了解Object3
- 语义上的耦合:
- 控制信号的耦合:模块1向模块2传递了可以咯控制信号,用他来告诉模块2该做什么。这种方法要求模块1对模块2的内部工作细节有了解,也就是说要了解模块2对控制信号的是有。如果模块2把这个控制信号定义成枚举值、对象、或者控制的语义容易理解不存在二义性的话,这种方式还说的过去。
- 时间顺序的耦合:模块2在模块1修改了某个全局数据之后使用该全局数据。这种方式假设模块1的修改是满足模块2的需求的,而且模块1的修改必须在模块2之前。
- 数据依赖耦合
- 数据传递依赖:模块1需要依赖模块2传递的数据,如果模块1只是依赖模块2的数据来做时间触发还好,如果模块1需要依赖模块2提供的数据持久化并加工计算,这样的耦合就进一步加深了。如果模块2提供的数据还会发生变化,这就需要模块1落地的数据同步的修改,那么模块2和模块1的耦合就进一步加深。
- 数据引用依赖:比如模块1需要引用模块2的数据库表。模块1就对模块2提供的数据的精度、质量、格式等有依赖。
总结
分类 | 耦合模式 | 耦合程度 | 建议方案 |
---|---|---|---|
调用关系耦合 | 简单数据参数耦合 | 正常 | |
简单对象耦合 | 正常 | ||
复杂对象耦合 | 复杂 | 1.如果业务允许的情况下,结合业务场景把复杂对象分解掉;2.消除对复杂对象的调用耦合;3.探索调用关系反向是不是可以 | |
复杂对象耦合 | 复杂 | 要想办法避免 | |
语义的耦合 | 控制信号的耦合 | 正常 | 有避免控制信号业务上的不确定性 |
时间顺序的耦合 | 劲量避免,谨慎使用 | ||
数据依赖耦合 | 数据传递依赖 | 劲量避免,谨慎使用 | |
数据引用依赖 | 正常 | 需要通过数据依赖的检查来提早发现数据不兼容 |