大約是工作三年后妆够,職業(yè)倦怠毫無征兆的襲擊了我识啦,我莫名的感到:這一輩子就這樣了,每天的工作就是寫相同的代碼神妹,要命的是颓哮,自己在一個領域越精通,別人就越希望自己寫同樣的模塊——再快一點鸵荠。使我渡過這段時光的冕茅,是一些編程行業(yè)的老書,對于一個原本追求時髦技術的程序員來說蛹找,這樣的反轉令自己也很驚訝姨伤,其中就有這本《重構》,多年后庸疾,再次捧讀乍楚,希望自己如《黑客帝國》里的neo虚婿,回到源碼栗柒,去理解為何重構即不是傳說中的銀彈,卻又如此重要趣些。本篇為第一部分金顿,先來說說看待重構的三心臊泌。
拋掉對重構的敬畏之心
1. 重構給出了具體的操作方法。
重構不是建立在空中的構建思想揍拆,而是從實踐中歸納出來的操作手冊渠概。比如書中提到的要點之一:
事不過三,三要重構礁凡。
這條規(guī)則給出了重構時機的具體判斷方法:一個值高氮,一段代碼,相同的功能顷牌,如果重復出現(xiàn)了 兩次以上剪芍,就要提取為宏,變量窟蓝,方法罪裹,或模塊饱普,以方便重用。這不是建議状共,從代碼質量來說套耕,這是要求,也是開發(fā)者從小工到專家的必由之路峡继,事實上冯袍,除此之外,我不知道還有別的編寫代碼的方法碾牌。
2. 重構早已在開發(fā)者身邊康愤。
幾乎所有開發(fā)工具(Eclipse、Xcode...)都內置重構工具舶吗,他們的使用與代碼編輯器一樣簡單征冷。
如果你是一名iOS開發(fā)者,請參閱Xcode8 五分鐘重構起步
要對重構有耐心
由于重構不改變程序的外在表現(xiàn)誓琼,換而言之检激,即沒有加入任何新功能,因此項目經(jīng)理和老板不會主動要求開發(fā)者重構腹侣,甚至開發(fā)者提出時叔收,會招來反對:這個項目還剩一個星期,還有N個需求未實現(xiàn)筐带,現(xiàn)在你請求花費兩天時間今穿,什么都不做。開發(fā)者幾乎都承擔不了這樣的壓力伦籍,但是蓝晒,比延誤工期更嚴重的是,一個臃腫的帖鸦,不易修改的項目芝薇,最終將面臨添加需求困難,運行效率低下作儿,以致達不到可用的性能洛二,項目被砍掉,失敗幾乎不可避免攻锰。
那么作為開發(fā)者晾嘶,應該怎么處理這個矛盾呢?一個可行的方法是娶吞,把重構當做開發(fā)的一部分垒迂,一邊開發(fā)一邊重構,先快速的堆疊代碼妒蛇,實現(xiàn)功能机断,然后在功能不變的基礎上(寫好單元測試)楷拳,逐步重構。
對于吹噓重構有戒心
不要對別人吹噓重構
重構是一系列技法吏奸,就如一個優(yōu)秀木匠不會吹噓自己的刀法一樣欢揖,他表現(xiàn)自己的,永遠是作品奋蔚,開發(fā)者的作品就是程序她混,可擴展,少改動泊碑,高效产上,穩(wěn)健的程序,如果團隊里有人說:我現(xiàn)在不重構就沒法寫代碼蛾狗。大概他就真的只是不會寫代碼而已。
本人面試過一些剛畢業(yè)的開發(fā)者仪媒,在最后的提問環(huán)節(jié)沉桌,他提出的問題是:你們用什么開發(fā)環(huán)境?接著他還進一步強調自己一定要使用**Source Insight
**(一種Windows平臺流行的開發(fā)集成環(huán)境算吩,基于代碼語義管理代碼)留凭,否則就無法寫代碼。當時我有點錯愕偎巢,面對了解公司環(huán)境的寶貴機會蔼夜,不問福利待遇,不問升職通道压昼,卻糾結一個開發(fā)工具求冷。后來我發(fā)現(xiàn),很多初學者(也包括我自己)對工具有種癡迷窍霞,這當然也不是壞事匠题,但對自己用的開發(fā)工具夸夸其談,只能說明開發(fā)者的眼界不夠開闊但金,水平有局限韭山。
當聽到有人將重構奉為靈丹妙藥,要格外小心冷溃,對此保持警惕钱磅。
有的技術領導人,動不動就說“下面我們進入重構階段了”似枕,仔細觀察發(fā)現(xiàn):每每他提出的時機盖淡,都是項目無法按時完成,某些功能實現(xiàn)不了時菠净,公司領導還無法反駁禁舷,懂點技術的都明白重構的重要性彪杉。
那么,如何鑒別這種拿重構“忽悠”的行為呢牵咙?可以從以下幾點:
- 檢查要進入重構階段的團隊有沒有寫好對應的單元測試派近,這些測試是否自動測試。
- 是否為重構的項目新開版本管理庫洁桌,如果是渴丸,那這不是重構,而是 重寫另凌。
- 最終確認最開始要求添加的需求是否被完成谱轨。
最后這點看起來有點二,但實際中常常發(fā)生吠谢,團隊說土童,我開始重構啦,于是在大汗淋漓的兩周后工坊,團隊只能保證“重構”后的項目勉強運行献汗,項目進入了新階段——bug修復,然后就再也沒人提最初提出的新功能新需求了王污。
對于第一點罢吃,我們要理解重構的目標是
不改變代碼外在行為的前提下,對代碼進行修改昭齐,以改進程序的內部結構尿招。
如何保證代碼外在行為沒有改變?就得靠單元測試了阱驾,這里將單元測試作為代碼或重構的質量標準就谜,誰也不想一個正在運行的程序,被修改后引入一堆Bug里覆。
既然重構講究的是小步修改
吁伺,每次改完后都要通過單元測試,那么第二點也很好理解了租谈,重建版本庫則意味著大段地搬移代碼篮奄,這個過程很難保證代碼質量,得到的很可能是 未經(jīng)驗證 的代碼割去。
既然重構是一種編程手法窟却,那么實踐中的重構是如何操作的?該如何避免重寫而**優(yōu)雅地重構呢呻逆?
下篇將通過一個具體的例子夸赫,體會重構的過程,請關注我的簡書咖城。