日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

《重构-改善既有代码的设计》学习笔记(一)

發(fā)布時(shí)間:2023/12/2 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《重构-改善既有代码的设计》学习笔记(一) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

其實(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。