l

2016年2月25日 星期四

用Collapse Hierarchy移除Speculative Generality怪味道

Feb. 12 11:20~12:18

螢幕截圖 2016-02-12 12.31.25


今天談如何移除Speculative Generality怪味道,關於這個怪味道的說明請參考〈壞味道(7):Lazy Class & Speculative Generality〉和〈更精確的壞味道定義(中)〉。

▼首先看程式範例。你的系統需要一個複製檔案功能,考量到未來跨平台的可能性,你設計了AbstractFileCopiler類別做為複製檔案的界面。不同平台的實做,例如Windows、Mac、Linux,只要實做AbstractFileCopiler的copy()函數即可。

螢幕截圖 2016-02-12 11.30.06

 

▼你設計了另一個FileManipulate類別,它使用AbstractFileCopy來實做crossPlatformCopy()函數。因為考慮到不同平台的特別,crossPlatformCopy()函數多了flag1和flag2參數,它們分別在在Mac與Linux才會使用到。

螢幕截圖 2016-02-12 11.38.48

 

▼系統上線很久之後,AbstractFileCopy還是只有一個Windows平台的實做—WindowsFileCopiler類別。

螢幕截圖 2016-02-12 12.09.34

***

AbstractFileCopiler在這個例子中有著Speculative Generality怪味道,翻成白話文就是「過度設計(over design)」。只好透過Collapse Hierarchy重構把它打回原形,既然只有一個平台的實做,實在不需要如此繁瑣的設計,直接把WindowsFileCopiler裡面的copy()函數的程式碼移到FileManipulate的crossPlatformCopy()函數即可。然後套用Rename Method把crossPlatformCopy()正名為copy(),最後套用Remove Parameter拿掉falg1與flag2這兩個用不到的參數。重構後的程式如下:

螢幕截圖 2016-02-12 12.22.38


***

友藏內心獨白:泡泡吹的太大有一天會變成泡沫。

沒有留言:

張貼留言