一個(gè)優(yōu)秀的程序員,往往有著良好的代碼習(xí)慣,每個(gè)好習(xí)慣都是一筆財(cái)富。在寫代碼的時(shí)候,注意這些細(xì)節(jié),可以讓你的bug減少很多,快來學(xué)學(xué)吧!
1. 代碼自測(cè)
在完成代碼的時(shí)候,有些初級(jí)程序員往往會(huì)偷懶,不去檢查自己的代碼,結(jié)果一跑起來問題多多。對(duì)于項(xiàng)目來說,即使修改了一行很小的代碼,都有可能出現(xiàn)各種各樣的問題,所以自測(cè)一下非常重要。
入?yún)⑿r?yàn)是每個(gè)程序員的必備素養(yǎng),很多低級(jí)bug都是不校驗(yàn)參數(shù)導(dǎo)致的。舉個(gè)例子:如果你的數(shù)據(jù)庫字段設(shè)置為varchar(16),對(duì)方傳了一個(gè)32位的字符串過來,你不校驗(yàn)參數(shù),「插入數(shù)據(jù)庫直接異?!沽?。
在修改老接口時(shí),一定要思考接口的兼容性,很多新手程序員因?yàn)榭紤]問題太簡(jiǎn)單而犯錯(cuò),就會(huì)導(dǎo)致非常嚴(yán)重的后果。
有一定工作經(jīng)驗(yàn)的程序員,往往會(huì)有個(gè)壞毛病,那就是不做注釋。一般的代碼沒必要添加太多注釋,但是,如果是「業(yè)務(wù)邏輯很復(fù)雜的代碼」,真的非常有必要寫「清楚注釋」。清楚的注釋,更有利于后面的維護(hù)。
5.使用完IO資源流,需要關(guān)閉
應(yīng)該大家都有過這樣的經(jīng)歷,windows系統(tǒng)桌面如果「打開太多文件」或者系統(tǒng)軟件,就會(huì)覺得電腦很卡。當(dāng)然,我們linux服務(wù)器也一樣,平時(shí)操作文件,或者數(shù)據(jù)庫連接,IO資源流如果沒關(guān)閉,那么這個(gè)IO資源就會(huì)被它占著,這樣別人就沒有辦法用了,這就造成「資源浪費(fèi)」。
6.避免低級(jí)錯(cuò)誤(如數(shù)組邊界溢出,被零除等)
日常開發(fā)中,我們需要采取措施規(guī)避「數(shù)組邊界溢出,被零整出,空指針」等運(yùn)行時(shí)錯(cuò)誤。
7.盡量不在循環(huán)里遠(yuǎn)程調(diào)用
遠(yuǎn)程操作和數(shù)據(jù)庫操作都是比較消耗資源的,所以盡量不在循環(huán)里遠(yuǎn)程調(diào)用、不在循環(huán)里操作數(shù)據(jù)庫,能「批量一次性查回來盡量不要循環(huán)多次去查」。
8.注意并發(fā)一致性問題
寫完代碼,最好腦洞下多線程,注意并發(fā)一致性問題。
9.獲取對(duì)象的屬性,先判斷對(duì)象是否為空
空指針異常是程序員常見問題之一,在想要獲取對(duì)象屬性時(shí),要先判斷是否為空,再獲取對(duì)象的屬性。
10.多線程異步優(yōu)先使用線程池
為什么優(yōu)先使用線程池?使用線程池有這幾點(diǎn)好處呀
- 它幫我們管理線程,避免增加創(chuàng)建線程和銷毀線程的資源損耗。
- 提高響應(yīng)速度。
- 重復(fù)利用。
同時(shí)呢,盡量不要所有業(yè)務(wù)都共用一個(gè)線程池,需要考慮「線程池隔離」。就是不同的關(guān)鍵業(yè)務(wù),分配不同的線程池,然后線程池參數(shù)也要考慮恰當(dāng)哈。
11. 手動(dòng)寫完代碼業(yè)務(wù)的SQL,先拿去數(shù)據(jù)庫跑一下,同時(shí)也explain看下執(zhí)行計(jì)劃。
手動(dòng)寫完業(yè)務(wù)代碼的SQL,可以先把它拿到數(shù)據(jù)庫跑一下,看看有沒有語法錯(cuò)誤嘛。有些小伙伴不好的習(xí)慣就是,寫完就把代碼打包上去測(cè)試服務(wù)器,其實(shí)把SQL放到數(shù)據(jù)庫執(zhí)行一下,可以規(guī)避很多錯(cuò)誤的。
12.調(diào)用第三方接口,需要考慮異常處理,安全性,超時(shí)重試這幾個(gè)點(diǎn)。
調(diào)用第三方服務(wù),或者分布式遠(yuǎn)程服務(wù)的的話,需要考慮
- 異常處理(比如,你調(diào)別人的接口,如果異常了,怎么處理,是重試還是當(dāng)做失?。?/li>
- 超時(shí)(沒法預(yù)估對(duì)方接口一般多久返回,一般設(shè)置個(gè)超時(shí)斷開時(shí)間,以保護(hù)你的接口)
- 重試次數(shù)(你的接口調(diào)失敗,需不需要重試,需要站在業(yè)務(wù)上角度思考這個(gè)問題)
13.接口需要考慮冪等性
接口是需要考慮冪等性的,尤其搶紅包、轉(zhuǎn)賬這些重要接口。最直觀的業(yè)務(wù)場(chǎng)景,就是「用戶連著點(diǎn)擊兩次」,你的接口有沒有hold住。
14. 多線程情況下,考慮線性安全問題
在「高并發(fā)」情況下,HashMap可能會(huì)出現(xiàn)死循環(huán)。因?yàn)樗欠蔷€性安全的,可以考慮使用ConcurrentHashMap。所以這個(gè)也盡量養(yǎng)成習(xí)慣,不要上來反手就是一個(gè)new HashMap();
15.主從延遲問題考慮
先插入,接著就去查詢,這類代碼邏輯比較常見,這「可能」會(huì)有問題的。一般數(shù)據(jù)庫都是有主庫、從庫的。寫入的話是寫主庫,讀一般是讀從庫。如果發(fā)生主從延遲,很可能出現(xiàn)你插入成功了,但是卻查詢不到的情況。
16.使用緩存的時(shí)候,考慮緩存跟DB的一致性,還有(緩存穿透、緩存雪崩和緩存擊穿)
通俗點(diǎn)說,我們使用緩存就是為了「查得快,接口耗時(shí)小」。但是呢,用到緩存,就需要「注意緩存與數(shù)據(jù)庫的一致性」問題。同時(shí),還需要規(guī)避緩存穿透、緩存雪崩和緩存擊穿三大問題。
云和數(shù)據(jù)作為一個(gè)深耕IT職業(yè)教育多年的教育者,目前的課程涵蓋云計(jì)算、大數(shù)據(jù)、人工智能、虛擬現(xiàn)實(shí)、軟件工程、用戶體驗(yàn)設(shè)計(jì)、網(wǎng)絡(luò)安全、電子商務(wù)等八大方向,結(jié)合企業(yè)實(shí)際用人需求,只為培養(yǎng)更多高端IT技術(shù)人才。