無法理解的設計思路

ghosts93發表於2019-05-09

故事起源

在某一專案的開發中,使用統一介面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,這個函式才是最大的關鍵,即如下實現

#/test/test/testB.cpp
bool B(string sec)        //實現了A()函式呼叫的B()
{
    //實現又一層的解密
}

函式B在動態庫中有個實現,但是在我想要修改的程式碼目錄下也有一個實現,這是way?為啥要這樣設計?(反正我一直沒有搞懂)
所以,我覺得開發程式碼的時候,怎麼的也得抱著不要坑人的思想去開發:
庫檔案等公共函式的修改確實可能會產生較大的影響,那麼你在放棄對公共函式修改卻要實現一樣功能的時候,怎麼的函式名稱也得換一下吧,不換也行(程式碼中的優先順序高,不換也是沒有問題的),==你起碼備註下啊,而且最好使用英文來,中文容易亂碼==
庫檔案中有一樣的函式A,只是這個函式A中所呼叫的其中一個函式B不符合我的要求。這種情況下,你不想修改庫函式,起碼也不要抱著減少程式碼量的思想在自己的目錄下覆蓋這個函式B吧,後續開發的人維護真的很難。

原因

這個問題根源在於符號衝突?庫裡面引用的函式是個弱引用,如果在你的程式碼中定義了同名函式,弱引用會被同名函式覆蓋。
我注意過有一個很不好的習慣,喜歡把一些公共程式碼檔案到處拷貝,比如:3DES,CRC32,MD5,等等。這樣,如果你們的公共庫也用了這些檔案,就很容易出你說的這個問題。

解決辦法:

1)使用庫的方式引用公共程式碼;
2)公共庫名字加上可以區分的字首,模組內部的程式碼不加字首,防止覆蓋庫裡的同名函式;
3)某一個功能作為公共的功能實現,其裡面不能包含非公共的程式碼,即一個功能完整實現;

相關文章