l

2016年2月24日 星期三

用Move Method和Encapsulate Field移除Data Class怪味道

Feb. 09 20:30~20:51

螢幕截圖 2016-02-09 19.37.42

▲封裝中

 

▼Monitor類別有一個isCritical()函數用來監控硬體設備的狀況,Monitor包含一個Sensor物件,透過它來讀取實際硬體設備的數據。

螢幕截圖 2016-02-09 20.33.53

螢幕截圖 2016-02-09 20.34.00

 

由上面程式可以看得出來Sensor句有典型Data Class怪味道,它的資料成員都是public,而且沒有任何行為。我們發現其實Sensor可以自己判斷自己的狀態,所以首先套用Move Method把isCritical()的邏輯移到Sensor身上,然後再套用Encapsulate Field封裝Sensor的資料成員。

▼重構後的Sensor如下:

螢幕截圖 2016-02-09 20.41.47

 

▼isCritical()的判斷邏輯移到Sensor身上之後,Monitor的isCritical()直需要直接呼叫Sensor的isCritical()即可。

螢幕截圖 2016-02-09 20.46.26

***

友藏內心獨白:重構之後Monitor好像變成Data Class。

2 則留言:

  1. 現今的Entity Framework, 不就是用public class做成Data Class(POCO)
    那Data Class為何是怪味道?

    回覆刪除
  2. 你可以參考 http://www.martinfowler.com/bliki/AnemicDomainModel.html 這篇。

    回覆刪除