?

重讀《重構》,呼喚匠藝

2019-05-24 07:28熊節
出版人 2019年5期
關鍵詞:手法重構函數

熊節

2009年,在為《重構》第1版的中譯本再版整理譯稿時,我已經隱約察覺行業中對“重構”這個概念的矛盾張力。一方面,在這個“VUCA”(易變、不確定、復雜、模糊)橫行的年代,有能力調整系統的內部結構,使其更具長期生命力,這是一個令人神往的期許。另一方面,重構的扎實功夫要學起來、做起來,頗不是件輕松的事,且不說詳盡到近乎瑣碎的重構手法,光是單元測試一事,怕是已有九成同行無法企及。結果,“重構”漸漸成了一塊漂亮的招牌,大家都愿意掛上這個名號,可實際上干的卻多是“刀劈斧砍”的勾當。

如今又是十年過去,只從國內的情況而論,“重構”概念的表里分離,大有愈演愈烈之勢。隨著當年的一線技術人員紛紛走上領導崗位,他們樂于將“重構”這塊漂亮招牌用在更寬泛的環境下,然而基本功的欠缺,卻也一路如影隨形。

此時轉頭看Martin Fowler時隔將近廿載后終于付梓的《重構》第2版,我不禁感嘆于他對“微末功夫”的執著。在此書尚未成型之前,我和當時ThoughtWorks的同事曾有很多猜測,猜Fowler先生是否會在第2版中拔高層次,多談談設計乃至架構級別的重構手法,甚或跟隨“敏捷組織”“精益企業”的風潮談談組織重構,也未為不可。孰料成書令我們跌破眼鏡,Fowler先生不僅沒有拔高,反而把工夫做得更扎實了。

對比前后兩版的重構列表,可以發現:第2版收錄的重構手法在用途上更加內聚,在操作上更加連貫,更重視重構手法之間的組合運用。第1版中占了整章篇幅的“大型重構”,在第2版中全數刪去。一些較為復雜的重構手法,例如復制“被監視數據”、塑造模板函數等,第2版也不再收錄。而第2版中新增的重構手法,則多是提煉變量、移動語句、拆分循環、拆分變量這樣更加細致而微的操作。這些新增的手法看似簡單,但直指大規模遺留代碼中最常見的重構難點,正好補上了第1版中闕漏的細節。這一變化,正反映出Fowler先生對于重構一事一貫的態度:千里之行積于跬步,越是面對復雜多變的外部環境,越是要做好基本功、邁出扎實步。

在《重構》第2版里,重構手法的細節被再度打磨,重構過程比之第1版愈發流暢。細細品味重構手法中的前后步驟,琢磨作者是如何做到行為保持的,這是能啟發讀者舉一反三的讀書法。以保持對象完整重構手法為例,第1版中的做法是在原本函數上新添參數,而第2版的做法則是先新建一個空函數,在其中做完想要的調整之后,再整體替換原本函數。兩相對比,無疑是新的做法更加可控,出錯時測試失敗的范圍更小。

從這個視角品味一個個重構巨細靡遺的做法,讀者大概能感受到重構與“刀劈斧砍”之間最根本的分歧。在很多重構(例如最常用的改變函數聲明)的做法中,Fowler先生會引入“很快就會再次修改甚至刪除”的臨時元素。假如只看起止狀態,這些變更過程中的臨時元素似乎是浪費:為何不直接一步到位改變到完善的結果狀態呢?然而這些臨時元素所代表的,是對變更過程(而非只是結果)的設計。缺乏對過程的精心設計與必要投入,只抱著對結果的美好憧憬提刀上陣,遇到困難就靠“奮斗精神”和加班解決,這種“刀劈斧砍”不止發生在缺乏審慎的“重構”現場,又何嘗不是我們這個行業的縮影?

是以,重構這門技藝,以及Fowler先生撰寫《重構》的態度,代表的是軟件開發的匠藝——對“正確的做事方式”的重視。在一個浮躁之風日盛的行業中,很多人會強調“只看結果”,輕視做事的過程與方式。然而對于軟件開發的專業人士而言,如果忽視了過程與方式,也就等于放棄了我們自己的立身之本。Fowler先生近廿載對這本書、對重構手法的精心打磨,給了我們一個榜樣:一個對匠藝上心的專業人士,日積月累對過程與方式的重視,是能有所成就的。

猜你喜歡
手法重構函數
二次函數
層遞手法
二次函數
緩解后背疼的按摩手法
函數備考精講
北方大陸 重構未來
論中止行為及其對中止犯的重構
牽引配合手法治療頸性眩暈90例
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合