2016年5月29日 星期日

從定義看重構

2016/5/29 14:06~14:45


圖片取自 <泰迪軟體-軟體重構入門實作班>投影片

重構就是『在不改變程式外在行為的前提之下改變城市內部結構以提升設計品質

Teddy從定義切入引伸出了六個議題:

1. 如何確認程式外在行為沒有被改變?


在正常的軟體開發過程中,通常會先規劃好設計規格(或類別),才開始動手寫程式,然後經過手動或自動化測試驗證功能是否符合規格。
程式會依時間或需求而變得越來越大坨,測試項目也會跟著越來越多,假設目前的程式已開發了100個功能,當你重構一小塊功能,通常要重新測試這100個功能,以確保自己修改的程式沒有問題。這時候如果沒有自動化測試的話通常開發人員也會開始不敢改程式,更別說整理程式碼了。

2. 如何定義哪些是外在行為?


一個使用者使用計算機類別的類別的public "add" 方法,對使用者來說,add的行為就是外在行為,計算機使用者來說是一個黑箱,我不知道它怎麼做,但我知道它會說。

3. 為什麼要以不改變程式外在行為當作前提?


這個問題很有趣,為什麼不能再新增功能的同時順便重構?
不知道你有沒有這樣的體驗,在新增功能的過程中,發現某一塊的程式碼寫了100行達成一個功能,但你發現其實寫10行就可以達到一樣的功能,所以你修改這一塊程式碼,改完之後才繼續做原本要新增的功能,好不容易把功能新增完,很興奮地按下"執行",再來你的情緒就跟著程式一起崩潰了,是剛剛重構錯誤,還是新增的功能錯誤?

4. 怎麼改變程式內部結構以提升品質?


藉由重構裡面所定義的壞味道與技巧,加上自己的反覆練行。想知道怎麼改可以讀Martin Flower的重構或者上泰迪軟體-軟體重構入門實作班

5. 那些內部結構可以改?


以Java來說,程式碼的結構從小到依序為
變數(Variable) → 條件式(Statement) → 方法(Method) → 類別(Class) → 包裹 (Package)
重構裡面所談的重構技巧也是有結構上的差別,例如調整類別的繼承關係、改變方法的介面、將1個100行的方法切成5個20行的方法等等。

6. 品質提升的目的為何?


讓軟體變軟


Teddy總是能把死的定義講得很活真的有很猛