Java程式碼走查具體考察點

振宇要低調發表於2017-08-28

程式碼走查具體考察點

 

一、引數檢驗

  1. 公共方法都要做引數的校驗,引數校驗不通過,需要明確丟擲異常或對應響應碼。
  2. 在介面中也明確使用驗證註解修飾引數和返回值,作為一種協議要求呼叫方按註解約束傳參,返回值驗證註解約束提供方按註解要求返回結果。

二、魔法數字(幻數)

在程式碼中要杜絕幻數,幻數可定義為列舉或常量以增強其可讀性。

三、空指標檢驗

  1. 不確定返回集合是否可為空時,要先做非空判斷,再做for迴圈。
  2. 儘量返回空物件,或者空集合,而不是null。
  3. 判斷字串為空時,先判斷是否為空,再判斷是否空串,最好將其提出公共方法。
  4. 使用a.equal(b)時,把常量放在左邊。

四、下標越界

如果方法傳入陣列下標作為引數,要在一開始就做下標越界的校驗,避免下標越界異常。

五、重複程式碼檢驗

不允許寫重複程式碼(四行左右重複計算重複程式碼),重複程式碼要使用重構工具提取重構。

六、命名規範

  1. 包、類、方法、欄位、變數、常量的命名要遵循規範。
  2. 命令要名副其實,一方面增加可讀性,另一方面促使我們在起名的過程中思考方法、變數、類的職責是否合適。
  3. 儘量不要在迴圈中呼叫服務,不要在迴圈中做資料庫等跨網路操作。
  4. 迴圈或者遞迴,要注意其是否一定包含了停止迴圈/遞迴的條件。
  5. 儘量避免while(true),一定要寫的話,迴圈開始要加一個sleep,這樣避免一上來就異常,跑死CPU。

七、注意迴圈

八、關心頻率

寫每一個方法時都要關心這個方法的呼叫頻率,一天多少,一分多少,一秒多少,峰值可能達到多少,呼叫頻率高的一定要考慮效能指標,考慮是否會打垮資料庫、快取等。

九、差錯控制

  1. 避免過大的 try 塊,不要把不會出現異常的程式碼放到 try 塊裡面,儘量保持一個 try 塊對應一個或多個異常。
  2. 細化異常的型別,不要不管什麼型別的異常都寫成 Excetpion。
  3. catch 塊儘量保持一個塊捕獲一類異常,不要忽略捕獲的異常,捕獲到後要麼處理,要麼重新丟擲新型別的異常。
  4. 方法內部,不要把自己能處理的異常拋給別人。
  5. 不要用 try...catch 參與控制程式流程,異常控制的根本目的是處理程式的非正常情況。

十、關於長度

如果一行程式碼過長,要分解開來;如果一個方法過長,要重構方法;如果一個類過長要考慮拆分類

十一、外部依賴的效能

如果呼叫了外部依賴,要搞清楚這個外部依賴可以提供的效能指標,考量其是否能夠提供符合我們使用場景的服務。

十二、避免重複造輪子

不要重複造輪子,如果已經有成熟類庫實現了類似功能,要優先使用成熟類庫的方法,這是因為成熟類庫中的方法都經過很多人的測試驗證,已經非常可靠了。

十三、注意多執行緒

多執行緒環境中,要注意資料的原子性與可見性等執行緒安全問題,最典型的HashMap,SimpleDateFormat,ArrayList是非執行緒安全的,另外如果使用Spring自動掃描服務,那麼這個服務預設是單例,其內部成員是多個執行緒共享的,如果直接用成員變數是有執行緒不安全的。

十四、日誌列印

  1. 列印日誌要設定合理的日誌級別。
  2. 生成長字串的toString()時,通過日誌級別和if語句達到控制列印量的目的。原因是,長字元傳拼接會佔用很多gc年輕代記憶體。
  3. 要通過log4j列印日誌而不是直接把日誌列印到控制檯。

十五、方法實現的簡潔

這個無法說的太細,總之是不要囉裡囉嗦的寫程式碼,具體問題要具體分析。

十六、正向依賴

不能讓底層模組依賴於上層模組;不能讓資料層依賴於服務層;也不能讓服務層依賴於UI層;更不能在模組之間形成迴圈依賴關係。

十七、分治

分而治之,複雜的問題要分解成幾個相對簡單的問題來解決,首先要分析出核心問題,然後分析出核心的入參是什麼,結果是什麼,入參通過幾步變化可以得出結果。(該條與第十條:關於長度,有一定的重合)

十八、程式碼健壯性意識

該條是前面幾條的整合,比較綜合。考慮各種邊界條件(例如第四條下標越界、使用者輸入資料超出最大值等)、處理失敗或出異常的方法(參考第九條、差錯控制)、校驗入參和返回值(參考第一條引數校驗)

 

相關文章