杏仁醫(yī)生 iOS 端 Code Review 指南。
轉(zhuǎn)載注明出處
指南不僅針對(duì) Review 者,提交代碼前,自己也應(yīng)該按照步驟進(jìn)行檢查,避免低級(jí)錯(cuò)誤和無用的反工。
我們按照以下步驟來進(jìn)行 Code Review,來保證代碼質(zhì)量。
Merge Request
Code Review 的第一步是檢查 Merge Request 是否符合規(guī)范。提交者應(yīng)該保證 MR 的清晰:
- MR 標(biāo)題說明改動(dòng)的模塊和改動(dòng)內(nèi)容,如果是fix bug,標(biāo)明 issue 標(biāo)號(hào)鏈接
- 將改動(dòng)拆分成獨(dú)立的模塊進(jìn)行提交
- 在日志中說明:改動(dòng)的原因(指向需求文檔、設(shè)計(jì)稿的鏈接)、改動(dòng)的內(nèi)容、涉及到的模塊、可能的副作用
- 控制 MR 的代碼規(guī)模,避免出現(xiàn)海量改動(dòng)的 MR
- 不要將無用的編碼中間步驟提交,本地分支的 commit 可以使用
git rebase進(jìn)行合并,即:保證每個(gè) commit 都是可編譯通過、帶有完整功能的版本。
冒煙
冒煙檢測(cè)保證提交的 MR 是可編譯通過的,檢查:
- 可以正常 Debug,運(yùn)行 App
- 可以登陸、連接服務(wù)器、連接 socket,拉取數(shù)據(jù)。
- 核心功能運(yùn)行OK
功能實(shí)現(xiàn)
檢查是否按照需求實(shí)現(xiàn)了功能(或者 fix 了 bug)。不必進(jìn)行詳盡的覆蓋,作簡(jiǎn)單的檢查就可以了。
- UI是否還原了設(shè)計(jì)?
- 功能的主流程是否按預(yù)期跑通了?
- bug是否修復(fù)了?
- 是否影響了其他模塊?改動(dòng)涉及的模塊是否運(yùn)行OK?
性能和體驗(yàn)
對(duì)于新的功能模塊,在功能實(shí)現(xiàn)需求的前提下,還要保證性能和用戶體驗(yàn)
- 檢查設(shè)計(jì)稿沒有提及(或遺漏)的 UI 交互是否合理,是否需要和產(chǎn)品、設(shè)計(jì)進(jìn)行討論確認(rèn)
- 檢查頁面的UI是否流暢,是否有不合理的閃爍、跳動(dòng)、掉幀
- 檢查一些操作是否卡頓、等待時(shí)間是否過長
- 檢查模塊內(nèi)存占用是否過高,是否有內(nèi)存泄漏的問題(Instruments -> Allocations / Xcode -> DebugSession -> View Memory Graph Hierarchy)
- 檢查模塊是否占用大量計(jì)算資源,導(dǎo)致手機(jī)發(fā)燙
編碼風(fēng)格
檢查代碼保證代碼命名清晰、結(jié)構(gòu)合理、風(fēng)格統(tǒng)一。
好的代碼應(yīng)當(dāng)是可讀性很強(qiáng)的,在水平差不多的情況下,如果難以讀懂別人提交的代碼,一定是編碼結(jié)構(gòu)、風(fēng)格、命名等出了問題,這是在 Review 階段應(yīng)該提出改正的。
具體的編碼規(guī)范應(yīng)該參照 杏仁醫(yī)生 Objective-C 編碼規(guī)范。
分成以下幾個(gè)方面對(duì)編碼進(jìn)行檢查:
命名
- 檢查模塊、類、方法、變量命名是否合理清晰,是否有歧義
- 檢查是否正確使用了前/后綴,沒有命名沖突
組織
- 檢查是否有過長應(yīng)該拆分的方法(原則上一個(gè)方法不應(yīng)該超過一頁)
- 檢查是否有過長的源文件(原則上一個(gè)源文件不應(yīng)該超過1000行)
- 檢查代碼換行、注釋、分塊是否合理
- 檢查文件的組織是否合理,模塊內(nèi)文件拆分合理、存儲(chǔ)位置正確
注釋
- 檢查每個(gè)源文件是否正確添加了說明
- 對(duì)于容易引起歧義、不好理解、奇怪的代碼段,檢查是否添加了必要的注釋
- 檢查關(guān)鍵接口、參數(shù)是否添加了必要的注釋
接口
- 檢查接口是否清晰,表意清楚,沒有副作用
- 檢查接口設(shè)計(jì)是否合理,保證了模塊的獨(dú)立性和擴(kuò)展性
編碼
最后是檢查具體的編碼內(nèi)容,這一步不作具體的要求,屬于編碼經(jīng)驗(yàn)、數(shù)據(jù)結(jié)構(gòu)、模式設(shè)計(jì)等高級(jí)知識(shí)范疇,每個(gè)人有不同的理解。目的是提高代碼的質(zhì)量,共同進(jìn)步。
一些編碼檢查可以注意的點(diǎn):
- 是否重復(fù)造輪子了?
- 如果使用別人的輪子,這些三方庫、開源代碼、借鑒的實(shí)現(xiàn)方案等等是否好用合理?有沒有更好的方案?
- API 使用有沒有兼容性的問題?
- 數(shù)據(jù)結(jié)構(gòu)是否合理?復(fù)雜度是否OK?有沒有優(yōu)化的空間?
- 設(shè)計(jì)模式是否OK?擴(kuò)展性魯棒性怎么樣?