重构:改善既有代码的设计(评注版) 评注者序
重構(gòu):改善既有代碼的設(shè)計(jì)(評(píng)注版) 評(píng)注者序
?
評(píng)注者序
近十年來(lái),若要討論如何改進(jìn)代碼的質(zhì)量,很難繞過(guò)Martin Fowler的這本經(jīng)典著作。這本書(shū)已經(jīng)影響了幾代程序員,或許會(huì)持續(xù)不斷地影響未來(lái)的一批程序員。遺憾的是,在現(xiàn)實(shí)中我們?nèi)匀豢吹搅酥貥?gòu)的步履維艱。一方面是因?yàn)槌绦騿T的重構(gòu)技巧還有待磨礪,另一方面則是因?yàn)轫?xiàng)目的壓力,使得我們往往將重構(gòu)視為雞肋。
重構(gòu)是可有可無(wú)的嗎?Practices of an Agile Developer的作者Andy Hunt認(rèn)為“要投入時(shí)間和精力保持代碼的整潔、敞亮。在項(xiàng)目中,代碼應(yīng)該是亮堂的,不應(yīng)該有黑暗死角。”相信維護(hù)過(guò)遺留代碼的程序員,在面對(duì)糾纏不清、復(fù)雜混亂的代碼時(shí),對(duì)于此言必有“心有戚戚焉”之感。重構(gòu)是清理代碼垃圾的有效手段,它有助于營(yíng)造明晰的程序結(jié)構(gòu)、一致的代碼風(fēng)格、有效的職責(zé)重用,能夠恰如其分地在簡(jiǎn)單與復(fù)雜之間尋覓到代碼之美,合理地權(quán)衡代碼質(zhì)量與開(kāi)發(fā)效率,從而提升至優(yōu)雅編碼的境界。
如何呈現(xiàn)重構(gòu)之美?關(guān)鍵在于發(fā)現(xiàn)丑陋而不堪忍受。對(duì)丑的憎惡實(shí)則是一種強(qiáng)悍的驅(qū)動(dòng)力,它會(huì)驅(qū)使你運(yùn)用重構(gòu),直到重構(gòu)變成如呼吸一般自然而不可缺失。重構(gòu)無(wú)須專門(mén)的階段,隨時(shí)隨地皆可進(jìn)行。經(jīng)常的重構(gòu)可以保證代碼常拭常新,如利刃一般鋒利。那種為了單一地追求開(kāi)發(fā)速度,而置代碼質(zhì)量于不顧的做法,實(shí)則是殺雞取卵,可以預(yù)期的結(jié)果就是系統(tǒng)的“破窗戶”逐漸蔓延,最后落得不可收拾的下場(chǎng)。重構(gòu)并非不可執(zhí)行,關(guān)鍵還在于我們對(duì)于重構(gòu)的態(tài)度和運(yùn)用重構(gòu)的習(xí)慣。必須在思想上認(rèn)同重構(gòu)的重要性;然后在技巧上不斷提升重構(gòu)技能,并輔以對(duì)重構(gòu)工具的使用,就能最大程度地放大重構(gòu)在軟件開(kāi)發(fā)中積極的一面。
若要提升重構(gòu)技能,閱讀本書(shū)就是必須,沒(méi)有例外。那么,對(duì)于這樣的經(jīng)典之作而言,還有點(diǎn)評(píng)的必要嗎?是否我們?cè)谧鲋?huà)蛇添足的蠢事?Martin Fowler已經(jīng)做得足夠好,任何點(diǎn)評(píng)都是一種饒舌?不盡然!身為點(diǎn)評(píng)者的我,如果僅滿足于在本書(shū)的邊邊角角上,不痛不癢地發(fā)表不承擔(dān)責(zé)任的語(yǔ)氣詞,那么對(duì)于這種點(diǎn)評(píng),不要也罷。我在著手本書(shū)的點(diǎn)評(píng)工作時(shí),對(duì)自己的定位是:我不是點(diǎn)評(píng)者,我是創(chuàng)作者。在點(diǎn)評(píng)本書(shū)的過(guò)程中,我是以創(chuàng)作自己著作的態(tài)度來(lái)完成的。
本書(shū)的大多數(shù)點(diǎn)評(píng)內(nèi)容,并非片言只語(yǔ),很多內(nèi)容都是自己重構(gòu)心得以及重構(gòu)技巧的運(yùn)用。我閱讀參考了大量的書(shū)籍,例如《程序員修煉之道》、《重構(gòu)與模式》、《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》、《反模式》、《軟件架構(gòu)的藝術(shù)》、《修改代碼的藝術(shù)》、《代碼整潔之道》等十余部相關(guān)書(shū)籍。畢竟站在軟件世界的角度來(lái)看,Martin Fowler寫(xiě)作本書(shū)的時(shí)代已經(jīng)相當(dāng)“古老”了。在這之后,產(chǎn)生了許多精彩的設(shè)計(jì)技巧、重構(gòu)理念與方法。譬如在與重構(gòu)相關(guān)的內(nèi)容中,本書(shū)未曾論述的就包括:架構(gòu)重構(gòu)、界面重構(gòu)、數(shù)據(jù)庫(kù)重構(gòu)、重構(gòu)模式等內(nèi)容。在點(diǎn)評(píng)過(guò)程中,我希望能以開(kāi)放的方式描述自己閱讀本書(shū)的感受,講述自己重構(gòu)的體驗(yàn),并在能力范圍之內(nèi)給出自己的一些意見(jiàn)與看法。
我作為一名程序員,看到了太多漠視或者無(wú)視垃圾代碼的同行們,這其中也包括曾經(jīng)的我。但當(dāng)我深陷遺留代碼的痛苦時(shí),對(duì)于這樣的現(xiàn)狀就變得痛心疾首了。近年來(lái),軟件業(yè)界對(duì)于軟件工藝以及敏捷方法的推行,在一定程度上改善了人們的看法,但在實(shí)際推行中依舊困難重重。最大的起因就在于我們將程序員定位為“代碼工人”,認(rèn)為編碼工作是低端程序員的責(zé)任。我們妄圖創(chuàng)造如機(jī)械制造行業(yè)一般的“軟件工廠”,卻忽略了軟件編程實(shí)則還有藝術(shù)的一面。我始終認(rèn)為,代碼仍然是架構(gòu)的一部分,代碼質(zhì)量決定了架構(gòu)質(zhì)量,而重構(gòu)則是延緩系統(tǒng)衰老的生命源泉。正所謂“千里之行始于足下”,就讓重構(gòu)之行,始于本書(shū)吧。
?
?
序
“重構(gòu)”這個(gè)概念來(lái)自Smalltalk圈子,沒(méi)多久就進(jìn)入了其他語(yǔ)言陣營(yíng)之中。由于重構(gòu)是框架開(kāi)發(fā)中不可缺少的一部分,所以當(dāng)框架開(kāi)發(fā)人員討論自己的工作時(shí),這個(gè)術(shù)語(yǔ)就誕生了。當(dāng)他們精練自己的類繼承體系時(shí),當(dāng)他們叫喊自己可以拿掉多少多少行代碼時(shí),重構(gòu)的概念慢慢浮出水面。框架設(shè)計(jì)者知道,這東西不可能一開(kāi)始就完全正確,它將隨著設(shè)計(jì)者的經(jīng)驗(yàn)成長(zhǎng)而進(jìn)化;他們也知道,代碼被閱讀和被修改的次數(shù)遠(yuǎn)遠(yuǎn)多于它被編寫(xiě)的次數(shù)。保持代碼易讀、易修改的關(guān)鍵,就是重構(gòu)——對(duì)框架而言如此,對(duì)一般軟件也如此。
好極了,還有什么問(wèn)題嗎?問(wèn)題很顯然:重構(gòu)具有風(fēng)險(xiǎn)。它必須修改運(yùn)作中的程序,這可能引入一些不易察覺(jué)的錯(cuò)誤。如果重構(gòu)方式不恰當(dāng),可能毀掉你數(shù)天甚至數(shù)星期的成果。如果重構(gòu)時(shí)不做好準(zhǔn)備,不遵守規(guī)則,風(fēng)險(xiǎn)就更大。你挖掘自己的代碼,很快發(fā)現(xiàn)了一些值得修改的地方,于是你挖得更深。挖得越深,找到的重構(gòu)機(jī)會(huì)就越多,于是你的修改也越多……最后你給自己挖了個(gè)大坑,卻爬不出去了。為了避免自掘墳?zāi)?#xff0c;重構(gòu)必須系統(tǒng)化進(jìn)行。我在《設(shè)計(jì)模式》書(shū)中和另外三位作者曾經(jīng)提過(guò):設(shè)計(jì)模式為重構(gòu)提供了目標(biāo)。然而“確定目標(biāo)”只是問(wèn)題的一部分而已,改造程序以達(dá)到目標(biāo)是另一個(gè)難題。
Martin Fowler和本書(shū)另幾位作者清楚揭示了重構(gòu)過(guò)程,他們?yōu)槊嫦驅(qū)ο筌浖_(kāi)發(fā)所做的貢獻(xiàn)難以衡量。本書(shū)解釋了重構(gòu)的原理和最佳實(shí)踐,并指出何時(shí)何地你應(yīng)該開(kāi)始挖掘你的代碼以求改善。本書(shū)的核心是一系列完整的重構(gòu)方法,其中每一項(xiàng)都介紹一種經(jīng)過(guò)實(shí)踐檢驗(yàn)的代碼變換手法的動(dòng)機(jī)和技術(shù)。某些項(xiàng)目如Extract Method和Move Field看起來(lái)可能很淺顯,但不要掉以輕心,因?yàn)槔斫膺@類技術(shù)正是有條不紊地進(jìn)行重構(gòu)的關(guān)鍵。本書(shū)所提的這些重構(gòu)手法將幫助你一次一小步地修改你的代碼,這就減少了過(guò)程中的風(fēng)險(xiǎn)。很快你就會(huì)把這些重構(gòu)手法和其名稱加入自己的開(kāi)發(fā)詞典中,并且朗朗上口。
我第一次體驗(yàn)有講究的、一次一小步的重構(gòu),是某次與Kent Beck在30 000英尺高空的飛行旅途中結(jié)對(duì)編程。我們運(yùn)用本書(shū)收錄的重構(gòu)手法,保證每次只走一步。最后,我對(duì)這種實(shí)踐方式的效果感到十分驚訝。我不但對(duì)最后結(jié)果更有信心,而且開(kāi)發(fā)壓力也小了很多。所以,我極力推薦你試試這些重構(gòu)手法,你和你的程序都將因此更美好。
?
Erich Gamma
《設(shè)計(jì)模式》第一作者,Eclipse平臺(tái)主架構(gòu)師
熊節(jié)? 譯
轉(zhuǎn)載于:https://blog.51cto.com/bvbroadview/620653
總結(jié)
以上是生活随笔為你收集整理的重构:改善既有代码的设计(评注版) 评注者序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 连续梦到已故的亲人是什么意思
- 下一篇: Bloomfilter 的应用场景