課程簡介
軟件開發(fā)往往大部分時候面對的是既有系統(tǒng)的二次開發(fā),維護(hù)遺留系統(tǒng)。隨著系統(tǒng)的不斷升級,需要維護(hù)的遺留系統(tǒng)的代碼也越來越多。在這個過程中,二次開發(fā)的工程師,往往會非常痛苦,會遇到添加新功能困難、修改bug困難,甚至不的不面對推翻之前的遺留系統(tǒng),重新來過。導(dǎo)致開發(fā)效率極其低下,并且成本很高,系統(tǒng)很不穩(wěn)定。所以重構(gòu)也就在所難免。所有的軟件系統(tǒng)將來都會變成遺留系統(tǒng),并且都可能會遭遇性能越來越低下、穩(wěn)定行越來越差等情況,因此軟件開發(fā)人員不得不面對既有系統(tǒng)的各種問題,本課程正是告訴你如何重構(gòu)既有的遺留系統(tǒng), 如何重構(gòu)代碼,重構(gòu)設(shè)計,重構(gòu)架構(gòu)。
培訓(xùn)客戶:
包括:阿里(杭州總部)2次、京東(北京總部)2次、平安銀行(2次)、中金在線、洛基亞(4次)、IBM、HP公司、杭州恒生電子、用友軟件、中國電信、中石油、西南電信、中國移動、上海盛大網(wǎng)絡(luò)、廈門航空、通化鋼鐵集團(tuán)、總參等近百家企事業(yè)單位。
目標(biāo)收益
培訓(xùn)對象
各類軟件研發(fā)中心的軟件設(shè)計師、架構(gòu)師, 項目經(jīng)理,技術(shù)總監(jiān),質(zhì)量部門經(jīng)理,開發(fā)人員,對重構(gòu)技術(shù)懷有疑問和困惑,需要梳理解答的團(tuán)隊和個人,效果最佳。
課程大綱
第一單元 認(rèn)識優(yōu)秀的系統(tǒng)及劣質(zhì)系統(tǒng),建立重構(gòu)意識 |
內(nèi)容一:建立構(gòu)建優(yōu)秀系統(tǒng)的思維 1.優(yōu)秀的系統(tǒng)有什么特征 2.劣質(zhì)代碼有什么特征 3.劣質(zhì)代碼的代價 4.為什么很多程序員都討厭閱讀別人的代碼? 5.如何閱讀別人的系統(tǒng)? 6.如何寫出簡練,易于理解,模塊化,層次性,設(shè)計良好,高效,優(yōu)雅,并且清晰的系統(tǒng)。 內(nèi)容二:軟件系統(tǒng)開始壞死的癥狀 1.硬化Rigidity——系統(tǒng)變得越來越難以變更,修復(fù)或增添新功能的代價高昂; 2.脆弱Fragility——對系統(tǒng)的任何哪怕是微小的變更都可能造成四處(甚至是與變更處沒有邏輯上的關(guān)聯(lián)之處的崩潰; 3.綁死Immobility——抽取系統(tǒng)的任何部分用來復(fù)用都非常困難; 4.膠著Viscosity——以與原有設(shè)計保持一致的方式來對實施變更已經(jīng)非常困難,誘使開發(fā)人員繞過它選擇容易但有害的途徑,其結(jié)果卻使系統(tǒng)死的更快。 5.案例:閱讀一段爛代碼,分析其對系統(tǒng)的危害。 內(nèi)容三:建立重構(gòu)的思想 1.重構(gòu)與添加新功能的關(guān)系。 2.不要在同一個地方跌倒兩次(何時重構(gòu)? 增加新功能時;修補(bǔ)錯誤時;Review碼時一并重構(gòu)) 3.重構(gòu)與重寫的取舍(系統(tǒng)實在混亂怎么辦?) 4.如何保證重構(gòu)的正確。 5.代碼、類、組件、子系統(tǒng)、系統(tǒng)、大型分布式系統(tǒng)的重構(gòu)聯(lián)系及區(qū)別 6.重構(gòu)與設(shè)計的關(guān)系 7.通過案例,演示某系統(tǒng)片段,展示重構(gòu)的基本思想(一個好的結(jié)構(gòu)是如何做到系統(tǒng)論的可擴(kuò)展性;以及如何將混亂的代碼重構(gòu)到一個好的結(jié)構(gòu)) 內(nèi)容四:案例—通過實際項目演示重構(gòu) 1.介紹項目需求情況,進(jìn)行設(shè)計 2.閱讀代碼指出代碼壞癥狀 3.通過重構(gòu)逐步改善代碼質(zhì)量 |
第二單元 代碼的壞味道的指標(biāo)及特點,以及應(yīng)對的重構(gòu)之道 |
內(nèi)容一:重構(gòu)關(guān)鍵—發(fā)現(xiàn)代碼的壞味道 1.模塊的高扇入與低扇出 2.圈復(fù)雜度在項目中的實用價值 3.語句的平均長度——論述其深層含義(函數(shù)不需要故意寫得短小,清晰的代碼自然短小;當(dāng)長則長與當(dāng)短則短) 4.函數(shù)參數(shù)個數(shù)的辯證 5.標(biāo)識參數(shù)----丑陋不堪、駭人聽聞的做法? 6.Ward Cunningham原則——深合己意的例程 7.“每個函數(shù)只做一件事”與“每個函數(shù)一個抽象層級”(程序員往往很難學(xué)會遵循這條規(guī)則,寫出只停留于一個抽象層級上的函數(shù)) 8.Switch-case語句——程序設(shè)計的萬惡之源? 9.“指令與查詢分離”的意義。 10.Try/Catch代碼塊 11.重復(fù)的代碼/模塊 12.可以根據(jù)客戶現(xiàn)在的項目作為案例進(jìn)行現(xiàn)場分析,找出相應(yīng)的代碼壞味道 內(nèi)容二:某項目分析----重點了解現(xiàn)實項目代碼的充斥大量壞味道 1.介紹項目需求情況,閱讀現(xiàn)有代碼指出代碼壞癥狀 2.不看不知道,代碼到底有多爛—觸目驚心的代碼 3.通過重構(gòu)逐步改善代碼質(zhì)量 4.本案例學(xué)習(xí)多種重構(gòu)方式 |
第三單元 重構(gòu)實踐 |
內(nèi)容一:重構(gòu)初步:識別編碼中的壞味道 1.重復(fù)的代碼 2.過大的類及過長的函數(shù) 3.耦合:依戀情結(jié)、數(shù)據(jù)泥團(tuán)及過度耦合的消息鏈 4.分散的邏輯:發(fā)散的變化及霰彈式的修改 5.復(fù)雜的邏輯:switch現(xiàn)象及平行繼承體系 6.其它:中間人、數(shù)據(jù)類、不佳的繼承 內(nèi)容二:重構(gòu)實踐:面向?qū)ο蠹邦I(lǐng)域驅(qū)動 1.將過程化設(shè)計轉(zhuǎn)化為對象設(shè)計,并討論過程化設(shè)計與對象化設(shè)計的特點及歷史博弈;并給出過程式設(shè)計及及對象設(shè)計的模式——合適的就是好的! 2.封裝值域/自封裝值域的重構(gòu) 3.以數(shù)據(jù)類取代記錄的策略 4.以對象取代數(shù)組的策略 5.以類取代型別碼——Replace Type Code with Class 6.以子類取代型別碼——Replace Type Code with Subclasses 7.以值域取代子類——Replace Subclass with Fields 8.建模為屬性與建模為對象——系統(tǒng)建模中的微妙變化 9.Data Class——純粹的數(shù)據(jù)類 10.以State/Strategy取代型別碼 11.通過案例介紹函數(shù)的重構(gòu) 內(nèi)容三:重構(gòu)實踐—復(fù)雜條件表達(dá)式重構(gòu) 1.常見問題,如何處理讓人瘋狂的復(fù)雜分類? 2.以多態(tài)取代條件式——Replace Conditional with Polymorphism 3.提煉繼承體系——Extract Hierarchy 4.塑造模板函數(shù)——Form Template Method 5.以委托取代繼承——Replace Inheritance with Delegation 6.以繼承取代委托——Replace Delegation with Inheritance 7.用Strategy替換條件邏輯 8.用Bridge組合動態(tài)變化 9.用State替換狀態(tài)改變條件語句 10.用Composite替換隱含樹 11.用Command替換條件調(diào)度程序 12.在多態(tài)體系中,如何處理子條件不一致的情況——繼承體系中的高級技巧。 內(nèi)容四:重構(gòu)實踐—去除“大泥球”式的設(shè)計 1.過大的函數(shù)、模塊、子系統(tǒng) 2.依戀情結(jié)、數(shù)據(jù)泥團(tuán) 3.從系統(tǒng)設(shè)計的角度分析混亂產(chǎn)生的原因 4.通過案例介紹如何分解系統(tǒng) 內(nèi)容五:重構(gòu)實踐—職責(zé)單一 1.一個模塊完成一個職責(zé)——子模塊位于同一個抽象層次 2.功能函數(shù)與邏輯函數(shù)的分離 3.Divergent Change——發(fā)散的變化 1.Shotgun Surgery——散彈槍式的修改 |
第四單元 重構(gòu)不是萬能的——系統(tǒng)的重構(gòu)及預(yù)先設(shè)計的技巧 |
內(nèi)容一:重構(gòu)的優(yōu)勢與局限 1.重構(gòu)的優(yōu)勢與局限 2.預(yù)先設(shè)計與重構(gòu) 3.代碼重構(gòu)與系統(tǒng)重構(gòu)的異同 4.逐漸演化的系統(tǒng)及其特點 5.對大型遺留的系統(tǒng)的處理 6.分析某大型系統(tǒng),如何設(shè)計重構(gòu)及逐演化,以及我們在實際項目中何去何從。 內(nèi)容二:什么是好的設(shè)計以及如何預(yù)先設(shè)計實現(xiàn) 1.什么是好的設(shè)計和衡量的手段 2.可伸縮性(Scalable)軟件能夠在用戶的使用率、用戶的數(shù)目增加很快的情況下,保持合理的性能。 3.可擴(kuò)展性(Extensibility)一個軟件系統(tǒng)應(yīng)當(dāng)允許導(dǎo)入新技術(shù)/功能而不引起原有系統(tǒng)大的變化。 結(jié)合案例,通過那些手段如何實現(xiàn)該目標(biāo) 4.靈活性(Flexibility)修改或改進(jìn)一個已投入運行的軟件所需工作量的大小。 結(jié)合案例,通過那些手段如何實現(xiàn)該目標(biāo) 5.可維護(hù)性(maintainability):為滿足用戶新的要求,或當(dāng)環(huán)境發(fā)生了變化或運行中發(fā)現(xiàn)了新的錯誤時,對一個已投入運行的軟件進(jìn)行相應(yīng)診斷和修改所需工作量的大小。 6.可復(fù)用性(Reusability)一個軟件或其部件能再次用于其他應(yīng)用的程度。 7.軟件的變化分析---發(fā)現(xiàn)變化/封裝變化/隔離變化 8.分析真實項目,如何預(yù)先設(shè)計,給我們哪些啟示,我們可以學(xué)習(xí)到什么 內(nèi)容三:系統(tǒng)設(shè)計中的關(guān)鍵因素 1.抽象(Abstraction)、封裝(Encapsulation)和信息隱藏(Information Hiding) 2.分而治之(Divide-And-Conquer)和模塊化(modularization) 3.策略和實現(xiàn)的分離(Separation of Policy and Implementation) 4.接口和實現(xiàn)的分離(Separation of Interface and Implementation) 5.單一引用點(Single Point of Reference) 內(nèi)容四:案例—某項目設(shè)計重構(gòu)案例分析 1.案例情況 2.演示如何發(fā)現(xiàn)設(shè)計壞味道,以及如何重構(gòu) |
第五單元 模式與重構(gòu)實踐 |
內(nèi)容一:模式在重構(gòu)中的重要地位 1.重構(gòu)時,如何做到有章可循 2.設(shè)計模式概述 3.設(shè)計模式的學(xué)習(xí)階段及特點 4.設(shè)計模式的本質(zhì)論! 5.設(shè)計模式如何適應(yīng)變化和封裝 6.重構(gòu)到模式的思路 內(nèi)容二:實踐---系統(tǒng)中復(fù)雜條件/行為及其動態(tài)變化的應(yīng)對之策 1.分析案例,深入討論下列模式的精髓,及其在重構(gòu)中的實際運用 2.用Strategy替換條件邏輯 3.用Bridge組合動態(tài)變化 4.用State替換狀態(tài)改變條件語句 5.用Composite替換隱含樹 6.用Command替換條件調(diào)度程序 7.重點學(xué)習(xí)案例的重構(gòu)到模式的過程 內(nèi)容三:實踐---如何設(shè)計統(tǒng)一且抽象的抽象的系統(tǒng) 1.分析案例,深入討論下列模式的精髓,及其在重構(gòu)中的實際運用 2.形成Template Method 3.提取Composite 4.用Composite替換一/多之分 5.用Observer替換硬編碼的通知 6.通過Adapter統(tǒng)一接口 7.重點學(xué)習(xí)案例的重構(gòu)到模式的過程 內(nèi)容四:實踐---如何設(shè)計穩(wěn)定的系統(tǒng)——保護(hù)系統(tǒng)的核心不 受變化的影響 1.分析案例,深入討論下列模式的精髓,及其在重構(gòu)中的實際運用 2.用類替換類型代碼 3.將裝飾功能搬移到Decorator 4.用Visitor限制新增功能對流程的影響 5.用Singleton限制實例化 6.引入Null Object 7.轉(zhuǎn)移聚集操作到Collecting Parameter 8.重點學(xué)習(xí)案例的重構(gòu)到模式的過程 內(nèi)容五:實踐------案例練習(xí),模式的綜合運用及分析討論 1.分析案例,深入討論下列模式的精髓,及其在重構(gòu)中的實際運用 2.案例分析,背景介紹 3.找出系統(tǒng)改設(shè)計的關(guān)鍵點 4.用Strategy設(shè)定系統(tǒng)的穩(wěn)定點 5.業(yè)務(wù)邏輯層對功能的引用要點 6.以Abstract Factory模式進(jìn)行初始組裝——兼討論分層的要點 7.以Bridge模式應(yīng)對其他因素的變化 8.以producer - consumer design pattern處理海量數(shù)據(jù)及長任務(wù) 9.重點學(xué)習(xí)案例的重構(gòu)到模式的過程 |
第六單元 系統(tǒng)與大型系統(tǒng)的演化及重構(gòu)實踐 |
內(nèi)容一: 架構(gòu)重構(gòu) 1.軟件架構(gòu)概述 2.遺留系統(tǒng)的軟件架構(gòu)恢復(fù) 3.軟件架構(gòu)的重構(gòu)時機(jī) 4.軟件架構(gòu)的重構(gòu)步驟 5.架構(gòu)壞味道 6.架構(gòu)重構(gòu)策略 內(nèi)容二:大型系統(tǒng)的演化及核心技術(shù) 7.應(yīng)用服務(wù)和數(shù)據(jù)服務(wù)分離 8.使用緩存改善數(shù)據(jù)庫瓶頸 9.使用應(yīng)用服務(wù)器集群和負(fù)載均衡避免運用服務(wù)器瓶頸 10.數(shù)據(jù)庫讀寫分離 11.用CDN及分布式文件系統(tǒng)加速系統(tǒng)響應(yīng) 12.分布式數(shù)據(jù)庫系統(tǒng)及NoSQL運用 13.進(jìn)行橫向的業(yè)務(wù)拆分 14.分布式服務(wù),打造自己的軟件生態(tài)環(huán)境 內(nèi)容三:案例分析—某互聯(lián)網(wǎng)項目1架構(gòu)重構(gòu)及演化 1.項目背景以及相關(guān)需求 2.初始上線:當(dāng)前的最佳策略 3.物理部署分離 4.數(shù)據(jù)庫瓶頸的解決1:引入讀寫分離 5.系統(tǒng)開發(fā)框架的更迭 6.系統(tǒng)演化中的走過的彎路1:縱向加強(qiáng)的不歸路 7.數(shù)據(jù)庫瓶頸的解決2:引入搜索引擎 8.引入分布式文件系統(tǒng) 9.引入分布式緩存 10.引入分布式服務(wù)框架,服務(wù)拆分 11.引入分布式消息中間件 12.引入分布式Session框架 內(nèi)容四:案例分析—某互聯(lián)網(wǎng)項目2平臺架構(gòu)重構(gòu) 1.項目背景以及相關(guān)需求 2.從單機(jī)版、簡單網(wǎng)絡(luò)版、分布式網(wǎng)絡(luò)版、重構(gòu)后的大型分布式網(wǎng)絡(luò)版的歷程 3.架構(gòu)設(shè)計及重構(gòu)中的多因素綜合考慮及其影響 4.原有系統(tǒng)的不足分析 5.分布式系統(tǒng)中多中心與單中心的演變過程及博弈分析 6.引入CDN分布式文件服務(wù)系統(tǒng) 7.從數(shù)據(jù)庫中dump,獨立部署圖像服務(wù)器 8.引入Memcache緩存,緩解數(shù)據(jù)庫服務(wù)器 9.引入云服務(wù)與云存儲,及其博弈 10.引入基于lucene的全文檢索,緩解數(shù)據(jù)庫服務(wù)器 11.系統(tǒng)抽象與服務(wù)抽取 12.服務(wù)隔離及負(fù)載均衡:nginx及l(fā)vs運用 13.基礎(chǔ)服務(wù)與運用服務(wù)的抽取與分離 |
第一單元 認(rèn)識優(yōu)秀的系統(tǒng)及劣質(zhì)系統(tǒng),建立重構(gòu)意識 內(nèi)容一:建立構(gòu)建優(yōu)秀系統(tǒng)的思維 1.優(yōu)秀的系統(tǒng)有什么特征 2.劣質(zhì)代碼有什么特征 3.劣質(zhì)代碼的代價 4.為什么很多程序員都討厭閱讀別人的代碼? 5.如何閱讀別人的系統(tǒng)? 6.如何寫出簡練,易于理解,模塊化,層次性,設(shè)計良好,高效,優(yōu)雅,并且清晰的系統(tǒng)。 內(nèi)容二:軟件系統(tǒng)開始壞死的癥狀 1.硬化Rigidity——系統(tǒng)變得越來越難以變更,修復(fù)或增添新功能的代價高昂; 2.脆弱Fragility——對系統(tǒng)的任何哪怕是微小的變更都可能造成四處(甚至是與變更處沒有邏輯上的關(guān)聯(lián)之處的崩潰; 3.綁死Immobility——抽取系統(tǒng)的任何部分用來復(fù)用都非常困難; 4.膠著Viscosity——以與原有設(shè)計保持一致的方式來對實施變更已經(jīng)非常困難,誘使開發(fā)人員繞過它選擇容易但有害的途徑,其結(jié)果卻使系統(tǒng)死的更快。 5.案例:閱讀一段爛代碼,分析其對系統(tǒng)的危害。 內(nèi)容三:建立重構(gòu)的思想 1.重構(gòu)與添加新功能的關(guān)系。 2.不要在同一個地方跌倒兩次(何時重構(gòu)? 增加新功能時;修補(bǔ)錯誤時;Review碼時一并重構(gòu)) 3.重構(gòu)與重寫的取舍(系統(tǒng)實在混亂怎么辦?) 4.如何保證重構(gòu)的正確。 5.代碼、類、組件、子系統(tǒng)、系統(tǒng)、大型分布式系統(tǒng)的重構(gòu)聯(lián)系及區(qū)別 6.重構(gòu)與設(shè)計的關(guān)系 7.通過案例,演示某系統(tǒng)片段,展示重構(gòu)的基本思想(一個好的結(jié)構(gòu)是如何做到系統(tǒng)論的可擴(kuò)展性;以及如何將混亂的代碼重構(gòu)到一個好的結(jié)構(gòu)) 內(nèi)容四:案例—通過實際項目演示重構(gòu) 1.介紹項目需求情況,進(jìn)行設(shè)計 2.閱讀代碼指出代碼壞癥狀 3.通過重構(gòu)逐步改善代碼質(zhì)量 |
第二單元 代碼的壞味道的指標(biāo)及特點,以及應(yīng)對的重構(gòu)之道 內(nèi)容一:重構(gòu)關(guān)鍵—發(fā)現(xiàn)代碼的壞味道 1.模塊的高扇入與低扇出 2.圈復(fù)雜度在項目中的實用價值 3.語句的平均長度——論述其深層含義(函數(shù)不需要故意寫得短小,清晰的代碼自然短??;當(dāng)長則長與當(dāng)短則短) 4.函數(shù)參數(shù)個數(shù)的辯證 5.標(biāo)識參數(shù)----丑陋不堪、駭人聽聞的做法? 6.Ward Cunningham原則——深合己意的例程 7.“每個函數(shù)只做一件事”與“每個函數(shù)一個抽象層級”(程序員往往很難學(xué)會遵循這條規(guī)則,寫出只停留于一個抽象層級上的函數(shù)) 8.Switch-case語句——程序設(shè)計的萬惡之源? 9.“指令與查詢分離”的意義。 10.Try/Catch代碼塊 11.重復(fù)的代碼/模塊 12.可以根據(jù)客戶現(xiàn)在的項目作為案例進(jìn)行現(xiàn)場分析,找出相應(yīng)的代碼壞味道 內(nèi)容二:某項目分析----重點了解現(xiàn)實項目代碼的充斥大量壞味道 1.介紹項目需求情況,閱讀現(xiàn)有代碼指出代碼壞癥狀 2.不看不知道,代碼到底有多爛—觸目驚心的代碼 3.通過重構(gòu)逐步改善代碼質(zhì)量 4.本案例學(xué)習(xí)多種重構(gòu)方式 |
第三單元 重構(gòu)實踐 內(nèi)容一:重構(gòu)初步:識別編碼中的壞味道 1.重復(fù)的代碼 2.過大的類及過長的函數(shù) 3.耦合:依戀情結(jié)、數(shù)據(jù)泥團(tuán)及過度耦合的消息鏈 4.分散的邏輯:發(fā)散的變化及霰彈式的修改 5.復(fù)雜的邏輯:switch現(xiàn)象及平行繼承體系 6.其它:中間人、數(shù)據(jù)類、不佳的繼承 內(nèi)容二:重構(gòu)實踐:面向?qū)ο蠹邦I(lǐng)域驅(qū)動 1.將過程化設(shè)計轉(zhuǎn)化為對象設(shè)計,并討論過程化設(shè)計與對象化設(shè)計的特點及歷史博弈;并給出過程式設(shè)計及及對象設(shè)計的模式——合適的就是好的! 2.封裝值域/自封裝值域的重構(gòu) 3.以數(shù)據(jù)類取代記錄的策略 4.以對象取代數(shù)組的策略 5.以類取代型別碼——Replace Type Code with Class 6.以子類取代型別碼——Replace Type Code with Subclasses 7.以值域取代子類——Replace Subclass with Fields 8.建模為屬性與建模為對象——系統(tǒng)建模中的微妙變化 9.Data Class——純粹的數(shù)據(jù)類 10.以State/Strategy取代型別碼 11.通過案例介紹函數(shù)的重構(gòu) 內(nèi)容三:重構(gòu)實踐—復(fù)雜條件表達(dá)式重構(gòu) 1.常見問題,如何處理讓人瘋狂的復(fù)雜分類? 2.以多態(tài)取代條件式——Replace Conditional with Polymorphism 3.提煉繼承體系——Extract Hierarchy 4.塑造模板函數(shù)——Form Template Method 5.以委托取代繼承——Replace Inheritance with Delegation 6.以繼承取代委托——Replace Delegation with Inheritance 7.用Strategy替換條件邏輯 8.用Bridge組合動態(tài)變化 9.用State替換狀態(tài)改變條件語句 10.用Composite替換隱含樹 11.用Command替換條件調(diào)度程序 12.在多態(tài)體系中,如何處理子條件不一致的情況——繼承體系中的高級技巧。 內(nèi)容四:重構(gòu)實踐—去除“大泥球”式的設(shè)計 1.過大的函數(shù)、模塊、子系統(tǒng) 2.依戀情結(jié)、數(shù)據(jù)泥團(tuán) 3.從系統(tǒng)設(shè)計的角度分析混亂產(chǎn)生的原因 4.通過案例介紹如何分解系統(tǒng) 內(nèi)容五:重構(gòu)實踐—職責(zé)單一 1.一個模塊完成一個職責(zé)——子模塊位于同一個抽象層次 2.功能函數(shù)與邏輯函數(shù)的分離 3.Divergent Change——發(fā)散的變化 1.Shotgun Surgery——散彈槍式的修改 |
第四單元 重構(gòu)不是萬能的——系統(tǒng)的重構(gòu)及預(yù)先設(shè)計的技巧 內(nèi)容一:重構(gòu)的優(yōu)勢與局限 1.重構(gòu)的優(yōu)勢與局限 2.預(yù)先設(shè)計與重構(gòu) 3.代碼重構(gòu)與系統(tǒng)重構(gòu)的異同 4.逐漸演化的系統(tǒng)及其特點 5.對大型遺留的系統(tǒng)的處理 6.分析某大型系統(tǒng),如何設(shè)計重構(gòu)及逐演化,以及我們在實際項目中何去何從。 內(nèi)容二:什么是好的設(shè)計以及如何預(yù)先設(shè)計實現(xiàn) 1.什么是好的設(shè)計和衡量的手段 2.可伸縮性(Scalable)軟件能夠在用戶的使用率、用戶的數(shù)目增加很快的情況下,保持合理的性能。 3.可擴(kuò)展性(Extensibility)一個軟件系統(tǒng)應(yīng)當(dāng)允許導(dǎo)入新技術(shù)/功能而不引起原有系統(tǒng)大的變化。 結(jié)合案例,通過那些手段如何實現(xiàn)該目標(biāo) 4.靈活性(Flexibility)修改或改進(jìn)一個已投入運行的軟件所需工作量的大小。 結(jié)合案例,通過那些手段如何實現(xiàn)該目標(biāo) 5.可維護(hù)性(maintainability):為滿足用戶新的要求,或當(dāng)環(huán)境發(fā)生了變化或運行中發(fā)現(xiàn)了新的錯誤時,對一個已投入運行的軟件進(jìn)行相應(yīng)診斷和修改所需工作量的大小。 6.可復(fù)用性(Reusability)一個軟件或其部件能再次用于其他應(yīng)用的程度。 7.軟件的變化分析---發(fā)現(xiàn)變化/封裝變化/隔離變化 8.分析真實項目,如何預(yù)先設(shè)計,給我們哪些啟示,我們可以學(xué)習(xí)到什么 內(nèi)容三:系統(tǒng)設(shè)計中的關(guān)鍵因素 1.抽象(Abstraction)、封裝(Encapsulation)和信息隱藏(Information Hiding) 2.分而治之(Divide-And-Conquer)和模塊化(modularization) 3.策略和實現(xiàn)的分離(Separation of Policy and Implementation) 4.接口和實現(xiàn)的分離(Separation of Interface and Implementation) 5.單一引用點(Single Point of Reference) 內(nèi)容四:案例—某項目設(shè)計重構(gòu)案例分析 1.案例情況 2.演示如何發(fā)現(xiàn)設(shè)計壞味道,以及如何重構(gòu) |
第五單元 模式與重構(gòu)實踐 內(nèi)容一:模式在重構(gòu)中的重要地位 1.重構(gòu)時,如何做到有章可循 2.設(shè)計模式概述 3.設(shè)計模式的學(xué)習(xí)階段及特點 4.設(shè)計模式的本質(zhì)論! 5.設(shè)計模式如何適應(yīng)變化和封裝 6.重構(gòu)到模式的思路 內(nèi)容二:實踐---系統(tǒng)中復(fù)雜條件/行為及其動態(tài)變化的應(yīng)對之策 1.分析案例,深入討論下列模式的精髓,及其在重構(gòu)中的實際運用 2.用Strategy替換條件邏輯 3.用Bridge組合動態(tài)變化 4.用State替換狀態(tài)改變條件語句 5.用Composite替換隱含樹 6.用Command替換條件調(diào)度程序 7.重點學(xué)習(xí)案例的重構(gòu)到模式的過程 內(nèi)容三:實踐---如何設(shè)計統(tǒng)一且抽象的抽象的系統(tǒng) 1.分析案例,深入討論下列模式的精髓,及其在重構(gòu)中的實際運用 2.形成Template Method 3.提取Composite 4.用Composite替換一/多之分 5.用Observer替換硬編碼的通知 6.通過Adapter統(tǒng)一接口 7.重點學(xué)習(xí)案例的重構(gòu)到模式的過程 內(nèi)容四:實踐---如何設(shè)計穩(wěn)定的系統(tǒng)——保護(hù)系統(tǒng)的核心不 受變化的影響 1.分析案例,深入討論下列模式的精髓,及其在重構(gòu)中的實際運用 2.用類替換類型代碼 3.將裝飾功能搬移到Decorator 4.用Visitor限制新增功能對流程的影響 5.用Singleton限制實例化 6.引入Null Object 7.轉(zhuǎn)移聚集操作到Collecting Parameter 8.重點學(xué)習(xí)案例的重構(gòu)到模式的過程 內(nèi)容五:實踐------案例練習(xí),模式的綜合運用及分析討論 1.分析案例,深入討論下列模式的精髓,及其在重構(gòu)中的實際運用 2.案例分析,背景介紹 3.找出系統(tǒng)改設(shè)計的關(guān)鍵點 4.用Strategy設(shè)定系統(tǒng)的穩(wěn)定點 5.業(yè)務(wù)邏輯層對功能的引用要點 6.以Abstract Factory模式進(jìn)行初始組裝——兼討論分層的要點 7.以Bridge模式應(yīng)對其他因素的變化 8.以producer - consumer design pattern處理海量數(shù)據(jù)及長任務(wù) 9.重點學(xué)習(xí)案例的重構(gòu)到模式的過程 |
第六單元 系統(tǒng)與大型系統(tǒng)的演化及重構(gòu)實踐 內(nèi)容一: 架構(gòu)重構(gòu) 1.軟件架構(gòu)概述 2.遺留系統(tǒng)的軟件架構(gòu)恢復(fù) 3.軟件架構(gòu)的重構(gòu)時機(jī) 4.軟件架構(gòu)的重構(gòu)步驟 5.架構(gòu)壞味道 6.架構(gòu)重構(gòu)策略 內(nèi)容二:大型系統(tǒng)的演化及核心技術(shù) 7.應(yīng)用服務(wù)和數(shù)據(jù)服務(wù)分離 8.使用緩存改善數(shù)據(jù)庫瓶頸 9.使用應(yīng)用服務(wù)器集群和負(fù)載均衡避免運用服務(wù)器瓶頸 10.數(shù)據(jù)庫讀寫分離 11.用CDN及分布式文件系統(tǒng)加速系統(tǒng)響應(yīng) 12.分布式數(shù)據(jù)庫系統(tǒng)及NoSQL運用 13.進(jìn)行橫向的業(yè)務(wù)拆分 14.分布式服務(wù),打造自己的軟件生態(tài)環(huán)境 內(nèi)容三:案例分析—某互聯(lián)網(wǎng)項目1架構(gòu)重構(gòu)及演化 1.項目背景以及相關(guān)需求 2.初始上線:當(dāng)前的最佳策略 3.物理部署分離 4.數(shù)據(jù)庫瓶頸的解決1:引入讀寫分離 5.系統(tǒng)開發(fā)框架的更迭 6.系統(tǒng)演化中的走過的彎路1:縱向加強(qiáng)的不歸路 7.數(shù)據(jù)庫瓶頸的解決2:引入搜索引擎 8.引入分布式文件系統(tǒng) 9.引入分布式緩存 10.引入分布式服務(wù)框架,服務(wù)拆分 11.引入分布式消息中間件 12.引入分布式Session框架 內(nèi)容四:案例分析—某互聯(lián)網(wǎng)項目2平臺架構(gòu)重構(gòu) 1.項目背景以及相關(guān)需求 2.從單機(jī)版、簡單網(wǎng)絡(luò)版、分布式網(wǎng)絡(luò)版、重構(gòu)后的大型分布式網(wǎng)絡(luò)版的歷程 3.架構(gòu)設(shè)計及重構(gòu)中的多因素綜合考慮及其影響 4.原有系統(tǒng)的不足分析 5.分布式系統(tǒng)中多中心與單中心的演變過程及博弈分析 6.引入CDN分布式文件服務(wù)系統(tǒng) 7.從數(shù)據(jù)庫中dump,獨立部署圖像服務(wù)器 8.引入Memcache緩存,緩解數(shù)據(jù)庫服務(wù)器 9.引入云服務(wù)與云存儲,及其博弈 10.引入基于lucene的全文檢索,緩解數(shù)據(jù)庫服務(wù)器 11.系統(tǒng)抽象與服務(wù)抽取 12.服務(wù)隔離及負(fù)載均衡:nginx及l(fā)vs運用 13.基礎(chǔ)服務(wù)與運用服務(wù)的抽取與分離 |