如何證明程序沒有bug?
正常情況下:bug不是人們有意寫的,bug其實是程序員犯的錯誤。
首先,我們把bug分類,不同的類型的Bug,不同的處理方式。盡量照顧到了,Bug就會少很多。
1.特殊需求。
特殊需求不算是bug,但是可能因為有些特殊的要求,導致代碼復雜度快速上升,而且重新架構(gòu)之后,依然無法簡化代碼結(jié)構(gòu)。這個就要和提出需求的人討論下,看看如何改進需求。在完成功能的情況下,降低代碼復雜度。
2.邏輯性Bug。
比如數(shù)值轉(zhuǎn)換錯誤,算法錯誤,計算結(jié)果不對等等。這塊就是考驗開發(fā)人員自身功力,特別是理解需求和耐心以及細致了。全看個人了。繞不過去,提升自身能力為上。
3.框架和框架應用Bug有些框架本身自帶bug,被代碼觸發(fā)之后,是修正還是繞過去,完全看具體的情況了。框架應用bug,因為對框架的某些技術細節(jié)不熟悉,胡亂用框架代碼導致的bug。或者代碼需求已經(jīng)超出框架設計初衷了。要么仔細學習文檔,要么繞行。
4.外部環(huán)境變化引入的Bug
舉個例子來說:網(wǎng)絡服務器的開發(fā),一般的開發(fā)環(huán)境都是高網(wǎng)速的局域網(wǎng)中,實際部署之后,可能會遇到極低網(wǎng)速連接情況。可能會引發(fā)在高速網(wǎng)絡開發(fā)環(huán)境中無法發(fā)現(xiàn)的Bug。數(shù)據(jù)庫連接也是同樣的問題,高負荷生產(chǎn)數(shù)據(jù)庫和低負荷的開發(fā)服務器的不同,會帶來一些bug這樣的不可預料的偶發(fā)Bug,只能是記錄好關鍵日志,以備后查。
下面說說如何避免BUG:
詳細和無歧義的需求規(guī)格和業(yè)務邏輯合理的架構(gòu)和模塊清晰明確的模塊間接口分而治之,降低復雜性不要復制代碼,盡可能抽取共用的部分,重復的代碼在修改時容易造成不一致當代碼有自解釋性,使用標識符清洗標明變量和方法的含義,少用字面量,只有一次調(diào)用的代碼段也值得抽取成函數(shù)為代碼書寫注釋,函數(shù)或方法要詳述接口的參數(shù)和返回值,什么是未定義的行為。單行注釋或多或少,但在特殊的處理處一定要寫注釋,不僅要介紹怎么干,特別要介紹為什么這么干處理邊界條件,處理非法的參數(shù),考慮到各種邏輯分支編寫易讀的代碼,不過度使用技巧,難以理解的代碼很可能在修改中出錯編寫容易維護的代碼,使用面向?qū)ο蠓椒ê鸵蕾囎⑷耄綦x可變性消除副作用,使用不可變數(shù)據(jù)(如函數(shù)式編程,以Java為例,使用final修飾不可變變量)Fail-fast,使用assert來處理各種進入條件,退出條件等正確使用異常處理,捕捉能夠處理的異常不使用goto語句,盡可能減少switch語句,以多態(tài)取代switch限制函數(shù)的長度和圈復雜度單元測試,測試用例的數(shù)量應該和函數(shù)的圈復雜度相符,度量并提高測試覆蓋率進行代碼走查或評審,多一雙眼睛可能發(fā)現(xiàn)潛在的問題.希望對你有所幫助!請關注點贊,謝謝!