課程簡介
重構(gòu)是持續(xù)進(jìn)行的,而不是在項目結(jié)束時、發(fā)布版本時、迭代結(jié)束時,甚至不是每天快下班時才進(jìn)行的。重構(gòu)是我們每隔一個小時或者半個小時就要去做的事情。通過重構(gòu),我們可以持續(xù)地保持代碼盡可能干凈、簡單并且具有表達(dá)力。
目標(biāo)收益
隨著不同產(chǎn)品的推出,不同客戶、不同版本的發(fā)布,需要維護(hù)的遺留代碼越來越多,重構(gòu)也就在所難免。不僅如此,所有的軟件系統(tǒng),經(jīng)過一段時間的維護(hù),都會逐漸變成遺留系統(tǒng),并且都遭遇了緩慢而不可抗拒的腐化。因此,軟件開發(fā)人員不得不面對既有系統(tǒng)的混亂代碼。而本課程正是告訴你如何重構(gòu)既有的遺留系統(tǒng),如何重構(gòu)代碼、重構(gòu)設(shè)計、重構(gòu)架構(gòu)。
培訓(xùn)對象
各類軟件研發(fā)中心的軟件設(shè)計師、架構(gòu)師、項目經(jīng)理、技術(shù)總監(jiān)、質(zhì)量部門經(jīng)理。對于重構(gòu)技術(shù)懷有疑問和困惑,需要梳理解答的團(tuán)隊和個人,效果最佳。
課程大綱
第一部分 為什么軟件需要及時重構(gòu) 第一單元 剖析軟件質(zhì)量不斷下降的根源 |
質(zhì)量不斷下降的表現(xiàn): 1. 程序代碼越來越亂 2. 軟件維護(hù)成本越來越高 3. 軟件變更越來越困難 4. 無法進(jìn)行新技術(shù)的改造 以往采取的措施: 1. 頭痛醫(yī)頭,腳痛醫(yī)腳 2. 拋棄掉重新編寫 3. 因擔(dān)心未來變化而做的過度設(shè)計 帶來的問題 1. 團(tuán)隊成員越來越多但效率卻越來越低 2. 測試變得越來越困難而任務(wù)繁重 3. 軟件系統(tǒng)越來越笨重而不適應(yīng)未來變化 分析與反思 案例分析:一個遺留系統(tǒng)的演化過程 1. 起初的設(shè)計 2. 隨后的變更 3. 質(zhì)量不斷下降的過程 軟件質(zhì)量下降的根源: 1. 軟件總是因變更而變得越來越復(fù)雜 2. 軟件結(jié)構(gòu)已經(jīng)不再適應(yīng)復(fù)雜的軟件需求 3. 必須要調(diào)整軟件結(jié)構(gòu)以適應(yīng)新的軟件需求 軟件是因需求變更而質(zhì)量下降嗎? 案例分析:推演軟件變更的設(shè)計過程 應(yīng)對軟件變更的最佳方式:兩頂帽子 1. 重構(gòu)原有代碼以適應(yīng)新的需求 2. 實(shí)現(xiàn)新的需求 案例:演示兩頂帽子的設(shè)計過程 |
第二單元 高質(zhì)量的軟件設(shè)計過程 |
以往軟件設(shè)計的過程: 1. 演示以往軟件設(shè)計的過程 2. 剖析以往軟件設(shè)計的問題與風(fēng)險 小步快跑模式的開發(fā)過程: 1. 用最快的速度開發(fā)一個最核心的功能 2. 讓第一個版本運(yùn)行起來并可以驗證 3. 在第一個版本的基礎(chǔ)上不斷添加功能: a. 每次只添加一個很簡單、很單一的功能 b. 每次以兩頂帽子的方式添加新功能 c. 運(yùn)行、調(diào)試與驗證 d. 重復(fù)這個過程添加下一個功能 4. 復(fù)雜的系統(tǒng)就是由一次次正確開發(fā)的不斷積累而成 案例:演示小步快跑的開發(fā)過程 小步快跑解決的問題: 1. 復(fù)雜功能有效地解耦 2. 代碼編寫總是可測試與驗證 3. 簡化設(shè)計與思考的復(fù)雜度 4. 適時重構(gòu)以避免軟件退化 測試驅(qū)動設(shè)計 1. TDD vs. 后測試開發(fā) 2. 案例:演示測試驅(qū)動設(shè)計的過程 3. 測試驅(qū)動設(shè)計的優(yōu)勢 4. 實(shí)踐測試驅(qū)動設(shè)計的難題 討論:自動化測試腳本應(yīng)當(dāng)由誰來寫? 練習(xí):運(yùn)用小步快跑的方式設(shè)計一個軟件 |
第二部分 重構(gòu)的概念 第三單元 何為重構(gòu) |
軟件重構(gòu)的概念 1. 重構(gòu)是一系列代碼的等量變換 案例:一個Hello World重構(gòu)過程 2. 重構(gòu)的保險索:自動化測試 案例:Hello World的自動化測試過程 3. 軟件修改的四種動機(jī)——重構(gòu)的價值 4. 一個真實(shí)的謊言——重構(gòu)的誤區(qū) 5. 重構(gòu)的主要方法與技巧 案例分析:重構(gòu)一個大型遺留系統(tǒng) 1. 重構(gòu)第一步:分解大函數(shù) 超級大函數(shù)及其危害 案例:演示大函數(shù)產(chǎn)生的過程 案例:演示抽取方法操作步驟 實(shí)踐抽取方法會遇到的問題和解決方案 2. 重構(gòu)第二步:拆分大對象 超級大對象及其危害 案例:演示超級大對象的產(chǎn)生過程 案例:演示抽取類的操作步驟 講解單一職責(zé)設(shè)計原則 案例:演示“分久必合,合久必分”的重構(gòu)過程 3. 重構(gòu)第三步:提高復(fù)用率 講解順序編程及其危害 “不要重復(fù)代碼”原則 案例:提高代碼復(fù)用的6個方法 案例:演示新增代碼時的代碼復(fù)用過程 用靜態(tài)檢查工具檢查重復(fù)代碼 4. 重構(gòu)第四步:可擴(kuò)展設(shè)計 過度設(shè)計 vs. 恰如其分的設(shè)計 講解“開放-封閉”的設(shè)計原則 案例:講解可擴(kuò)展設(shè)計的4個方法 案例:講解新增代碼的可擴(kuò)展設(shè)計過程 5. 重構(gòu)第五步:降低耦合度 案例:講解接口、實(shí)現(xiàn)與工廠模式 案例:講解外部接口解耦與適配器模式 案例:講解繼承泛濫問題與橋接模式 案例:講解方法解耦與策略模式 案例:講解過程解耦與命令模式 案例:講解透明擴(kuò)展與組合模式、裝飾者模式 6. 重構(gòu)第六步:系統(tǒng)分層 反思軟件架構(gòu)需要怎樣的分層結(jié)構(gòu) 遺留系統(tǒng)如何擁抱需求變化 遺留系統(tǒng)如何應(yīng)對技術(shù)變革 7. 重構(gòu)第七步:領(lǐng)域驅(qū)動設(shè)計 領(lǐng)域驅(qū)動設(shè)計的概念 講解領(lǐng)域模型分析方法 講解原文分析法與領(lǐng)域驅(qū)動設(shè)計 討論:如何制定重構(gòu)項目計劃 練習(xí):重構(gòu)一個小程序并編寫測試腳本 |
第四單元 關(guān)于重構(gòu)的討論 |
什么時候重構(gòu) 1. 重構(gòu)是一種習(xí)慣 2. 重構(gòu)讓程序可讀 3. 重構(gòu),才好復(fù)用 4. 先重構(gòu),再擴(kuò)展 5. 緊急任務(wù)時的重構(gòu) 測試的困境 1. 重構(gòu)初期的困局 2. 解耦與自動化測試 3. 建立自動化測試體系 重構(gòu)的評價 1. 評價軟件質(zhì)量的指標(biāo) 2. 評價軟件質(zhì)量的工具 |
第一部分 為什么軟件需要及時重構(gòu) 第一單元 剖析軟件質(zhì)量不斷下降的根源 質(zhì)量不斷下降的表現(xiàn): 1. 程序代碼越來越亂 2. 軟件維護(hù)成本越來越高 3. 軟件變更越來越困難 4. 無法進(jìn)行新技術(shù)的改造 以往采取的措施: 1. 頭痛醫(yī)頭,腳痛醫(yī)腳 2. 拋棄掉重新編寫 3. 因擔(dān)心未來變化而做的過度設(shè)計 帶來的問題 1. 團(tuán)隊成員越來越多但效率卻越來越低 2. 測試變得越來越困難而任務(wù)繁重 3. 軟件系統(tǒng)越來越笨重而不適應(yīng)未來變化 分析與反思 案例分析:一個遺留系統(tǒng)的演化過程 1. 起初的設(shè)計 2. 隨后的變更 3. 質(zhì)量不斷下降的過程 軟件質(zhì)量下降的根源: 1. 軟件總是因變更而變得越來越復(fù)雜 2. 軟件結(jié)構(gòu)已經(jīng)不再適應(yīng)復(fù)雜的軟件需求 3. 必須要調(diào)整軟件結(jié)構(gòu)以適應(yīng)新的軟件需求 軟件是因需求變更而質(zhì)量下降嗎? 案例分析:推演軟件變更的設(shè)計過程 應(yīng)對軟件變更的最佳方式:兩頂帽子 1. 重構(gòu)原有代碼以適應(yīng)新的需求 2. 實(shí)現(xiàn)新的需求 案例:演示兩頂帽子的設(shè)計過程 |
第二單元 高質(zhì)量的軟件設(shè)計過程 以往軟件設(shè)計的過程: 1. 演示以往軟件設(shè)計的過程 2. 剖析以往軟件設(shè)計的問題與風(fēng)險 小步快跑模式的開發(fā)過程: 1. 用最快的速度開發(fā)一個最核心的功能 2. 讓第一個版本運(yùn)行起來并可以驗證 3. 在第一個版本的基礎(chǔ)上不斷添加功能: a. 每次只添加一個很簡單、很單一的功能 b. 每次以兩頂帽子的方式添加新功能 c. 運(yùn)行、調(diào)試與驗證 d. 重復(fù)這個過程添加下一個功能 4. 復(fù)雜的系統(tǒng)就是由一次次正確開發(fā)的不斷積累而成 案例:演示小步快跑的開發(fā)過程 小步快跑解決的問題: 1. 復(fù)雜功能有效地解耦 2. 代碼編寫總是可測試與驗證 3. 簡化設(shè)計與思考的復(fù)雜度 4. 適時重構(gòu)以避免軟件退化 測試驅(qū)動設(shè)計 1. TDD vs. 后測試開發(fā) 2. 案例:演示測試驅(qū)動設(shè)計的過程 3. 測試驅(qū)動設(shè)計的優(yōu)勢 4. 實(shí)踐測試驅(qū)動設(shè)計的難題 討論:自動化測試腳本應(yīng)當(dāng)由誰來寫? 練習(xí):運(yùn)用小步快跑的方式設(shè)計一個軟件 |
第二部分 重構(gòu)的概念 第三單元 何為重構(gòu) 軟件重構(gòu)的概念 1. 重構(gòu)是一系列代碼的等量變換 案例:一個Hello World重構(gòu)過程 2. 重構(gòu)的保險索:自動化測試 案例:Hello World的自動化測試過程 3. 軟件修改的四種動機(jī)——重構(gòu)的價值 4. 一個真實(shí)的謊言——重構(gòu)的誤區(qū) 5. 重構(gòu)的主要方法與技巧 案例分析:重構(gòu)一個大型遺留系統(tǒng) 1. 重構(gòu)第一步:分解大函數(shù) 超級大函數(shù)及其危害 案例:演示大函數(shù)產(chǎn)生的過程 案例:演示抽取方法操作步驟 實(shí)踐抽取方法會遇到的問題和解決方案 2. 重構(gòu)第二步:拆分大對象 超級大對象及其危害 案例:演示超級大對象的產(chǎn)生過程 案例:演示抽取類的操作步驟 講解單一職責(zé)設(shè)計原則 案例:演示“分久必合,合久必分”的重構(gòu)過程 3. 重構(gòu)第三步:提高復(fù)用率 講解順序編程及其危害 “不要重復(fù)代碼”原則 案例:提高代碼復(fù)用的6個方法 案例:演示新增代碼時的代碼復(fù)用過程 用靜態(tài)檢查工具檢查重復(fù)代碼 4. 重構(gòu)第四步:可擴(kuò)展設(shè)計 過度設(shè)計 vs. 恰如其分的設(shè)計 講解“開放-封閉”的設(shè)計原則 案例:講解可擴(kuò)展設(shè)計的4個方法 案例:講解新增代碼的可擴(kuò)展設(shè)計過程 5. 重構(gòu)第五步:降低耦合度 案例:講解接口、實(shí)現(xiàn)與工廠模式 案例:講解外部接口解耦與適配器模式 案例:講解繼承泛濫問題與橋接模式 案例:講解方法解耦與策略模式 案例:講解過程解耦與命令模式 案例:講解透明擴(kuò)展與組合模式、裝飾者模式 6. 重構(gòu)第六步:系統(tǒng)分層 反思軟件架構(gòu)需要怎樣的分層結(jié)構(gòu) 遺留系統(tǒng)如何擁抱需求變化 遺留系統(tǒng)如何應(yīng)對技術(shù)變革 7. 重構(gòu)第七步:領(lǐng)域驅(qū)動設(shè)計 領(lǐng)域驅(qū)動設(shè)計的概念 講解領(lǐng)域模型分析方法 講解原文分析法與領(lǐng)域驅(qū)動設(shè)計 討論:如何制定重構(gòu)項目計劃 練習(xí):重構(gòu)一個小程序并編寫測試腳本 |
第四單元 關(guān)于重構(gòu)的討論 什么時候重構(gòu) 1. 重構(gòu)是一種習(xí)慣 2. 重構(gòu)讓程序可讀 3. 重構(gòu),才好復(fù)用 4. 先重構(gòu),再擴(kuò)展 5. 緊急任務(wù)時的重構(gòu) 測試的困境 1. 重構(gòu)初期的困局 2. 解耦與自動化測試 3. 建立自動化測試體系 重構(gòu)的評價 1. 評價軟件質(zhì)量的指標(biāo) 2. 評價軟件質(zhì)量的工具 |