課程簡介
本培訓(xùn)課由【60個技術(shù)+1套管理方法】組成
?分鐘級重構(gòu):必備日常局部重構(gòu)18技
?模塊重構(gòu):讓模塊維護不再痛苦24技
?架構(gòu)重構(gòu):多任務(wù)及通信優(yōu)化14技
?架構(gòu)重構(gòu):底層規(guī)范中層聰明12技
?架構(gòu)重構(gòu):4種需求變更的設(shè)計應(yīng)對
?成功架構(gòu)重構(gòu)的關(guān)鍵步驟與管理原則
目標(biāo)收益
培訓(xùn)對象
課程大綱
引論:讓重構(gòu)帶來實際價值 |
1.重構(gòu)理論基礎(chǔ): Refactoring的歷史 Refactoring的本質(zhì) 代碼重構(gòu):Code Refactoring 模塊重構(gòu):Big Refactoring 架構(gòu)重構(gòu):Architectural Refactoring 2.C程序重構(gòu)管窺: a)充分利用C語言:#define、#ifdef、static、union、…… 代碼重構(gòu)實例:用static與注釋將一個.c文件的常量、變量、函數(shù)完美層次化 b)解決痛點問題:全局變量太多、多任務(wù)執(zhí)行太亂 代碼重構(gòu)實例:按“采集-分析-執(zhí)行”組織battery.c/safe.c/led.c模塊間關(guān)系 3.本課內(nèi)容概覽: 60個技術(shù)+1套管理方法 |
分鐘級重構(gòu):必備日常局部重構(gòu)18技 |
4.從圈復(fù)雜度說起: 代碼難維護的原因 如何讓新手也能維護 C語言的9個執(zhí)行變向語句 5.C的日常局部重構(gòu): 技0--引入三元表達式 技0--引入else if結(jié)構(gòu) 技0--引入switch結(jié)構(gòu) 技1--特殊情況提前return 技2--提煉復(fù)合判斷函數(shù) 技3--提煉統(tǒng)一判斷函數(shù) 技4--提煉統(tǒng)一狀態(tài)轉(zhuǎn)換函數(shù) 技5--借助邏輯重組,消除很傻很正確的if泥團 技6--借助數(shù)據(jù)結(jié)構(gòu),消除很傻很正確的if泥團 技7--將if-else邏輯簡化為init-if邏輯 技8--封裝global count var計數(shù)和判斷,提供event接口 技9--封裝global flag var的清零和判斷,提供event接口 ……案例 ……練習(xí) 6.多函數(shù)的優(yōu)化:提煉函數(shù) 技10--提煉局部變量加工函數(shù) 技11--提煉共用help私有函數(shù) ……案例 ……練習(xí) 7.多函數(shù)的優(yōu)化:合并函數(shù) 技12--合并代碼重復(fù)的函數(shù),加參數(shù) 技13--合并骨架雷同的函數(shù),加參數(shù) 技14--合并#ifdef #else定義的多個函數(shù) 技15--數(shù)據(jù)不同算法相同,統(tǒng)一到宏或模板 技16--數(shù)據(jù)不同算法相同,統(tǒng)一到void*處理函數(shù) ……案例 ……練習(xí) 8.多函數(shù)的優(yōu)化:便捷接口函數(shù) 技17-- #define便捷接口函數(shù) 技18--二次封裝便捷接口函數(shù) ……案例 ……練習(xí) |
模塊重構(gòu):讓模塊維護不再痛苦24技 |
9.《人月神話》說:沒有銀彈? 信息隱藏 沒有信息隱藏,模塊化就沒有意義 10.信息隱藏! 技1--常量私有化 技2--變量static化 技3--函數(shù)static化 技4--.c文件的內(nèi)部結(jié)構(gòu)規(guī)范 技5--.c文件的文件命名規(guī)范 11.數(shù)據(jù)結(jié)構(gòu) 技6---引入結(jié)構(gòu)體,集中管理多個相關(guān)變量 技7---引入配置數(shù)組,集中管理配置型常量 技8---引入下標(biāo)常量,簡化配置數(shù)組的使用 技9---引入union結(jié)構(gòu),支持多數(shù)據(jù)類型 技10--引入cmdBlock,集中管理多cmd var 技11--引入dataBlock,集中管理多state var 技12--將過大的globalStruct泥球拆分成dataBlock、cmdBlock 技13--優(yōu)化數(shù)據(jù)結(jié)構(gòu)來簡化操作 ……案例 ……練習(xí) 12.接口暴露! 技14--接口函數(shù)moduleFunc()式命名 技15--任務(wù)函數(shù)的xxxx_xxxTask()式命名 技16--封裝global count var計數(shù)和判斷,提供event接口 技17--封裝global flag var的清零和判斷,提供event接口 技18--為event提供receive函數(shù)和peek函數(shù) 技19--#define便捷接口函數(shù) 技20--二次封裝便捷接口函數(shù) 技21--借便捷接口避免暴露bool型參數(shù) ……案例 ……練習(xí) 13.性能第一波 技22--去除float運算 技23--乘除運算變移位運算 技24--提供直接操作模塊內(nèi)部數(shù)據(jù)的指針 ……案例 ……練習(xí) |
架構(gòu)重構(gòu):閱讀代碼的大技巧 |
14.如何閱讀嵌軟代碼,才能快速理解架構(gòu)、畫出架構(gòu) ……練習(xí) 技1:while(1)+ISR結(jié)構(gòu)的快速架構(gòu)理解 ……練習(xí) 技2:OS下多任務(wù)結(jié)構(gòu)的快速架構(gòu)理解 ……練習(xí) 技3:協(xié)議報文解析—調(diào)度—處理的快速架構(gòu)理解 |
架構(gòu)重構(gòu):多任務(wù)及通信優(yōu)化14技 |
15.嵌軟獨有的復(fù)雜性 運行時的精細化控制 裸露的中斷、時鐘、時限、任務(wù)小而多 通盤分析多任務(wù)的必要性 建模練習(xí):任務(wù)分布圖、任務(wù)協(xié)作圖 16.任務(wù)模塊化 技1---按采集/分析/執(zhí)行分解任務(wù) 技2---[采集]--dataBlock-->[分析]--cmdBlock-->[執(zhí)行]模式 技3---顯式命名采集/分析/執(zhí)行任務(wù)函數(shù)(collect/analyse/action) ……案例 ……練習(xí) 17.中斷處理 ISR與外界通信 技4---ISR拋出信號量 技5---ISR寫全局變量 時鐘中斷 技6---ISR負責(zé)計數(shù)+生成事件 技7---將處理分離到時間片任務(wù) ……案例 ……練習(xí) 18.通信優(yōu)化 技8---隱藏任務(wù)+隊列,暴露同步接口函數(shù) 技9---將過大的globalStruct泥球拆分成dataBlock、cmdBlock 技10--顯式命名gxxDataBlock、gxxCmdBlock全局變量 ……案例 ……練習(xí) 19.性能第二波 硬實時 技11--由ISR處理緊急任務(wù) 控制執(zhí)行頻率 技12--變while(1)執(zhí)行為時間片執(zhí)行 處理OverLoad 技13--控制采樣率 技14--控制取樣率,拋棄部分采樣 ……案例 ……練習(xí) |
架構(gòu)重構(gòu):“底層規(guī)范、中層聰明”12技 |
20.嵌軟分層規(guī)律 Layer就是一組Code Module 橫向分層 縱深封裝 技1—各層模塊文件名命名規(guī)范 技2—提煉通用Svc模塊 ……案例 ……練習(xí) 21.Drv等底層模塊 技3—將硬件相關(guān)代碼分離到Drv模塊 ……案例 ……練習(xí) 22.HAL與Svc層抽象:縱深封裝 技4—Hal模塊封裝Drv模塊 技5—Svc模塊封裝Hal與Drv模塊 技6—借函數(shù)指針結(jié)構(gòu)體支持底層可替換 ……案例 ……練習(xí) 23.HAL與Svc層抽象:狀態(tài)機 技7—統(tǒng)一的FSMCore作為高層event生成器 技8—提煉統(tǒng)一狀態(tài)轉(zhuǎn)換函數(shù) 技9—引入狀態(tài)機配置數(shù)組 ……案例 ……練習(xí) 24.HAL與Svc層抽象:協(xié)議子系統(tǒng) 技10--將粗糙的uint8_t[]報文結(jié)構(gòu)升級成struct 技11--將報文codec代碼從Drv模塊中分離出來 (協(xié)議模塊硬件無關(guān)/功能無關(guān)) 技12--構(gòu)建管道-過濾器架構(gòu) 技13--Packet Adapter作為可插拔過濾器 ……案例 ……練習(xí) |
架構(gòu)重構(gòu):4種需求變更的設(shè)計應(yīng)對 |
需求變更 A類:不同廠商的器件 B類:不同類型的器件 C類:不同網(wǎng)絡(luò)或協(xié)議 D類:不同功能或算法 ……案例 A類應(yīng)對——drv.c 局部改變,接口不變 ?實例分析 B類應(yīng)對——drv.c 改變,hal 不變 ?實例分析 C類應(yīng)對——設(shè)計支持協(xié)議的新增與適配 ?實例分析 D類應(yīng)對——自底向上,逐級優(yōu)化設(shè)計 ?實例分析 |
成功架構(gòu)重構(gòu)的關(guān)鍵步驟與管理原則 |
本課程模塊大綱不公開 要不要文檔? 要不要預(yù)先設(shè)計? 代碼改改改過程中有沒有里程碑供風(fēng)險評估? 全面重構(gòu)從哪一層開始? …… |
引論:讓重構(gòu)帶來實際價值 1.重構(gòu)理論基礎(chǔ): Refactoring的歷史 Refactoring的本質(zhì) 代碼重構(gòu):Code Refactoring 模塊重構(gòu):Big Refactoring 架構(gòu)重構(gòu):Architectural Refactoring 2.C程序重構(gòu)管窺: a)充分利用C語言:#define、#ifdef、static、union、…… 代碼重構(gòu)實例:用static與注釋將一個.c文件的常量、變量、函數(shù)完美層次化 b)解決痛點問題:全局變量太多、多任務(wù)執(zhí)行太亂 代碼重構(gòu)實例:按“采集-分析-執(zhí)行”組織battery.c/safe.c/led.c模塊間關(guān)系 3.本課內(nèi)容概覽: 60個技術(shù)+1套管理方法 |
分鐘級重構(gòu):必備日常局部重構(gòu)18技 4.從圈復(fù)雜度說起: 代碼難維護的原因 如何讓新手也能維護 C語言的9個執(zhí)行變向語句 5.C的日常局部重構(gòu): 技0--引入三元表達式 技0--引入else if結(jié)構(gòu) 技0--引入switch結(jié)構(gòu) 技1--特殊情況提前return 技2--提煉復(fù)合判斷函數(shù) 技3--提煉統(tǒng)一判斷函數(shù) 技4--提煉統(tǒng)一狀態(tài)轉(zhuǎn)換函數(shù) 技5--借助邏輯重組,消除很傻很正確的if泥團 技6--借助數(shù)據(jù)結(jié)構(gòu),消除很傻很正確的if泥團 技7--將if-else邏輯簡化為init-if邏輯 技8--封裝global count var計數(shù)和判斷,提供event接口 技9--封裝global flag var的清零和判斷,提供event接口 ……案例 ……練習(xí) 6.多函數(shù)的優(yōu)化:提煉函數(shù) 技10--提煉局部變量加工函數(shù) 技11--提煉共用help私有函數(shù) ……案例 ……練習(xí) 7.多函數(shù)的優(yōu)化:合并函數(shù) 技12--合并代碼重復(fù)的函數(shù),加參數(shù) 技13--合并骨架雷同的函數(shù),加參數(shù) 技14--合并#ifdef #else定義的多個函數(shù) 技15--數(shù)據(jù)不同算法相同,統(tǒng)一到宏或模板 技16--數(shù)據(jù)不同算法相同,統(tǒng)一到void*處理函數(shù) ……案例 ……練習(xí) 8.多函數(shù)的優(yōu)化:便捷接口函數(shù) 技17-- #define便捷接口函數(shù) 技18--二次封裝便捷接口函數(shù) ……案例 ……練習(xí) |
模塊重構(gòu):讓模塊維護不再痛苦24技 9.《人月神話》說:沒有銀彈? 信息隱藏 沒有信息隱藏,模塊化就沒有意義 10.信息隱藏! 技1--常量私有化 技2--變量static化 技3--函數(shù)static化 技4--.c文件的內(nèi)部結(jié)構(gòu)規(guī)范 技5--.c文件的文件命名規(guī)范 11.數(shù)據(jù)結(jié)構(gòu) 技6---引入結(jié)構(gòu)體,集中管理多個相關(guān)變量 技7---引入配置數(shù)組,集中管理配置型常量 技8---引入下標(biāo)常量,簡化配置數(shù)組的使用 技9---引入union結(jié)構(gòu),支持多數(shù)據(jù)類型 技10--引入cmdBlock,集中管理多cmd var 技11--引入dataBlock,集中管理多state var 技12--將過大的globalStruct泥球拆分成dataBlock、cmdBlock 技13--優(yōu)化數(shù)據(jù)結(jié)構(gòu)來簡化操作 ……案例 ……練習(xí) 12.接口暴露! 技14--接口函數(shù)moduleFunc()式命名 技15--任務(wù)函數(shù)的xxxx_xxxTask()式命名 技16--封裝global count var計數(shù)和判斷,提供event接口 技17--封裝global flag var的清零和判斷,提供event接口 技18--為event提供receive函數(shù)和peek函數(shù) 技19--#define便捷接口函數(shù) 技20--二次封裝便捷接口函數(shù) 技21--借便捷接口避免暴露bool型參數(shù) ……案例 ……練習(xí) 13.性能第一波 技22--去除float運算 技23--乘除運算變移位運算 技24--提供直接操作模塊內(nèi)部數(shù)據(jù)的指針 ……案例 ……練習(xí) |
架構(gòu)重構(gòu):閱讀代碼的大技巧 14.如何閱讀嵌軟代碼,才能快速理解架構(gòu)、畫出架構(gòu) ……練習(xí) 技1:while(1)+ISR結(jié)構(gòu)的快速架構(gòu)理解 ……練習(xí) 技2:OS下多任務(wù)結(jié)構(gòu)的快速架構(gòu)理解 ……練習(xí) 技3:協(xié)議報文解析—調(diào)度—處理的快速架構(gòu)理解 |
架構(gòu)重構(gòu):多任務(wù)及通信優(yōu)化14技 15.嵌軟獨有的復(fù)雜性 運行時的精細化控制 裸露的中斷、時鐘、時限、任務(wù)小而多 通盤分析多任務(wù)的必要性 建模練習(xí):任務(wù)分布圖、任務(wù)協(xié)作圖 16.任務(wù)模塊化 技1---按采集/分析/執(zhí)行分解任務(wù) 技2---[采集]--dataBlock-->[分析]--cmdBlock-->[執(zhí)行]模式 技3---顯式命名采集/分析/執(zhí)行任務(wù)函數(shù)(collect/analyse/action) ……案例 ……練習(xí) 17.中斷處理 ISR與外界通信 技4---ISR拋出信號量 技5---ISR寫全局變量 時鐘中斷 技6---ISR負責(zé)計數(shù)+生成事件 技7---將處理分離到時間片任務(wù) ……案例 ……練習(xí) 18.通信優(yōu)化 技8---隱藏任務(wù)+隊列,暴露同步接口函數(shù) 技9---將過大的globalStruct泥球拆分成dataBlock、cmdBlock 技10--顯式命名gxxDataBlock、gxxCmdBlock全局變量 ……案例 ……練習(xí) 19.性能第二波 硬實時 技11--由ISR處理緊急任務(wù) 控制執(zhí)行頻率 技12--變while(1)執(zhí)行為時間片執(zhí)行 處理OverLoad 技13--控制采樣率 技14--控制取樣率,拋棄部分采樣 ……案例 ……練習(xí) |
架構(gòu)重構(gòu):“底層規(guī)范、中層聰明”12技 20.嵌軟分層規(guī)律 Layer就是一組Code Module 橫向分層 縱深封裝 技1—各層模塊文件名命名規(guī)范 技2—提煉通用Svc模塊 ……案例 ……練習(xí) 21.Drv等底層模塊 技3—將硬件相關(guān)代碼分離到Drv模塊 ……案例 ……練習(xí) 22.HAL與Svc層抽象:縱深封裝 技4—Hal模塊封裝Drv模塊 技5—Svc模塊封裝Hal與Drv模塊 技6—借函數(shù)指針結(jié)構(gòu)體支持底層可替換 ……案例 ……練習(xí) 23.HAL與Svc層抽象:狀態(tài)機 技7—統(tǒng)一的FSMCore作為高層event生成器 技8—提煉統(tǒng)一狀態(tài)轉(zhuǎn)換函數(shù) 技9—引入狀態(tài)機配置數(shù)組 ……案例 ……練習(xí) 24.HAL與Svc層抽象:協(xié)議子系統(tǒng) 技10--將粗糙的uint8_t[]報文結(jié)構(gòu)升級成struct 技11--將報文codec代碼從Drv模塊中分離出來 (協(xié)議模塊硬件無關(guān)/功能無關(guān)) 技12--構(gòu)建管道-過濾器架構(gòu) 技13--Packet Adapter作為可插拔過濾器 ……案例 ……練習(xí) |
架構(gòu)重構(gòu):4種需求變更的設(shè)計應(yīng)對 需求變更 A類:不同廠商的器件 B類:不同類型的器件 C類:不同網(wǎng)絡(luò)或協(xié)議 D類:不同功能或算法 ……案例 A類應(yīng)對——drv.c 局部改變,接口不變 ?實例分析 B類應(yīng)對——drv.c 改變,hal 不變 ?實例分析 C類應(yīng)對——設(shè)計支持協(xié)議的新增與適配 ?實例分析 D類應(yīng)對——自底向上,逐級優(yōu)化設(shè)計 ?實例分析 |
成功架構(gòu)重構(gòu)的關(guān)鍵步驟與管理原則 本課程模塊大綱不公開 要不要文檔? 要不要預(yù)先設(shè)計? 代碼改改改過程中有沒有里程碑供風(fēng)險評估? 全面重構(gòu)從哪一層開始? …… |