《重构-改善既有代码的设计》学习笔记(一)
其實看了重構之后,發現重構和設計模式有很多很多相通的地方,或者有著同樣的目的。你完全可以參考設計模式的原則來修改已有的代碼。
1.單一職責原則
2.開放--封閉原則
3.依賴倒裝原則
4.迪米特原則(類松耦合)
筆者也在《重構》這本書中大量的談到各種設計模式,所以再次推薦大家去看看 設計模式
其實很多時候我們不復審自己的代碼的話,是很難發現自己編寫代碼的不足的。而且就算是復審了也很難發現問題,反正能實現功能就行了。
所以重構這本就是總結那些大牛們總結出的經驗結晶,能教我們怎么發現這些不是bug的問題,并解決它們。
?
什么是重構?
這是定義:
重構(名詞):對軟件內部結構的一種調整,目的是在不改變軟件可觀察行為的前提下,提高其可理解性,降低其修改成本。
重構(動詞):使用一系列重構手法,在不改變軟件可觀察行為的前提下,調整其結構。
說人話:就是已有代碼太糙了,又臭又長,既不方便修改,也不方便復用...(不符合各種設計原則),需要進行修改加工整容。
?
為什么需要重構?
因為可以升職加薪,贏取白富美呀。
?
什么時候重構?
1.難以閱讀的程序,難以修改;
2.邏輯重復的程序,難以修改;
3.添加新行為時需要修改已有代碼的程序,難以修改;
4.帶復雜條件邏輯的程序,難以修改;
因此我們希望程序:
1.閱讀容易;
2.所有邏輯都只在唯一地點指定;
3.新的改動不會危及現有行為;
4.盡可能簡單表達條件邏輯;
?
代碼的壞味道
當你聞到這些味道的時候,可能你的代碼需要重構了。所以以下這些味道很重要。
1.重復代碼(Duplicate Code):
如果你在一個以上的地方看到相同的程序結構,那么可以肯定:設法將它們合而為一,程序會變得更好。
2.過長函數(Long Method):
你應該積極分解函數。我們遵循這樣一條原則:每當感覺需要以注釋來說點什么的時候,我們就把需要說明的東西寫進一個獨立的函數中,并以其用途命名。
3.過大的類(Large?Class):
如果想利用單個類做過多的事情,其內往往就會太多實例變量。
4.過長參數列(Long?Parameter?List):
如果參數列太長或者變化太頻繁,你就需要重新考慮自己的依賴結構了。
5.發散式變化(Divergent?Change):
如果某個類經常因為不同的原因在不同的方向上發生變化。(每個對象只應該因為一種變化而修改)
6.散彈式修改(Shotgun Surgery):
與發散式變化相反,如果每遇到某種變化,都需要在許多不同的類內做出許多修改。
7.依戀情結(Feature?Envy):
對象技術的全部要點在于:將數據和對數據的操作行為包裝在一起。?壞氣味:函數對某個類的興趣高于對自己所處類的興趣。
有個原則:判斷哪個類擁有最多被此函數使用的數據,然后就把這個函數和那些數據擺咋一起。
8.數據泥團(Data Clumps):
你常常看到相同的三四項數據:兩個類中相同的字段、許多函數簽名中相同的參數。這些總綁在一起出現的數據應該擁有屬于它們自己的對象。
而且:一旦擁有新對象,你就可以著手尋找Featrue?Envy,這可以幫你指出能夠移至新類中的種種程序行為。
9.基本類型偏執狂(Primitive?Obsession):
對象技術的新手通常不愿意在小任務上運用小對象。例如單獨由數值、幣種兩個字段組成的money類。
10.switch驚悚現身(Switch?Statement):
面向對象程序的一個最明顯的特征就是:少用switch語句。大多數時候,一看到switch語句,你就應該考慮以多態來替換它??梢院筒呗阅J揭黄鹗秤?。
11.平行繼承體系(Paralle Inheritance Hierarchies):
其實是shotgun?sergery的特殊情況。如果每當你為某個類增加一個子類,必須也為另一個類相應增加一個子類。
12.冗贅類(Lazy?Class):
如果一個類的所得不值其身價,它就應該消失。程序屆也不喜歡懶的類。
13.夸夸其談未來性(Speculative?Generality):
當有人說“噢,我想我們總有一天需要做這事”,并因而企圖以各式各樣的鉤子和特殊情況來處理一些非必要的事情。
14.令人迷惑的暫時字段(Template Field):
有時你會看到這樣的對象:其內某個實例變量僅為某種特定情況而設。
15.過度耦合的消息鏈(Message?Chains):
如果你看到用戶向一個對象請求另一個對象,然后向后者請求另一個對象,然后再請求另一個對象...這就是消息鏈。
16.中間人(Middle?Man):
人們可能過度的運用代理(中間人)。你也許會看到某個接口有一半的函數都委托給其他類,這樣就是過度運用。
17.狎昵xiá nì關系(Inappropriate Intimacy):
有時你會看到兩個類過于親密,花費太多時間去探究彼此的private成分。
18.異曲同工的類(Alternative Classes with Different Interface):
當兩個函數做同一件事,卻有著不同的簽名。
19.不完美的類庫(Incomplete Library Class):
麻煩的是類庫往往構造的不夠好,或者有些部分不適用了,而且我們往往不可能讓我們修改其中的類使它完成工作。
20.幼稚的數據類(Data?Class):
所謂Data?Class是指:他們擁有一些字段,以及用于訪問(讀寫)這些字段的函數,除此之外別無長物。
21.被拒絕的遺贈(Refused?Bequest):
子類應該繼承超類的函數和數據。但如果它們不想或不需要繼承,或者只是需要其中少數元素。
22.過多的注釋(Comment):
常常會有這樣的情況:你看到一段代碼有著長長的注釋,然后發現,這些注釋之所以存在乃是因為代碼很糟糕,這種情況發生次數之多,很驚人。
當你感覺需要撰寫注釋時,請先嘗試重構,試著讓所有注釋都變得多余。
?
下一篇詳細講講怎么除去臭味。
轉載于:https://www.cnblogs.com/zhaww/p/8664749.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的《重构-改善既有代码的设计》学习笔记(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华硕电脑键盘灯在官网(华硕键盘灯驱动叫什
- 下一篇: 三万字硬核详解:yolov1、yolov