code review到底在審查什麼?

code review到底在審查什麼?

在做一個代碼的code review時,以下是我們需要關注的:

是否明晰

  • 代碼應該易於閱讀,應該一目瞭然地瞭解每行和每個功能,否則,它太複雜了。

  • 代碼應符合模塊內已使用的編碼風格(縮進,間距,命名約定等)

  • 每個函數或方法的預期意圖都應簡潔明瞭,並且一個函數不能超出一屏(幾十行代碼)。否則,它太複雜了。

  • 代碼是否適當地增加了註釋,以供他人理解和維護?

註釋是否簡潔,易於理解,並且實際上爲周圍的代碼增加了價值?

每個函數的意圖是否明確,或者增加描述意圖的最小注釋是否會有所幫助?

API是否用Javadoc(Java)記錄?

解釋爲什麼和解釋是什麼一樣重要,記錄意圖是最重要的記錄形式,因爲沒有人知道你在想什麼。

  • 是否使用了不必要的和/或晦澀的語言技巧,即使僅僅30秒也可能使讀者感到困惑?
  • 每個函數是否橋接一個抽象級別,調用較低級別的函數?
  • 是否存在跨越數十行的“函數”功能,這些功能可以輕鬆拆分爲子函數?
  • 代碼被註釋掉了嗎?在極少數情況下,這是適當的。一般來說,註釋掉的代碼使閱讀起來更困難,也很難理解-不要以爲每個人都在使用語法突出顯示。

正確性

  • 有明顯的錯誤嗎?
  • 有單元測試並且已經運行了嗎?
  • 單元測試是否足以測試代碼(或代碼的更改)?是否有代碼覆蓋工具會自動與構建一起運行?
  • 是否是線程安全的?是否在類或API級別記錄了線程安全性和併發性,以便調用者理解預期的語義?

設計意義

  • 設計是否有意義(更改或不更改)?
  • 更改是否適合現有設計(例如,新職責是否屬於更改後的實體)?
  • 所做的更改是否揭示了現有設計中的缺陷(例如,簡單的行爲更改需要複雜的代碼更改)?
  • 此更改是否完全解決了所有功能/問題的要求?需求的解釋方式可能導致生產中的問題是否存在歧義?

重用和重複代碼

  • 包內的代碼是否重複?如果在模塊中甚至幾行代碼被重複複製了多次,則表明需要重構。
  • 共享庫中應該有局部函數嗎?
  • 是否存在可以完全刪除或替換爲現有庫的代碼?

配置和常量

  • 是否在整個代碼中散佈了魔術數字或字符串常量,或更糟糕的是,重複多個地方使用這些常量?
  • 是否有所有配置都設置了默認值?
  • 配置文件是否增加了清晰的配置說明?

向後兼容和版本控制

  • 該代碼向後兼容其預先存在的API嗎?
  • 代碼向後兼容其預先存在的配置嗎?
  • 是否存在並非必需的向後不兼容的更改?
  • 如果存在向後不兼容的更改,將如何在軟件包構建和部署方面進行管理?

依存關係

  • 是否引入了新的外部依賴關係,是否會帶來新的可用性或操作風險?
  • 是否確實需要每個新庫依賴項?是否每個現有依賴項都絕對必要?您能以更簡單的方式解決問題嗎?不要僅僅將最新和最出色的組件視爲依賴項,因爲您認爲它們是浮華的。
  • 是否有替代的“較輕量”依賴項可以替代使用?

故障處理

  • 該代碼可處理任何庫代碼調用返回的意外值?

  • 代碼對非法輸入和空輸入怎麼處理?

  • 該代碼是否處理了邊緣case?

  • 代碼是否有清晰一致的異常處理策略?

性能

  • 是否有過早優化的跡象?
  • 有沒有明顯的性能或效率問題可以解決?
  • 如果大部分額外的時間都花在了代碼阻塞上,代碼執行時間也會更長嗎?

性能指標metrics

  • 該指標是否有助於運營活動?
  • 是否容易知道已部署的代碼在做什麼?
  • 從錯誤到調試的所有級別都有適當數量的日誌記錄嗎?
  • 代碼中是否收集了性能指標?
  • 每個日誌消息是否都包含足夠的相關信息,以便某人僅閱讀日誌消息就能瞭解系統的行爲?
  • 測試中是否包裝了複雜的info / debug / verbose日誌語句if (log level),以免影響性能?

SQL

  • 用戶輸入是否用於構建原始SQL?(請參閱SQL注入)
  • 在檢查之前是否已計劃好所有SQL查詢的解釋?
  • 是否在每個SQL語句上方以註釋的形式簽入瞭解釋計劃結果,作爲開發人員期望查詢執行的快照?在比較未來的解釋計劃以檢查假設是否發生變化時,這可能非常有用。
  • 是否正確使用了綁定變量,或者生成了一個關閉的SQL語句?
  • 此更改是否需要回填或直接數據庫更新,並且是否已審查了回填腳本?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章