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