2024-05-03

《《重構(gòu)2》這本書是我覺得非常有必要看的,對于自己寫代碼有著比較大的影響,力薦。結(jié)合書中和自己實踐提煉和總結(jié)一些內(nèi)容分享出來奢米。重構(gòu)分為服務(wù)級別的重構(gòu)和代碼級別的重構(gòu)抓韩,《重構(gòu)2》這里面主要是說代碼級別的。強如阿里鬓长,發(fā)展的過程中也會出現(xiàn)臃腫問題谒拴,后續(xù)他們把服務(wù)進(jìn)行了分布式改造和服務(wù)化改造。如下摘抄《淘寶技術(shù)這10年》的原話涉波。

1. 為什么重構(gòu)

1.1 重構(gòu)是什么

重構(gòu)指在不改變代碼外在行為的前提下英上,對代碼做出修改,以改進(jìn)程序的內(nèi)部結(jié)構(gòu)啤覆。

1.2 重構(gòu)的作用

a苍日、改進(jìn)軟件設(shè)計。

b城侧、使軟件(代碼)更容易理解易遣。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? c、幫助找到bug嫌佑。

d豆茫、提高編程速度。

2. 何時重構(gòu)

2.1 簡單來說屋摇,重構(gòu)不需要刻意去安排時間揩魂,不用為了重構(gòu)而重構(gòu),重構(gòu)是為了把某件事情更好地完成炮温;

2.2 三次法則火脉,即事不過三,同樣的程序出現(xiàn)多次就可以考慮重構(gòu)了柒啤;

2.3 添加新功能時重構(gòu)倦挂;

2.4 修補問題功能時重構(gòu);

2.5 復(fù)審代碼時重構(gòu)担巩;

3. 重構(gòu)什么

3.1 神秘的命名

命名不合理給閱讀帶來很大的困擾方援。給方法、模塊涛癌、變量和類一個好的名字犯戏,才能清晰地表達(dá)相應(yīng)的功能和用法。

3.2 重復(fù)的代碼

一旦有重復(fù)代碼存在拳话,閱讀這些重復(fù)的代碼時你就必須加倍仔細(xì)先匪,留意其間細(xì)微的差異。如果要修改重復(fù)代碼弃衍,你必須找出所有的副本來修改呀非。

3.3 過長的方法

方法越長,就越難理解镜盯。越不好維護(hù)姜钳。

3.4 過長的參數(shù)列表

過長的參數(shù)坦冠,不好理解和維護(hù)。

3.5 數(shù)據(jù)泥團

常掣缜牛可以在很多地方看到相同的三四項數(shù)據(jù):兩個類中相同的字段、許多方法簽名中相同的參數(shù)激涤。這些總是綁在一起出現(xiàn)的數(shù)據(jù)應(yīng)該擁有屬于它們自己的對象拟糕。

3.6 循環(huán)語句

循環(huán)已經(jīng)有點兒過時,看是否能用stream替代

3.7 冗贅的元素

可能有這樣一個方法倦踢,它的名字就跟實現(xiàn)代碼看起來一模一樣送滞;也可能有這樣一個類,根本就是一個簡單的方法辱挥。起初在編寫這個方法時犁嗅,期望它將來有一天會變大、變復(fù)雜晤碘,但那一天從未到來褂微。

3.8 夸夸其談通用性

當(dāng)有人說“噢,我想我們總有一天需要做這件事”园爷,并企圖以各式各樣的鉤子和特殊情況來處理一些非必要的事情宠蚂,這種壞味道就出現(xiàn)了。這么做的結(jié)果往往造成系統(tǒng)更難理解和維護(hù)童社。

3.9 臨時字段

類內(nèi)部某個字段僅為某種特定情況而設(shè)求厕。這樣的代碼有時讓人不易理解。

3.10 過大的類

如果想利用單個類做太多事情扰楼,其內(nèi)往往就會出現(xiàn)太多字段呀癣。一旦如此,重復(fù)代碼也就接踵而至了弦赖。

3.11 注釋

有時候注釋為了掩蓋代碼的壞味道项栏,作為“除臭劑”使用了。有時注釋就作為一個有壞味道的信號了腾节。

4. 重構(gòu)的技巧

4.1忘嫉、提煉方法;(反向重構(gòu)-內(nèi)聯(lián)方法)

使用場景如:方法過長案腺、代碼復(fù)用的角度

一個很好的技巧是:尋找注釋庆冕。就算只有一行代碼,如果它需要以注釋來說明劈榨,那也值得將它提煉到獨立方法中去访递。


4.2 提煉變量(反向重構(gòu)-內(nèi)聯(lián)變量)

如果表達(dá)式非常復(fù)雜而難以閱讀。這種情況下同辣,局部變量可以幫助我們將表達(dá)式分解為比較容易管理的形式拷姿。


4.3 引入?yún)?shù)對象

使用場景:數(shù)據(jù)泥團


4.4 以查詢?nèi)〈R時變量

使用場景:取代臨時變量惭载、方便提煉方法


4.5 提煉類 (反向重構(gòu)-內(nèi)聯(lián)類)

使用場景:數(shù)據(jù)泥團。一般類隨著責(zé)任不斷增加响巢,這個類會變得過分復(fù)雜描滔。很快,你的類就會變成一團亂麻踪古。

4.6 拆分循環(huán)

讓循環(huán)只做一件事情含长,但如果你在一次循環(huán)中做了多件不同的事,那么每當(dāng)需要修改循環(huán)時伏穆,你都得同時理解這多件事情拘泞。拆分循環(huán)有利于系統(tǒng)的完善。但是有一點枕扫,重構(gòu)完成之后陪腌,如果確實發(fā)現(xiàn)會造成性能問題,再合并回來烟瞧。一般情況下诗鸭,循環(huán)本身也很少成為性能瓶頸。



4.7 stream替換循環(huán)

使用場景:stream好處是燕刻,允許我們?nèi)ケ磉_(dá)我們想要完成什么而不是要怎樣做


4.8 移除死代碼

使用場景:無用代碼確實會帶來很多額外的思維負(fù)擔(dān)只泼。有可能以后又會需要這段代碼,就算真的發(fā)生卵洗,可以從版本控制系統(tǒng)里再次將它翻找出來请唱。

4.9 拆分變量

其他的如果它們被賦值超過一次,就意味它們在函數(shù)中承擔(dān)了一個以上的責(zé)任过蹂。同一個變量承擔(dān)兩件不同的事情十绑,降低可讀性。


4.10 分解條件表達(dá)式 (反向重構(gòu)-合并條件表達(dá)式)

將每個分支條件分解成新函數(shù)可以帶來更多好處:可以突出條件邏輯酷勺,更清楚地表明每個分支的作用本橙,并且突出每個分支的原因。


4.11 以衛(wèi)語句取代嵌套條件表達(dá)式

衛(wèi)語句取代嵌套條件表達(dá)式的精髓就是:給某一條分支以特別的重視脆诉。如果使用if-else結(jié)構(gòu)甚亭,你對if分支和else分支的重視是同等的。


4.12 以命令取代方法 (反向重構(gòu)-以方法取代命令)

適用場景例如:過長方法击胜,命令對象提供了更大的控制靈活性和更強的表達(dá)能力


4.13 方法上移 (反向重構(gòu)-方法下移)

避免重復(fù)代碼


4.14 提煉超類

如果我看見兩個類在做相似的事亏狰,可以利用基本的繼承機制把它們的相似之處提煉到超類。


4.15 委托取代子類 (類似-委托取代超類)

繼承給類之間引入了非常緊密的關(guān)系偶摔。與繼承關(guān)系相比暇唾,使用委托關(guān)系時接口更清晰、耦合更少。


5. 測試幫助重構(gòu)

要正確地進(jìn)行重構(gòu)策州,前提是得有一套穩(wěn)固的測試集合瘸味,以幫我發(fā)現(xiàn)難以避免的疏漏,這點很重要够挂,只要這方面吃過虧就能認(rèn)識到旁仿。

還有一個問題就是重構(gòu)代碼短期間收益不高,很不容易出kpi下硕,如果上頭不是很認(rèn)可丁逝,其實這個工作很不好做,改得不好很容易背鍋梭姓。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市嫩码,隨后出現(xiàn)的幾起案子誉尖,更是在濱河造成了極大的恐慌,老刑警劉巖铸题,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铡恕,死亡現(xiàn)場離奇詭異,居然都是意外死亡丢间,警方通過查閱死者的電腦和手機探熔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烘挫,“玉大人诀艰,你說我怎么就攤上這事∫” “怎么了其垄?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長卤橄。 經(jīng)常有香客問我绿满,道長,這世上最難降的妖魔是什么窟扑? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任喇颁,我火速辦了婚禮,結(jié)果婚禮上嚎货,老公的妹妹穿的比我還像新娘橘霎。我一直安慰自己,他們只是感情好厂抖,可當(dāng)我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布茎毁。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪七蜘。 梳的紋絲不亂的頭發(fā)上谭溉,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天,我揣著相機與錄音橡卤,去河邊找鬼扮念。 笑死,一個胖子當(dāng)著我的面吹牛碧库,可吹牛的內(nèi)容都是我干的柜与。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼嵌灰,長吁一口氣:“原來是場噩夢啊……” “哼弄匕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起沽瞭,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤迁匠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后驹溃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體城丧,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年豌鹤,在試婚紗的時候發(fā)現(xiàn)自己被綠了亡哄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡布疙,死狀恐怖蚊惯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拐辽,我是刑警寧澤拣挪,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站俱诸,受9級特大地震影響菠劝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜睁搭,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一赶诊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧园骆,春花似錦舔痪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夺英。三九已至,卻和暖如春滋捶,著一層夾襖步出監(jiān)牢的瞬間痛悯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工重窟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留载萌,地道東北人。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓巡扇,卻偏偏與公主長得像扭仁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子厅翔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 感恩乖坠!六點簽到 “轉(zhuǎn)念作業(yè)”不是為了讓人羞愧或譴責(zé),也不是為了證明你是“錯的一方”刀闷。 反向思考的威力瓤帚,只是為了發(fā)掘...
  • 何謂重構(gòu) 重構(gòu)的關(guān)鍵在于運用大量微小且保持軟件行為的步驟,一步步達(dá)成大規(guī)模的修改涩赢。每個單獨的重構(gòu)要么很小,要么由若...
    明日號角閱讀 870評論 0 1
  • 閱讀時間模型 (這部分內(nèi)容的閱讀轩勘,似乎與當(dāng)下自己的狀態(tài)相關(guān)筒扒,一直在研究題目,研究教材绊寻,至于為什么如此花墩,如何發(fā)展的懵...
    文芳讀寫閱讀 54評論 0 1
  • 語文實踐是長期以來語文教學(xué)經(jīng)驗所積淀形成的“語文學(xué)習(xí)之道”,它是通過聽說讀寫澄步、觀察冰蘑、思考、感悟村缸、體驗祠肥、質(zhì)疑、...
    卓娜閱讀 37評論 0 0
  • 前言一梯皿、把它變成工具書二仇箱、概述何謂重構(gòu)注釋為何重構(gòu)何時重構(gòu)重構(gòu)、架構(gòu)和YAGNI重構(gòu)與軟件開發(fā)過程重構(gòu)與性能如何重...
    冬貓咚咚鏘閱讀 1,008評論 0 0