在某一項目的開發中,使用統一接口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