大部分程序员比较喜欢墨守成规,本质上是没有真正思考的菜B,人云亦云,或者说书上怎么说,那就一定是真理。
远古时代,二进制分发时代,不管是出于源码保护原因,还是纯粹的二进制分离,可以让使用者看到简单清晰接口的原因,亦或避免级联编译,亦或避免循环依赖等等原因,实现分离应该是个好选择。
但是如今机器性能极其优秀,级联编译成本极低。特别是现代采用mono repo的协作路子,级联编译本身就应该被触发,而不是被避免,因为应该尽可能保持使用依赖的项目最新版本,否则谈什么敏捷开发,谈什么使用最新的现代基础设施。二进制分发时代,升级编译器,升级操作系统是何等困难,听闻百度、阿里为了升级操作系统和gcc版本尽然花了两年,那么采用mono repo的协作方式,仅仅只需重新编译一次而已。另外mono repo时代,本来就应该让所有相关方看到相关实现,从而能让相关方更好的使用接口,当然如果代码确实需要保密,就只能二进制分发。
又听到有人说,因为把实现放在头文件会导致编译器重复编译,重复生成多份二进制,何其换缪,毕竟编译器拿到声明就可以完成编译(实现分离本来就看到不到实现),那么编译器为什么要去重复编译一把呢???
再者,循环依赖问题,使用C++是不可避免产生循环依赖的,本质上一个模块设计良好的项目应该尽可能避免循环依赖,其次,循环依赖往往只产生在少数文件,少数函数中,那么仅仅需要把该函数放到cc/cpp文件就好
再者,当声明实现分离时,修改需要修改两处,查看函数和成员变量时,得来回切换文件,极其影响开发体验