Feb. 12 11:20~12:18
今天談如何移除Speculative Generality怪味道,關於這個怪味道的說明請參考〈談談壞味道(7):Lazy Class & Speculative Generality〉和〈更精確的壞味道定義(中)〉。
▼首先看程式範例。你的系統需要一個複製檔案功能,考量到未來跨平台的可能性,你設計了AbstractFileCopiler類別做為複製檔案的界面。不同平台的實做,例如Windows、Mac、Linux,只要實做AbstractFileCopiler的copy()函數即可。
▼你設計了另一個FileManipulate類別,它使用AbstractFileCopy來實做crossPlatformCopy()函數。因為考慮到不同平台的特別,crossPlatformCopy()函數多了flag1和flag2參數,它們分別在在Mac與Linux才會使用到。
▼系統上線很久之後,AbstractFileCopy還是只有一個Windows平台的實做—WindowsFileCopiler類別。
***
AbstractFileCopiler在這個例子中有著Speculative Generality怪味道,翻成白話文就是「過度設計(over design)」。只好透過Collapse Hierarchy重構把它打回原形,既然只有一個平台的實做,實在不需要如此繁瑣的設計,直接把WindowsFileCopiler裡面的copy()函數的程式碼移到FileManipulate的crossPlatformCopy()函數即可。然後套用Rename Method把crossPlatformCopy()正名為copy(),最後套用Remove Parameter拿掉falg1與flag2這兩個用不到的參數。重構後的程式如下:
***
友藏內心獨白:泡泡吹的太大有一天會變成泡沫。
沒有留言:
張貼留言