關于codereview,在平時的開發中,經常忽略的環節,參照目前介紹寫好代碼的幾本書和之前掉進的坑,做了一個總結,分享出來。
為什么要做
- 通過review規避一些代碼層面的問題
- 提升可讀性,方便后續擴展和維護
- double check 確保代碼質量
檢查列表
注釋
- 寫有意義的注釋
- DO屬性上,名字無法識別業務含義的,加注釋
- service接口和manager接口,注明方法的說明
- 代碼塊中的復雜邏輯,添加注釋
風格
- 域名不要寫死
- 不同環境下差異的,注意使用配置項
日志
- 合理分配日志級別,warn和error要分開
- 日志中,異常信息要記錄,第一個參數簡短說明,第二個異常信息
- 日志異常注意把相關的參數信息記錄下來,例如userId等
- 異常拋日志的情況下,主要不要引入二次異常
- 配置參數
線程安全
- 需要被多個線程訪問的對象是否線程安全,檢查有無通過同步方法保護
- 在保證線程安全的同時,要注意避免過度使用同步,導致性能降低
- 不用使用Java原生的線程處理方法,推薦使用JUC框架中的類
- 根據場景選擇不用的線程池來實現,會用簡化版Executors,理解處理過程
異常處理
- 不要直接e.printStackTrace,用Logger記錄下來
- 異常捕獲之后,要做響應的處理,返回錯誤提示或者記錄日志,切忌啥都不做
- 當前程序中能夠處理的異常,捕獲即可,無法處理的,拋出
- 異常只為異常服務,不要摻雜業務邏輯到異常中
性能
- 避免多重的RPC或者網絡IO的循環,盡量批處理
- 避免無窮循環,要有終止條件判斷
- 不要主動進行垃圾回收,代碼中不要有System.gc()
- String的split方法不要用,用開源包中的StringUtil工具類
- 字符串的拼接,使用StringBuilder和StringBuffer
代碼邏輯
- 不要在finally中return(try中的返回值,屏蔽異常)
- volatile不具有原子性,劃分好synchronized的粒度問題
- 推薦使用Guava作為工具處理類
- 推薦joda來處理時間,然后SimpleDateFormat是非線程安全的
- 單個方法超過50行,要做抽取,否則無法保證可讀性
- 方法入參超過5個,抽取到QueryTO中進行處理
- for或if的層級嵌套,不要超過4層
- if的邏輯判斷中,多個||和&&的組合,注意拆分處理
- case語句后面,需要加break
- if后面,記得寫大括號
- 文件資源,訪問后,記得close掉
- 排序優先使用Comparator,一個類的擴展排序工具
- 使用addAll、retainAll、removeAll優雅實現并集、交集、差集
- List的remove,使用迭代器來進行刪除
事務處理
- 多表同時更新操作,需要事務包裹,并驗證過
- 批量插入,使用iBatis的batchInsert特性,需要在事務下才生效,可以通過wireshark查看網絡情況
- 分布式場景下,可以使用消息中間件來保證最終一致性
- 聲明式事務注解標簽,盡量在manager層搞掉,不要搞到service層或者web層
- 一些可能出現重復處理的方法,記得做冪等操作
重復代碼
- don’t repeat yourself
- 同樣的業務邏輯處理,不要有兩份代碼
安全問題
XSS
- cookie設置httponly屬性
- jsonp輸入輸出檢查
CSRF
- 服務端增加CSRF校驗,增加token
- 必要的驗證碼
水平權限
- 不用用戶之間的不能相互操作
標準
- 代碼整潔
- 可讀性好
- 可維護性高
- 性能優
本文轉自:http://iamzhongyong.iteye.com/blog/2149463