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