關鍵詞:遺留代碼,代碼修改,測試
概述
遺留代碼
從其他人或者其他版本獲得的代碼。
特點
架構設計差
代碼風格不一致
文檔少和模糊
非常有價值,成功代碼
修改遺留代碼原因
新功能
Bug
重構
優化
修改
Risky change 修改風險
- What changes do we have to make? 哪些是必須修改的內容
- How will we know that we’ve done them correctly? 修改正確嗎
- How will we know that we haven’t broken anything? 修改無副作用嗎
加快理解代碼實現
- Notes/Sketching 筆記和草圖
- Listing markup 搜索所有關鍵字
- Scratch refactoring 重構
- Delete unused code 刪除次要代碼
如何防止破壞代碼
- 隔離新代碼
- 新生方法 (sprout method)
- 包裹方法(wrap method)
Sensing & separatin 感知和隔離
修改耗時的原因:
- 理解設計和代碼
- 修改副作用檢查
- 編譯時間
- 無單元測試
- 測試反饋慢(feedback slow)
修改正確嗎
- Hyperaware editing 小心翼翼修改
- Single-goal editing 修改高度內聚,一次只改一個功能
- Preserve signatures 簽名修改
- Lean on the compiler 使用編譯器檢查修改
工具和流程
流程
- Mindset/Books 思想,書
- Code 一起編碼
- TDD/BDD 單元測試
- Code Coverage 代碼覆蓋率
- CI 代碼集成
- Static Analysis 代碼靜態分析
- Code Review 代碼評審
工具
Lexical analysis
命名, 代碼風格
Flow/path analysis
空指針,無用代碼
C++ - Covtool, gcov
C++ - CppUTest. so mycoworkers don't break my codes. 防止同事誤操作
Dependency analysis
架構
C++- (Sp)Lint
Verification
C++- Jenkins (Shell/Make)
單元測試,保持代碼整潔
• test individual units 測試粒度
• isolate each part 隔離每個單元
• show that the individual parts are correct 正確性驗證
• regression testing 迴歸測試
• sort of living documentation 動態文檔
• executed within a framework 自動化框架
It's an hard work but (usually) not impossible !
參考
Working.Effectively.with.Legacy.Code