讀書筆記 大話重構
我們聽過或許沒有聽過那些術語和概念,多少明白或完全不明白的技術和方法,知道卻沒用過或完全不知道的工具和軟體,這些之前各玩各的的獨立散碎,在這本書中被榫卯成一個強韌的整體。你會明瞭它們中每一個的作用,應被安插到的位置,並見識它們各就各位時所發揮出的能量。頭腦從未有過的清醒,我們理解了以前所不理解的,今天這篇博文,小編就來簡單的介紹一下大話重構的故事,為什麼小編會有一種大話西遊的感覺呢?`(*∩_∩*)′
何為重構? 要想理解重構首先要充分的理解重構的定義。重構(Refactoring)就是通過調整程式程式碼改善軟體的質量、效能,使其程式的設計模式和架構更趨合理,提高軟體的擴充套件性和維護性。 重構的定義:對軟體內部結構的一種調整,目的是在不改變”軟體之可察行為“前提下,提高其可理解性,降低其修改成本。重構就是在程式碼寫好之後改進它的設計。重構和新增新功能並不衝突,但是當開發者身份在兩者之間切換時候,不能混淆在一起。
重構,是一把雙刃劍,開發人員不要輕易使用。舉個例子來說,你現在正在從事某個行業的工作,但有人告訴你另外一個行業賺錢多而且快,於是你就很糾結,到底要不要改行呢?不改行吧,錢掙得少;改行吧,自己又是新手,對那個行業又不熟悉。這種心理狀態其實就是開發人員對於重構的態度,可以用“進退維谷”來形容。
為什麼要重構?
由於原程式結構不能滿足使用者的新需求、原程式有漏洞(bug)、原程式執行效率低下,效能不足以滿足使用者要求。所以要而且必須要進行重構。但是重構不能隨隨便便的進行重構,重構是要按照一定的原則來進行的,重構的原則:小步快跑(一次一小步的修改模式,每次修改一點點進行一個測試,再修改一點點再測試);兩頂帽子(一頂是隻重構原始碼而不增加新功能,一頂是增加新功能以實現新需求)。
一個軟體總是為解決某種特定的需求而產生,時代在發展,客戶的業務也在發生變化。有的需求相對穩定一些,有的需求變化的比較劇烈,還有的需求已經消失了,或者轉化成了別的需求。在這種情況下,軟體必須相應的改變。考慮到成本和時間等因素,當然不是所有的需求變化都要在軟體系統中實現。但是總的說來,軟體要適應需求的變化,以保持自己的生命力。 這就產生了一種糟糕的現象:軟體產品最初製造出來,是經過精心的設計,具有良好架構的。但是隨著時間的發展、需求的變化,必須不斷的修改原有的功能、追加新的功能,還免不了有一些缺陷需要修改。為了實現變更,不可避免的要違反最初的設計構架。經過一段時間以後,軟體的架構就千瘡百孔了。bug越來越多,越來越難維護,新的需求越來越難實現,軟體的架構對新的需求漸漸的失去支援能力,而是成為一種制約。最後新需求的開發成本會超過開發一個新的軟體的成本,這就是這個軟體系統的生命走到盡頭的時候。重構就能夠最大限度的避免這樣一種現象。系統發展到一定階段後,使用重構的方式,不改變系統的外部功能,只對內部的結構進行重新的整理。通過重構,不斷的調整系統的結構,使系統對於需求的變更始終具有較強的適應能力。重構可以降低專案的藕合度,使專案更加模組化,有利於專案的開發效率和後期的維護。讓專案主框架突出鮮明,給人一種思路清晰,一目瞭然的感覺,其實重構是對框架的一種維護。
總的數來,對於程式來說,重構就相當於做一次大的手術,因此一定要認真對待。貫穿整個重構過程的是不斷地測試、測試、再測試。我們需要不斷地實踐才能夠對整個重構的流程得心應手。因此從“小步快跑”和“兩頂帽子”兩個重要的重構思想,再到系統重構六步驟:分解大函式、拆分大物件、提高程式碼複用率、發現擴充套件點、減低依賴度、分層,這些都是重構很重要的部分。在重構時要放棄大布局,採用小設計。這種說法很有意思,感覺有點不符合我們平時正常的思維習慣,錯誤發現得越早就越利於修正錯誤。如果佈局太大,錯誤被發現的可能會越遲,這樣修正起來也更加複雜。重構時如果步子走的太大,其實花費在設計上面的時間也越多,開發週期也越長。因為考慮的太多,會導致各種各樣的問題出現。 所以採用小步快跑的方式來進行重構,由於每次只關注其中的一部分功能,這樣不論從設計還是開發,測試的角度來說,都是非常有利的。因為我們採用的是"小步快跑"的方式去重構,即使中間我們犯了一些錯誤,還是非常容易地被發現,修正。這極大的減少了我們的工作量。
什麼時候重構? 重構是一種習慣,一種程式設計習慣。這種習慣讓我們迅速由菜鳥轉變為大牛,可以編寫出高質量、優秀的程式。問題的關鍵就是降低修改成本與風險的方法,而這個方法就是系統重構。走出重構的第一步對每一個人來說都是一次心靈的考驗,甚至許多人總是徘徊於路口躊躇不前,但一旦跨出去了,它將成為你生命的一部分。 沒有經過重構的,原生態的程式碼是沒辦法複用的,當我們發現程式碼需要複用時,切忌不要使用過去那種簡單粗暴的複製黏貼,合理運用重構方法,加之以仔細、認真、即時的測試,就可以保證既有程式碼的正確,並使整個系統合理地複用起來,以提高系統的可維護性,關鍵是你有沒有這樣的意識。 新增新功能前線重構原系統,其目的有兩個: a、 軟體的設計總是與軟體的複雜度有關的,原有的設計師在原有需求不復雜的條件下做出的,但隨著新功能的加入,軟體複雜度在發生著變化,因此必須調整原有的設計。 b、為了提高軟體的可維護性與易變更性,新增新功能應遵循OCP原則。系統重構是我們維護處高質量遺留系統的有效工具。
在緊急變更任務中,時間就是金錢,我們要用最省時省力的方法解決問題,這裡的差別就是怎樣去重構?——做完整的設計, 但只做重構中最緊急的部分。
如何重構? 第一步:從分解大函式開始 隨著業務邏輯越來越複雜,程式設計師總是就著原有的程式結構不斷的新增新的程式碼。原有的清晰而簡單的程式,隨著新程式碼的不斷新增,因此,大多數軟體企業的遺留系統中,超級大函式就變成了一種通病。因此重構的第一步就是要從分解大函式開始。所以尋求一個系統的切入點,歸納整理大函式的各司邏輯,執行重構"抽取方法"進行函式分解化為多個不同邏輯的函式,從而優化原有的系統結構,提高了閱讀的方便性。 第二步:拆分大物件,分解了大函式,滯留的是被分解的上百上千的方法或函式,接下來就是對大物件的分解。利用重構”抽取類”將分解的函式或方法進行整合至物件中,同時保證單一職責原則,一個物件或類完成一項業務邏輯職責。最後進行類的歸併。 第三步:提高程式碼複用率 分解過大函式、拆分大物件,系統重構從無序的亂碼變得有序井然,系統的邏輯流程也清楚明白,接下來做的就是對程式碼的優化,遵循”DRY”原則,同一物件中存在重複邏輯程式碼,運用”重構方法”抽取為對應的邏輯名函式;不同物件中村子啊重複邏輯程式碼,運用”抽取類”將重複部分抽取為一個公用類,方便其他類呼叫。當重複的所在類具有並列關係,運用”抽取父類”將相同程式碼抽取為共有的父類。 第四步:發現程式可擴充套件點 系統能應對業務多變的需求變更,提高系統的易變更性,也是重構系統的目的之一。系統應保證一般性原則:預見性可擴充套件設計儘量不要太多;”兩頂帽子”設計模式—一頂是系統重構,一頂是面對新需求實現功能。遵循”OCP原則(開放-關閉原則)”也是可擴充套件點的前提根本。 第五步:降低程式依賴度 降低系統的依賴度是重構系統的最根本方法。減少功能邏輯之間的聯絡度,新需求建立獨立的功能邏輯,滿足了系統功能的耦合度,達到了系統開發低耦合高內聚。 第六步:分層 分層結構是系統開發前期所設計的系統架構,預設的架構是三層架構:資料層、業務邏輯層、應用層。分層的意義在於獨立各功能邏輯關係,在面對業務需求變更時,以改變原邏輯最小的代價,提高了系統程式碼質量。
第七步:領域驅動設計:按照職責原則對系統進行領域劃分形成領域模型。原程式結構與現程式結構大相徑庭,並不是拋棄原有系統結構,只是通過”小步快跑”一點一點的演變而來,再次保證程式碼的質量水平和閱讀、維護、變更。這就是重構的完整過程。
小編寄語:該博文,小編簡單的介紹《大話重構》,博文分別從,整體把控整本書、何為重構、為什麼要重構、什麼時候重構、如何重構五個方面進行歸納總結,重構的重點,不在於如何重構,而在於重構釋義過程的美學顯現。