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