博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
无法理解的设计思路
阅读量:7233 次
发布时间:2019-06-29

本文共 1287 字,大约阅读时间需要 4 分钟。

故事起源

在某一项目的开发中,使用统一接口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)某一个功能作为公共的功能实现,其里面不能包含非公共的代码,即一个功能完整实现;

转载地址:http://zkvfm.baihongyu.com/

你可能感兴趣的文章