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