l

2016年2月23日 星期二

用Encapsulate Collection移除Data Class怪味道

Feb. 09 18:40~19:25

螢幕截圖 2016-02-09 21.05.15

 

Data Class怪味道在〈談談壞味道(13):Data Class〉介紹過,故名思易就是只有資料沒有行為的類別。對付這個怪味道可以分成兩個層次,比較簡單的手段是確定Data Class裡面的資料成員是否有妥善的封裝。例如,如果有public資料成員則應該用getter、setter取代之;如果直接傳回collection則應該將其封裝成唯讀資料再傳出(今天要談的Encapsulate Collection);如果資料不能被修改則移除setter。更進一步的做法,看看使用這些資料的客戶端都是誰,有沒有辦法把使用端的函數移到Data Class身上,讓它擁有真正的行為。

▼今天介紹如何用Encapsulate Collection來移除這個怪味道,以下範例節錄自《Refactoring》。你有一個Person類別,它包含一個Course物件的集合,用來紀錄這個人修了哪些課。Person的getCourses()直接把集合往外傳,而setCourses()則是直接接受一個集合。這兩種做法都破壞了封裝,因為外部物件可以透過修改傳出/傳入的集合物件來改變Person的內部狀態。

螢幕截圖 2016-02-09 18.49.01

***

▼套用Encapsulate Collection修改Person類別,getCourses()傳回一個無法修改的集合,setCourses()改名成initializeCourses(),把傳入集合內的元素全部加入Person的資料成員_courses。

螢幕截圖 2016-02-09 19.24.03

***

平常在設計類別的時候相信大家都知道要封裝單一物件的資料成員,對於集合物件(collection)不少人則是直接傳出或傳入。Encapsulate Collection不僅對Data Class怪味道有用,在設計一般類別的時候也可以派上用場。

***

友藏內心獨白:資訊隱藏才可以偷天換日。

沒有留言:

張貼留言