前面幾篇,我們一直在討論怎么做好系統(tǒng)的架構(gòu)設(shè)計(jì)。架構(gòu)設(shè)計(jì)很重要,但是如果代碼編寫(xiě)的不好,那再好的設(shè)計(jì)也是白費(fèi)。今天,我們來(lái)聊聊編碼過(guò)程中,需要注意哪些問(wèn)題。
我覺(jué)得代碼編寫(xiě)過(guò)程中,有兩個(gè)方面需要額外的注意,一個(gè)是代碼的健壯性,一個(gè)是代碼的可維護(hù)性。
健壯性
先說(shuō)一下健壯性,簡(jiǎn)單講就是代碼在邊界條件下的表現(xiàn)如何。大部分人寫(xiě)代碼,一般只會(huì)考慮正常的邏輯情況。但是,一個(gè)優(yōu)秀的工程師,主要是看他對(duì)邊界條件的理解。
什么是代碼的邊界?我們可以把計(jì)算機(jī)系統(tǒng)抽象為針對(duì)用戶的輸入,經(jīng)過(guò)邏輯處理,給出相應(yīng)的反饋。那我們就可以在輸入、邏輯處理、反饋三個(gè)階段來(lái)考慮邊界。
在用戶輸入階段有哪些屬于邊界,我們可以去思考。比如用戶的輸入有沒(méi)有特殊的字符或者極限值。再比如極端情況下,有多少人同時(shí)在請(qǐng)求系統(tǒng)等等。
在邏輯處理階段呢,比如極限情況下有多少數(shù)據(jù)量需要處理,以及運(yùn)算所需的時(shí)間和空間成本如何,異常的數(shù)據(jù)怎么處理,當(dāng)硬件資源出現(xiàn)問(wèn)題的時(shí)候又需要怎么處理等等。
在給出反饋階段呢,比如特殊情況下如何反饋給用戶,極端情況下的數(shù)據(jù)能否展示出來(lái)等等。
大家可以看到,這三個(gè)階段都可以認(rèn)真的去考慮。你把邊界條件考慮的越詳細(xì),代碼的健壯性就越高。無(wú)論出現(xiàn)什么狀況,系統(tǒng)就越穩(wěn)定。
舉個(gè)實(shí)際代碼編寫(xiě)的例子,當(dāng)我們寫(xiě)一個(gè)函數(shù)的時(shí)候,有輸入?yún)?shù),也有輸出參數(shù)。如果不對(duì)輸入?yún)?shù)進(jìn)行必要的校驗(yàn)和判斷,就直接使用,這樣的代碼在邊界情況下就很容易出問(wèn)題。
再比如,在編寫(xiě)業(yè)務(wù)邏輯的過(guò)程中,我們采用了一種數(shù)據(jù)結(jié)構(gòu)和算法。這時(shí)候,我們就需要考慮這種數(shù)據(jù)結(jié)構(gòu)和算法在大數(shù)據(jù)量、大并發(fā)的情況下表現(xiàn)如何,時(shí)間和空間成本分別是什么樣的等等。
如果不提前考慮這些問(wèn)題,在真正實(shí)際應(yīng)用的過(guò)程中就會(huì)碰到各種意想不到的狀況。
可維護(hù)性
業(yè)務(wù)在不停的變化,相應(yīng)的支撐系統(tǒng)就要不停的更新和維護(hù)。代碼的可維護(hù)性決定了一個(gè)系統(tǒng)生命周期的長(zhǎng)短。那怎么做好可維護(hù)性呢?
我覺(jué)得首先要解決一個(gè)思維模式的問(wèn)題,寫(xiě)代碼并不是完成任務(wù)就可以,本質(zhì)是在交付一個(gè)產(chǎn)品。就是要拿產(chǎn)品交付的心態(tài)去寫(xiě)代碼。
什么是產(chǎn)品交付心態(tài),就是首先考慮真實(shí)用戶的感受。也就是說(shuō)在寫(xiě)代碼的時(shí)候,就要考慮其他人需要理解我的代碼,需要修改或者擴(kuò)展我的代碼,他的感受是什么樣的,我如何讓他更方便。
有了這個(gè)心態(tài),其他的事情就順理成章了。要不要寫(xiě)注釋,那就看一下當(dāng)前這段代碼好不好理解了,如果不好理解,那就必須要寫(xiě)注釋。要不要為變量起一個(gè)好的名字等等,你會(huì)發(fā)現(xiàn)當(dāng)你換一個(gè)心態(tài)在做的時(shí)候,這些抉擇就變得很自然。
其次就是要有一個(gè)基本的評(píng)判標(biāo)準(zhǔn),到底什么樣的代碼就算是易于維護(hù)了。我覺(jué)得越簡(jiǎn)單的事情越容易被人理解,也就越容易被維護(hù)。
我們一定要盡可能的保持邏輯的簡(jiǎn)潔性。比如一個(gè)方法就只能完成一件事情,代碼行數(shù)不能過(guò)多。一個(gè)類就只能承擔(dān)一個(gè)對(duì)象的職責(zé),不要試圖讓他做無(wú)關(guān)的事情。簡(jiǎn)潔算是基礎(chǔ)的一種評(píng)判標(biāo)準(zhǔn)。
代碼品味
無(wú)論是代碼的健壯性還是可維護(hù)性,都很難有唯一、可量化的標(biāo)準(zhǔn),很難簡(jiǎn)單的去管理或者檢查。他更多的是一種編碼的習(xí)慣,對(duì)每個(gè)人來(lái)說(shuō)都不是一蹴而就的。都需要我們對(duì)自己有很高的要求,經(jīng)過(guò)長(zhǎng)期的刻意練習(xí),才能達(dá)到。
怎么能持續(xù)的堅(jiān)持下來(lái),養(yǎng)成一個(gè)好的代碼習(xí)慣呢?我覺(jué)得首先我們自己得重視這個(gè)事情,整個(gè)團(tuán)隊(duì)氛圍也要重視這個(gè)事情。甚至在團(tuán)隊(duì)中養(yǎng)成一種代碼的品味,每個(gè)人都養(yǎng)成這樣的品味,這樣才能持續(xù)的把這個(gè)事情做好。
總結(jié)一下,好的代碼要有健壯性和可維護(hù)性,盡可能的考慮代碼的邊界情況,讓代碼的組織足夠簡(jiǎn)潔,持續(xù)的產(chǎn)品交付,最終形成我們自己的代碼品味。