英文原文:Stop Thinking During Refactoring,翻譯:InfoQ賈國清
重構是一門在不改變軟體外部行為情況下,改善既有程式碼內部結構的一門技術。從表面來看,重構需要引入大量的思考行為,然而,過度地思考同樣會產生不利的影響。
Kent Beck提到,重構中面臨最大的挑戰就是如何做到循序漸進,循序漸進指的是如何將工作分解為可控的步驟,並且每個步驟都易於管理。重構步伐過快會導致不穩定程式碼的出現。此外,想得越多,越是謹慎反而會嚴重減慢重構的步伐。
正如許多與我結對程式設計的夥伴都會告訴你的那樣,我有一個非常不招人喜歡的習慣:在重構時總會說“不要再想啦”。我知道這並不是我真正要說的,因為我不可能去故意表達這個意思,但是直到現在,我才有機會可以給出一個更好的解釋。
Kent解釋了“水平和垂直重構”的概念。垂直重構是指調整方法或程式碼塊在呼叫堆疊中的上下順序,然而水平重構則指的是在類似於同級別的物件間所做的調整。依Kent所述,重構時應避免同時做上述兩種調整。
當需要重構具有多重呼叫或是多重實現的物件時,就要額外小心,並且重新回到垂直和水平方法,將這兩者操作分開進行,並且要時刻注意程式碼重構的深度。
話雖如此,做到並不容易⋯⋯
比較好的一個辦法就是使用索引卡(Index Cards):
在電腦旁放置索引卡會幫助我保持專注。當我在處理水平重構時突然意識到還可以做垂直重構時,我會迅速記在索引卡上,然後馬上回到剛才正在進行的工作 中。這種方法不僅可以使我在進行下一步工作前,有效地先將手頭的工作結束,同時,又不會導致某些好點子被遺忘。方法之好用,整個過程感覺就像是在做冥想, 技能感受到自己的呼吸,又不會被完全自我的意識所牽絆。
J. B. Rainsberger同意這種觀點並同時指出:
無論你在做什麼,想要專注時,手邊準備一張卡片和一支筆。當有奇思妙想突然在腦海中閃現,而這些事情又不需要立刻處理時,就可以用5個或更少的字將它寫下來,然後繼續回到剛才所作的事情中。效果甚是神奇。
這與Joshua Kerievsky所提倡的Narrow Changem模式非常相似。每次只專注於一小部分的變化點,然後再繼續在後續的重構中應用Narrow Change或是Parallel Change原則。
儘管重構中需要思考,但是,保持專注並避免潛在的干擾對良好的重構行為是很有必要的。Kent說道:
我的同伴經常會在重構的過程中產生一些好的想法,比如如何將一些函式挪到B中。這時我就會告訴他停止思考。我真實的目的並不是不想讓他去思考,我只想讓他專注的把手頭的事情先做完。就像我們往牆上釘釘子,釘子才剛釘進去了一半,我們沒有理由放下手裡的活去釘另外一個。