众所周知,解决代码耦合问题的核心原则之一是信息隐藏。即把所有客户不需要关心的信息尽力隐藏起来,只暴露出仅需要被依赖的东西。这样做不仅可以控制变化的波及范围,降低测试成本,提高安全性,同时还能方便各种代码分析工具和重构工具对代码进行更精准的引用分析。
在信息隐藏的基础上,我们还需要做好不同软件模块之间的依赖管理。依赖管理包含了如何控制最小化依赖,如何发布自己的API,如何获取别人的API,以及如何对依赖关系进行追溯和控制,包括解决冲突。
信息隐藏和依赖管理影响着软件能否高效的独立开发、构建和测试,关乎着开发团队的协作效率以及软件的独立发布粒度。基于此,现代编程语言大都提供了丰富的信息隐藏手段和依赖管理工具,包括不同级别的代码符号可见性控制、显示的API导入与导出能力,以及模块化构建和包管理的工具链等等。
然而我们知道,C和C++语言由于出现年代早、历史包袱重,对符号隐藏以及依赖管理的特性和工具的支持演进较慢。尤其是C语言,相比其它语言更是捉襟见肘。在我咨询的大多C或C++项目中,最容易被问及的问题中就包含“我要如何管理这乱麻般的项目头文件”,并且但凡和代码有关的工作(无论重构、构建、测试)大多都得先从梳理混乱的头文件包含关系开始。
事实上,C和C++语言在实践中是有发展出自己的一套信息隐藏和依赖管理机制的,这些做法已经被许多优秀的C/C++项目广泛使用着。下面通过几篇文章分别给大家介绍下这些C/C++信息隐藏与依赖管理的优秀实践,虽然和别的语言相比仍旧有不完美的地方,但对于绝大多数项目来说已经完全够用了。
C/C++符号隐藏与依赖管理(一):代码符号隐藏
C/C++符号隐藏与依赖管理(二):库的符号隐藏
C/C++符号隐藏与依赖管理(三):头文件管理
C/C++符号隐藏与依赖管理(四):依赖管理
C/C++符号隐藏与依赖管理(五):代码库推荐
网友评论