1. 程式人生 > >讀書筆記 大話重構

讀書筆記 大話重構

                       整體鳥瞰       最近小編讀了一本書,叫做《大話重構》,這本書運用大量源於實踐的示例,從編碼、設計、組織、架構、測試、評估、應對需求變更等方面,深入而多角度地講述了我們應該如何重構,建設性地提出了高效可行的重構七步。讀完本書,實踐重構不再卡殼,需求變更不再糾結。全面領悟重構之美,遺留系統不再是夢魘,自動化測試原來可以這樣做。本書幫助程式設計師告別劣質程式碼步入精妙設計,讓遺留系統的維護者逐步改善原有設計,指導重構實踐者走出困惑步步堅定。同時,也為管理者加強軟體質量的管理與監督,提供了好的方法與思路。本書的最大價值在於兩點:   一,讓讀者明白真正的專業級軟體開發是如何進行的;   二,讓讀者明白真正的重構具體是一步步怎麼做的。   作者範鋼老師將繁複冗長模糊不清的軟體重構過程劃分成明確而清晰的七個步驟。使初學者在面對實際中的軟體重構時,不會卡殼。   這本書所講解的重構遠遠超越了程式碼級,充分滲透到軟體系統與設計的各個層面,涵蓋從程式碼、函式、類與物件,直至設計模式、分層架構、領域模型、軟體測試的整個過程。 

  我們聽過或許沒有聽過那些術語和概念,多少明白或完全不明白的技術和方法,知道卻沒用過或完全不知道的工具和軟體,這些之前各玩各的的獨立散碎,在這本書中被榫卯成一個強韌的整體。你會明瞭它們中每一個的作用,應被安插到的位置,並見識它們各就各位時所發揮出的能量。頭腦從未有過的清醒,我們理解了以前所不理解的,今天這篇博文,小編就來簡單的介紹一下大話重構的故事,為什麼小編會有一種大話西遊的感覺呢?`(*∩_∩*)′

                       

       何為重構?       要想理解重構首先要充分的理解重構的定義。重構(Refactoring)就是通過調整程式程式碼改善軟體的質量、效能,使其程式的設計模式和架構更趨合理,提高軟體的擴充套件性和維護性。      重構的定義:對軟體內部結構的一種調整,目的是在不改變”軟體之可察行為“前提下,提高其可理解性,降低其修改成本。重構就是在程式碼寫好之後改進它的設計。重構和新增新功能並不衝突,但是當開發者身份在兩者之間切換時候,不能混淆在一起。

       重構,是一把雙刃劍,開發人員不要輕易使用。舉個例子來說,你現在正在從事某個行業的工作,但有人告訴你另外一個行業賺錢多而且快,於是你就很糾結,到底要不要改行呢?不改行吧,錢掙得少;改行吧,自己又是新手,對那個行業又不熟悉。這種心理狀態其實就是開發人員對於重構的態度,可以用“進退維谷”來形容。 

                     

       為什麼要重構?

      由於原程式結構不能滿足使用者的新需求、原程式有漏洞(bug)、原程式執行效率低下,效能不足以滿足使用者要求。所以要而且必須要進行重構。但是重構不能隨隨便便的進行重構,重構是要按照一定的原則來進行的,重構的原則:小步快跑(一次一小步的修改模式,每次修改一點點進行一個測試,再修改一點點再測試);兩頂帽子(一頂是隻重構原始碼而不增加新功能,一頂是增加新功能以實現新需求)。

        一個軟體總是為解決某種特定的需求而產生,時代在發展,客戶的業務也在發生變化。有的需求相對穩定一些,有的需求變化的比較劇烈,還有的需求已經消失了,或者轉化成了別的需求。在這種情況下,軟體必須相應的改變。考慮到成本和時間等因素,當然不是所有的需求變化都要在軟體系統中實現。但是總的說來,軟體要適應需求的變化,以保持自己的生命力。       這就產生了一種糟糕的現象:軟體產品最初製造出來,是經過精心的設計,具有良好架構的。但是隨著時間的發展、需求的變化,必須不斷的修改原有的功能、追加新的功能,還免不了有一些缺陷需要修改。為了實現變更,不可避免的要違反最初的設計構架。經過一段時間以後,軟體的架構就千瘡百孔了。bug越來越多,越來越難維護,新的需求越來越難實現,軟體的架構對新的需求漸漸的失去支援能力,而是成為一種制約。最後新需求的開發成本會超過開發一個新的軟體的成本,這就是這個軟體系統的生命走到盡頭的時候。重構就能夠最大限度的避免這樣一種現象。系統發展到一定階段後,使用重構的方式,不改變系統的外部功能,只對內部的結構進行重新的整理。通過重構,不斷的調整系統的結構,使系統對於需求的變更始終具有較強的適應能力。重構可以降低專案的藕合度,使專案更加模組化,有利於專案的開發效率和後期的維護。讓專案主框架突出鮮明,給人一種思路清晰,一目瞭然的感覺,其實重構是對框架的一種維護。

       總的數來,對於程式來說,重構就相當於做一次大的手術,因此一定要認真對待。貫穿整個重構過程的是不斷地測試、測試、再測試。我們需要不斷地實踐才能夠對整個重構的流程得心應手。因此從“小步快跑”和“兩頂帽子”兩個重要的重構思想,再到系統重構六步驟:分解大函式、拆分大物件、提高程式碼複用率、發現擴充套件點、減低依賴度、分層,這些都是重構很重要的部分。在重構時要放棄大布局,採用小設計。這種說法很有意思,感覺有點不符合我們平時正常的思維習慣,錯誤發現得越早就越利於修正錯誤。如果佈局太大,錯誤被發現的可能會越遲,這樣修正起來也更加複雜。重構時如果步子走的太大,其實花費在設計上面的時間也越多,開發週期也越長。因為考慮的太多,會導致各種各樣的問題出現。 所以採用小步快跑的方式來進行重構,由於每次只關注其中的一部分功能,這樣不論從設計還是開發,測試的角度來說,都是非常有利的。因為我們採用的是"小步快跑"的方式去重構,即使中間我們犯了一些錯誤,還是非常容易地被發現,修正。這極大的減少了我們的工作量。

                   

       什麼時候重構?      重構是一種習慣,一種程式設計習慣。這種習慣讓我們迅速由菜鳥轉變為大牛,可以編寫出高質量、優秀的程式。問題的關鍵就是降低修改成本與風險的方法,而這個方法就是系統重構。走出重構的第一步對每一個人來說都是一次心靈的考驗,甚至許多人總是徘徊於路口躊躇不前,但一旦跨出去了,它將成為你生命的一部分。      沒有經過重構的,原生態的程式碼是沒辦法複用的,當我們發現程式碼需要複用時,切忌不要使用過去那種簡單粗暴的複製黏貼,合理運用重構方法,加之以仔細、認真、即時的測試,就可以保證既有程式碼的正確,並使整個系統合理地複用起來,以提高系統的可維護性,關鍵是你有沒有這樣的意識。        新增新功能前線重構原系統,其目的有兩個:        a、 軟體的設計總是與軟體的複雜度有關的,原有的設計師在原有需求不復雜的條件下做出的,但隨著新功能的加入,軟體複雜度在發生著變化,因此必須調整原有的設計。        b、為了提高軟體的可維護性與易變更性,新增新功能應遵循OCP原則。系統重構是我們維護處高質量遺留系統的有效工具。

       在緊急變更任務中,時間就是金錢,我們要用最省時省力的方法解決問題,這裡的差別就是怎樣去重構?——做完整的設計, 但只做重構中最緊急的部分。

                   

       如何重構?       第一步:從分解大函式開始 隨著業務邏輯越來越複雜,程式設計師總是就著原有的程式結構不斷的新增新的程式碼。原有的清晰而簡單的程式,隨著新程式碼的不斷新增,因此,大多數軟體企業的遺留系統中,超級大函式就變成了一種通病。因此重構的第一步就是要從分解大函式開始。所以尋求一個系統的切入點,歸納整理大函式的各司邏輯,執行重構"抽取方法"進行函式分解化為多個不同邏輯的函式,從而優化原有的系統結構,提高了閱讀的方便性。       第二步:拆分大物件,分解了大函式,滯留的是被分解的上百上千的方法或函式,接下來就是對大物件的分解。利用重構”抽取類”將分解的函式或方法進行整合至物件中,同時保證單一職責原則,一個物件或類完成一項業務邏輯職責。最後進行類的歸併。       第三步:提高程式碼複用率 分解過大函式、拆分大物件,系統重構從無序的亂碼變得有序井然,系統的邏輯流程也清楚明白,接下來做的就是對程式碼的優化,遵循”DRY”原則,同一物件中存在重複邏輯程式碼,運用”重構方法”抽取為對應的邏輯名函式;不同物件中村子啊重複邏輯程式碼,運用”抽取類”將重複部分抽取為一個公用類,方便其他類呼叫。當重複的所在類具有並列關係,運用”抽取父類”將相同程式碼抽取為共有的父類。       第四步:發現程式可擴充套件點 系統能應對業務多變的需求變更,提高系統的易變更性,也是重構系統的目的之一。系統應保證一般性原則:預見性可擴充套件設計儘量不要太多;”兩頂帽子”設計模式—一頂是系統重構,一頂是面對新需求實現功能。遵循”OCP原則(開放-關閉原則)”也是可擴充套件點的前提根本。       第五步:降低程式依賴度 降低系統的依賴度是重構系統的最根本方法。減少功能邏輯之間的聯絡度,新需求建立獨立的功能邏輯,滿足了系統功能的耦合度,達到了系統開發低耦合高內聚。       第六步:分層 分層結構是系統開發前期所設計的系統架構,預設的架構是三層架構:資料層、業務邏輯層、應用層。分層的意義在於獨立各功能邏輯關係,在面對業務需求變更時,以改變原邏輯最小的代價,提高了系統程式碼質量。

      第七步:領域驅動設計:按照職責原則對系統進行領域劃分形成領域模型。原程式結構與現程式結構大相徑庭,並不是拋棄原有系統結構,只是通過”小步快跑”一點一點的演變而來,再次保證程式碼的質量水平和閱讀、維護、變更。這就是重構的完整過程。

      小編寄語:該博文,小編簡單的介紹《大話重構》,博文分別從,整體把控整本書、何為重構、為什麼要重構、什麼時候重構、如何重構五個方面進行歸納總結,重構的重點,不在於如何重構,而在於重構釋義過程的美學顯現。