因為加功能和重構完全是不一樣的。
我記得有另外一個問題是問:為什麽有人說只要程式碼能執行就不要去碰它。
這恰恰就是說的這種情況。
屎山本身內部在維持一個微妙的平衡,很多地方都是正好只有這一個點是OK的,你稍微改一下就稀裏嘩啦如同多米諾骨牌一樣的結果。
但是這很多時候並不妨礙你加東西。你只需要註意不要去改變原來的結構就是了。
這就好像作業系統在執行屎山的時候,也能並列執行其它任務一樣。
對於屎山,你需要做的就是盡量將你新加的加在外部,而不是內部。
舉個例子,微軟的office很多後面加的功能,其實都是類似於執行VBA,也就是用指令碼模仿使用者手動操作,而不是直接改內部邏輯。
所以很多操作很慢。但是能用,這就OK了。
同樣的功能在google docs裏面,很可能就會輕量很多,雖然那是用網頁+手稿語言寫的。
愛立信有位工程師,搞了一套所謂面向方面的編程(AOP),就是改編譯器,在每個函數的入口和出口自動插入勾點(跳轉點)。這樣加功能的時候,就不必動原本的結構,只是hook出去跑新的程式碼,然後再hook回來。
頗有防毒軟件是如何監視其它軟件執行的味道。防毒軟件都不需要改你的程式,就可以改變你的程式的很多行為。
但是重構。。。那就完全不是這麽一回子事情了。大部份時候是,牽一發動全身,稀裏嘩啦碎了一地,然後決定另起爐竈。但是已有的生意不能停,新的生意也要做,所以最後就變成半新半舊:一座新的屎山產生了。