故事起源
在某一项目的开发中,使用统一接口A,碰到一个无法理解的项目设计。
A是公共头文件中的函数,每个cgi编译的时候都可以调用,A中各有语句是使用的动态库中B的函数#/test/shared/src/cgi/AFile.cppbool A(string sec) //函数功能是一个解密函数{ B(sec); //公共库文件中的函数}bool B(string sec) //实现了A()函数调用的B(){ //实现又一层的解密}
这样子的设计,如果后面有需要此功能的,理想当然的就会调用这个公共的函数,而对于开发人员来说动态库中的函数,如果正在使用,惯例思想就是,no problem(不知道别人是不是,反正我是,一般来说我很少会去检查库函数是否会有问题)
注意:库的设计需要考虑到各种相关制约的因素,不管你正在进行开发一个怎样的项目,如果你想开发一个公共的库,你就必须对这个库负起100%的责任 那么我很快就写出了我想要的东西,so easy!#/test/test/test.cppbool testFunc(CString sec){ bool ret = A(sec); //实现解密,A为公共函数,调用库里面的实现}
现实和理想的差距只在于,正常的参数传入,到动态库中的值都是一样的,可其其他地方解密出来的值就是不一样。
后来才弄懂,原来在动态库中的函数A中有调用一个函数B,这个函数才是最大的关键,即如下实现#/test/test/testB.cppbool B(string sec) //实现了A()函数调用的B(){ //实现又一层的解密}
函数B在动态库中有个实现,但是在我想要修改的代码目录下也有一个实现,这是way?为啥要这样设计?(反正我一直没有搞懂)
所以,我觉得开发代码的时候,怎么的也得抱着不要坑人的思想去开发: 库文件等公共函数的修改确实可能会产生较大的影响,那么你在放弃对公共函数修改却要实现一样功能的时候,怎么的函数名称也得换一下吧,不换也行(代码中的优先级高,不换也是没有问题的),==你起码备注下啊,而且最好使用英文来,中文容易乱码== 库文件中有一样的函数A,只是这个函数A中所调用的其中一个函数B不符合我的要求。这种情况下,你不想修改库函数,起码也不要抱着减少代码量的思想在自己的目录下覆盖这个函数B吧,后续开发的人维护真的很难。原因
这个问题根源在于符号冲突?库里面引用的函数是个弱引用,如果在你的代码中定义了同名函数,弱引用会被同名函数覆盖。
我注意过有一个很不好的习惯,喜欢把一些公共代码文件到处拷贝,比如:3DES,CRC32,MD5,等等。这样,如果你们的公共库也用了这些文件,就很容易出你说的这个问题。解决办法:
1)使用库的方式引用公共代码;
2)公共库名字加上可以区分的前缀,模块内部的代码不加前缀,防止覆盖库里的同名函数; 3)某一个功能作为公共的功能实现,其里面不能包含非公共的代码,即一个功能完整实现;