代碼好壞的評估分爲四個層次,可用,可讀,可維護,可擴展。這篇文章就從可讀這個角度看一看如何編寫出高質量的代碼。
代碼大全中很詳細的闡述瞭如何給變量取一個好的名稱,但開發中咱們可能沒法記住那麼多條,我選擇了部分很關鍵的條目進行舉例闡述。程序員
變量名應該很清晰的描述出該變量表明的事物包括大部分的臨時變量,如下舉幾個例子編程
- 當前日期 好名字:currentDate 壞名字:date - 每頁行數 好名字:linesPerPage 壞名字:x1,num
給布爾變量賦予暗含「真/假」含義的名字網絡
- 好名字:done,success,error 壞名字:status
給枚舉類型賦予所在組的前綴函數
enum today{ today_morning, today_afternoon }
常量命名大寫並傳遞自身含義編碼
- 好名字:CYCLE_NEEDED 壞名字:FIVE
團隊開發中你代碼被閱讀的次數遠大於編寫的次數,爲變量取合適的名稱是加強可讀性的一個關鍵步驟,工做中要盡力避免隨意給變量的命名。code
防護式編程分爲兩個部分orm
斷言接口
斷言的做用就是讓程序運行時自我檢驗。開發
int testData=0; assert testData!=1 :"testData is unexpectedly equal to 0"; assert testData==1 :"testData is unexpectedly equal to 1"; 輸出 testData is unexpectedly equal to 1 斷言爲真代表程序正常運行,錯誤表示出現異常。 用錯誤來處理預期會發生的錯誤,用斷言來處理毫不應該發生的錯誤。 能夠將斷言理解爲註解,可是它更主動的對程序進行判斷。 斷言能夠開啓和關閉,關閉後編譯器直接忽略斷言代碼,所以不能將執行程序放在斷言中。 上面四句出自代碼大全,第二句很重要,所謂預期錯誤就是源於外部的數據,不在程序員本身編碼範圍內出現的錯誤。
錯誤編譯器
錯誤的一大特徵就是咱們能夠預料,經常使用的處理方式有返回錯誤碼等,異常則是子程序遇到了本身沒法處理的錯誤將它拋出。
本章主要說明何時該建立子程序,又該如何建立子程序
編寫子程序可讓我代碼更精簡,更容易理解,但編寫時有幾個準則須要咱們覈對
另外什麼時候使用過程也值得咱們注意,當一個子程序的主要用途就是返回它名字指明的返回值就使用
書上說的讀起來有點繞,舉個例子就知道了 第一段 if(report(formattedReport)==success) then ... 第二段 status = report(formattedReport) if(status==success) then ... 這樣把對程序的判斷,和函數的調用分開了,使得程序更好閱讀
一句話就是用查詢表來代替複雜的邏輯判斷
直接訪問表
int [] dayOfmonth=new int []{31,39,31,30..........}; int month=1; //查詢1月份的天數 //表查詢 int day=dayOfmonth[month-1]; //邏輯查詢 if(month==1){ ... }else if(month){ ... } 能夠看到查詢表代替了複雜的邏輯判斷
階梯訪問表
int [] range=new int []{30,50,70,90}; char [] rank=new char[]{'A','B','C','D'}; int score=98; for(int i=0;i<range.length;i++){ if(score<30){ return rank[i]; } } 咱們不能直接將數字轉化爲字母,所以根據分數的範圍返回評級,採用階梯表法比較區間的上/下限。
所謂直線型就是將先後依賴的代碼組織在一塊兒,目的還是使代碼能被自上而下的閱讀,更容易被理解。
覈對準則
若沒有依賴關係,那相關語句被組織在一塊兒了嗎?