[toc]
耦合根因
耦合产生的本质是,本应该属于平行关系的模块AB,结果模块之间引用了彼此的符号。
这个符号指非static的 函数、全局变量、结构体。
代码里面最明显的表象就是,模块A include 模块B的一个.h
耦合和坏处
我目前感受最大的,就是冗余对接件
假设模块AB在最开始开发的时候,是要一起作为两个so对接件,放入同一个产品的,那这个时候开发者如果时间紧任务重,很可能为了开发效率,写着写着两个模块就深度耦合了,这个时候这俩对接件没有任何问题。
但是假设过了几个迭代,模块A现在要单独作为对接件so给其他产品使用,那么由于耦合关系,明明其他产品不需要B,但是你还是要强行带着B,这就是冗余对接件。
下沉
对于需要平行的两个模块,如果有个符号,AB都要使用,那就应该下沉到一个模块C,让AB同时依赖C,而不去依赖彼此。
这样子以后某个模块只用A,那就让AC一块出俩so给产品用就完事了
为什么一个.c文件不能编入多个so
假设我们图省事,AB模块不是都要用某个common.c
么,那么我把这个文件同时放进AB的CMakeList
里面,这样就解决了耦合问题,而且看似像是已经把common
下沉了。
假设,实际场景里面,有个组件Z,现在同时load A.so B.so
那么假设你的 模块A 和 模块B 的版本是不同的,可能会导致什么?
你的common.c内容是不同的,也就是说 A 和 B里面同样的一个符号,有可能里面的内容是不同的
那组件Z在载入过程中,读取common.c
里面的一个符号时,会随机选择AB中的符号,假设AB版本一致,那没有任何问题,一旦版本不一致代码有区别,那么每次载入的同名函数就可能内容不同
这可能会导致,你的程序运行和别人在不同设备上运行,得出的结果是完全不一致的,这样的问题你就百思不得其解
自己下一份组件,在自己的电脑上跑怎么样都没问题。但是换台设备就是有问题,极难定位。