總結(jié)測(cè)試開發(fā)中常見的程序設(shè)計(jì)問題喊暖,這篇的主要內(nèi)容是關(guān)于斷言的使用惫企。如果有任何有疑問,歡迎指出和討論哄啄,感謝雅任。
一、斷言和容錯(cuò)設(shè)計(jì)的使用
1咨跌、可以用static_assert執(zhí)行編譯時(shí)的斷言檢查
????如:static_assert(sizeof(char *) == 8, "不是64位模式")
2沪么、避免用斷言去檢查程序錯(cuò)誤:
????1)外部不可靠的數(shù)據(jù),應(yīng)該做嚴(yán)格檢查才能放到系統(tǒng)內(nèi)部锌半,這個(gè)時(shí)候它是守衛(wèi)禽车,提前檢驗(yàn)和過濾不合理的數(shù)據(jù)和參數(shù),應(yīng)該使用錯(cuò)誤檢查處理代碼(如KGLOG_COM_PROCESS_ERROR等)刊殉,
????而不是用斷言來做檢查
????*外部不可靠的數(shù)據(jù):是指如不合理的用戶輸入殉摔、或其他模塊傳入到該模塊的消息或數(shù)據(jù),
????有點(diǎn)像是對(duì)項(xiàng)目組外的員工记焊,要?jiǎng)佑庙?xiàng)目組的資源逸月,是需要經(jīng)過審核的
????2)系統(tǒng)內(nèi)部的交互數(shù)據(jù)(如程序內(nèi)部的調(diào)用),可以用斷言來檢查意想不到的錯(cuò)誤遍膜,或者程序內(nèi)部的假設(shè)碗硬。(即檢查它的潛規(guī)則、邏輯邊界瓢颅、隱形假定恩尾、輸出或內(nèi)部狀態(tài)是否如預(yù)期)
????*因?yàn)橄到y(tǒng)內(nèi)的調(diào)用者一般情況下是有義務(wù)負(fù)責(zé)傳遞給自己內(nèi)部的數(shù)據(jù)是合理正常的數(shù)據(jù)
????就像項(xiàng)目內(nèi)的員工,對(duì)于使用項(xiàng)目組的資源的門檻就會(huì)低很多
????*可理解為assert和出錯(cuò)處理是對(duì)所寫程序建立不同的信用級(jí)別挽懦,也方便在Release版可以性能更好的運(yùn)行程序
????3)推薦針對(duì)public的函數(shù)或接口的入口處對(duì)參數(shù)做嚴(yán)格的錯(cuò)誤檢查翰意;對(duì)于Private的函數(shù)或者只有這個(gè)模塊能看到的,可以用assert
3信柿、容錯(cuò)性程序設(shè)計(jì)常常要解決的是:現(xiàn)實(shí)中冀偶,防止用戶數(shù)據(jù)丟失或程序崩潰而采取的措施。只是除此之外渔嚷,也許可以適度考慮:
????*我們是否希望在進(jìn)行容錯(cuò)性程序設(shè)計(jì)時(shí)进鸠,錯(cuò)誤要不要被隱瞞?
????*實(shí)現(xiàn)程序時(shí)圃伶,如果有錯(cuò)誤(特別是意料之外的錯(cuò)誤)發(fā)生時(shí),
????1)我們有線索嗎?能得到什么窒朋?怎樣更好的定位和處理它搀罢?
????2)需要報(bào)警方案嗎?
????3)有預(yù)案嗎侥猩?
????4)可能的影響大嗎榔至?
4、避免斷言中使用改變環(huán)境的語句:
????如不正確的代碼:
????int Test(int i)
????{
????????assert(i++); ?//debug版和release版的i值就會(huì)不一樣
????????return i;
????}
????int main()
????{
????????int i = 1;
????????int nValue = Test(i);
????????printf("%d\n", ?nValue);
????????return 0;
????}
????合理的形式:
????int Test(inti)
????{
????????assert(i);
????????return++i;
????}
????注:與改變環(huán)境的語句類似的行為是宏定義欺劳。
????????????*請(qǐng)盡量不要在assert中調(diào)用宏唧取,以防止宏的副作用
以謙卑的心感受,以感恩的心生活