開心一笑
【老婆問老公:你喜歡玩水還是喜歡玩火贝次?
老公:我喜歡玩火。
老婆:那以后彰导,飯就由你來煮蛔翅。
老公:不不不,我喜歡玩水位谋。
老婆:那以后的碗就由你來洗山析。
老公:瞬間石化√透福…】
【男孩:我感動天笋轨,感動地,怎么感動………
女孩:你要是敢動我赊淑,我爵政,我,我就打死你陶缺。
男孩:好好的一首情歌钾挟。……】
提出問題
項目開發(fā)中如何進行重構(gòu)饱岸?掺出?徽千?
解決問題
這是《重構(gòu) 改善既有代碼的設(shè)計》中第15章我覺得比較重要的知識點。事實上只要看第1章的例子蛛砰,第24章個人建議可以略過罐栈,沒什么用.
重構(gòu)的第一步
每當我要進行重構(gòu)的時候黍衙,第一個步驟永遠是相同的泥畅。即建立一個可靠的測試環(huán)境。
分解和重組
代碼塊越小琅翻,代碼的功能就越容易管理位仁,代碼的處理和移動也就越輕松。
首先方椎,我得在代碼里找出函數(shù)內(nèi)的局部變量和參數(shù)聂抢。任何不會被修改的變量,都可以被我當成參數(shù)傳入新的函數(shù)棠众,至于會被修改的變量琳疏,就需要格外的小心。
正和一個傻瓜都能寫出計算機可以理解的代碼闸拿,唯有寫出人類容易理解代碼才是優(yōu)秀的程序員空盼。
去除臨時變量
利用多態(tài)取代
何為重構(gòu):
名詞:重構(gòu),對軟件內(nèi)部結(jié)構(gòu)的一種調(diào)整新荤,目的是在不改變揽趾,軟件可觀察行為的前提下,提高其可理解性苛骨,降低其修改成本篱瞎。
動詞:重構(gòu),使用一系列重構(gòu)手法痒芝,在不改變軟件可觀察行為的前提下俐筋,調(diào)整其結(jié)構(gòu)。
兩頂帽子
添加新功能以及重構(gòu)严衬。
添加新功能就添加新功能澄者,先不要去重構(gòu),重構(gòu)你就好好重構(gòu)瞳步,先不要去添加新的功能闷哆。
為何重構(gòu)
原因我就不說了,反正就他媽好单起。
何時重構(gòu)
三次法則:第一次做某件事時只管去做抱怔,第二次做類似的事時會產(chǎn)生反感,但無論如何還是可以去做嘀倒,第三次再做類似的事屈留,你就應(yīng)該重構(gòu)局冰。
- 添加功能時重構(gòu)
- 修補錯誤時重構(gòu)
- 復(fù)審代碼時重構(gòu)
以下是一些壞代碼味道:符合下面就該重構(gòu)了
Duplicated Code(重復(fù)代碼)
Long Method(過長函數(shù))
Large Class(過大的類)
Long Parameter List(過長的參數(shù)列表)
Divergent Change(發(fā)散式變化):當你看著一個類說:如果新加入一個數(shù)據(jù)庫,我必須修改這三個函數(shù)灌危,如果新出現(xiàn)一種金融工具康二,我必須修改這四個函數(shù)。那么此時也許將這個對象分成兩個會更好勇蝙。
Shotgun Surgery(彈式修改):
如果遇到哪種情況沫勿,你都必須在很多不同的類內(nèi)作出,許多小修改味混。那就是壞的味道产雹。這時候你需要把所有需要修改的代碼放進同一個類。如果眼下沒有合適的類可以安置這些代碼翁锡,就創(chuàng)建一個蔓挖。Feature Envy(依戀情節(jié))
函數(shù)對某個類的興趣高過對自己所處類的興趣,是時候考慮這個函數(shù)到底應(yīng)該放在什么位置了馆衔。
對象技術(shù)的全部要點:這是一種將數(shù)據(jù)和對數(shù)據(jù)的操作行為包裝在一起的技術(shù)瘟判。
最根本的原則是,將總是一起變化的東西放在一塊角溃。
數(shù)據(jù)和引用這些數(shù)據(jù)的行為總是一起變化的拷获。
- Data Clumps(數(shù)據(jù)泥團)
減少字段和參數(shù)的個數(shù),當然可以去除一些壞味道开镣。但更重要的是刀诬,一旦擁有新對象,你就有機會讓程序散發(fā)出一種芳香邪财。
- Primitive Obsession(基本類型偏執(zhí))
將原本單獨存在的數(shù)據(jù)值替換為對象陕壹,從而走出傳統(tǒng)的洞窟,進入炙手可熱的對象世界树埠。
編寫小對象糠馆,如表示范圍的Range
- Switch Statements(switch 驚悚現(xiàn)身)
面向?qū)ο蟪绦虻囊粋€最明顯特征:少用switch(或case)語句。
看到switch語句怎憋,就應(yīng)該考慮以多態(tài)來替換它又碌。
- Parallel Inheritance Hierarchies(平行繼承體系)
每當你為某個類添加一個子類,必須也為另一個類相應(yīng)增加一個子類绊袋,大多數(shù)時候你會發(fā)現(xiàn)毕匀,某個繼承體系的類名前綴和另一個繼承體系的類名前綴完全相同。是時候分離癌别,為兩個繼承體系了皂岔。
- Lazy Class(冗贅類)
你所創(chuàng)建的每個類,都得有人去理解它展姐,維護它躁垛,這些工作都是要花錢的剖毯。如果一個類的所得不值其所價,它就應(yīng)該消失教馆。
- Speculative Generality(夸夸其談未來性)
無用的抽象類逊谋,無用的預(yù)留參數(shù)。
- Temporary Field(令人迷惑的暫時字段)
某個類的實例變量僅為某種特定情況來設(shè)土铺,某個函數(shù)的參數(shù)胶滋,為了方便聲明為某個類的成員,而僅僅在這一個函數(shù)中使用舒憾。
- Message Chains(過度耦合的函數(shù))
現(xiàn)一個對象請求另一個對象镀钓,在向后者請求另一個對象。
- Middle Man(中間人)
你也許會看到某個類接口镀迂,有一半的函數(shù)都委托給其他類,這樣就是過度運用唤蔗。
無用的委托探遵,過多的中間層。
- Inappropriate Intimacy(鉀昵關(guān)系)
類不要過度親密妓柜,一個類過一關(guān)注另一個類的成員箱季。
- Alternative Classes with Different Interfaces(曲同工的類)
兩個函數(shù)做同一件事,卻有著不同的類名
Incomplete Library Class(不完美的類庫)
Data Class(純稚的數(shù)據(jù)類)
或許可以通過移動方法把和這個數(shù)據(jù)對相關(guān)的操作一過來棍掐。
Refused Bequest(被拒絕的遺贈)
Comments(過多的注釋)
讀書感悟
來自幾米《月亮忘記了》
每個人都有一個像月亮一樣的愛人藏雏,因為這個愛人,我們擁有守護的能力作煌。
記住的掘殴,是不是永遠不會消失? 我守護如泡沫般脆弱的夢境粟誓, 快樂才剛開始奏寨,悲傷卻早已潛伏而來。
生命中鹰服,不斷地有得到和失落病瞳。于是,看不見的悲酷,看見了套菜;遺忘的,記住了设易。
生命中逗柴,不斷地有人離開或進入。于是亡嫌,看見的嚎于,看不見了掘而;記住的,遺忘了于购。
然而袍睡,看不見的,是不是就等于不存在肋僧?記住的斑胜,是不是就不會消失?
其他
如果有帶給你一絲絲小快樂嫌吠,就讓快樂繼續(xù)傳遞下去止潘,歡迎轉(zhuǎn)載,點贊辫诅,頂凭戴,歡迎留下寶貴的意見,多謝支持炕矮!