5. Feature Envy
Feature Envy,按照Martin Fowler的定義是:函數對某個class的興趣高過對自己所處之host class的興趣。通常的代碼檢查工具會根據一個類中的方法調用另一個類中方法的次數來判斷是否存在Feature Envy。
遺憾的是這個定義是含糊的。Feature Envy做為一種代碼現象,如果不能精確的描述和界定其害處,就不能指導我們如何正確處理它,因此我們需要定義什么是有害的Feature Envy。
定義一個有害的Feature Envy,必須從封裝說起。
封裝是面向對象最根本的原則,泛泛的定義是“把數據和對數據的操作丟到一起就是封裝”。這對實踐毫無益處,每個人都可以很容易的理解這句話,但仔細想想,過往設計過的對象,有多少是封裝良好的?
因為我們不知道封裝的根基,這是東方文化中缺乏的東西。大家都知道要封裝,但不知道封裝什么:
而所謂“代理”,基本上就是封裝職責(甚至封裝權屬,比較少見)和封裝變化的結合。
現在我們可以定義一個有害的Feature Envy了:在非代理情況下,對象權屬的屬性或數據、職責在另外一個對象中,并且被這個對象頻繁調用,從而破壞了封裝的情形。
借助于代碼檢查工具,我們可以輕易的找出類之間頻繁調用的方法;考慮上述定義,我們可以在恰當的時機進行重構,消除有害的Feature Envy。
Feature Envy,按照Martin Fowler的定義是:函數對某個class的興趣高過對自己所處之host class的興趣。通常的代碼檢查工具會根據一個類中的方法調用另一個類中方法的次數來判斷是否存在Feature Envy。
遺憾的是這個定義是含糊的。Feature Envy做為一種代碼現象,如果不能精確的描述和界定其害處,就不能指導我們如何正確處理它,因此我們需要定義什么是有害的Feature Envy。
定義一個有害的Feature Envy,必須從封裝說起。
封裝是面向對象最根本的原則,泛泛的定義是“把數據和對數據的操作丟到一起就是封裝”。這對實踐毫無益處,每個人都可以很容易的理解這句話,但仔細想想,過往設計過的對象,有多少是封裝良好的?
因為我們不知道封裝的根基,這是東方文化中缺乏的東西。大家都知道要封裝,但不知道封裝什么:
- 封裝權屬。
- 封裝職責。
- 封裝變化。
而所謂“代理”,基本上就是封裝職責(甚至封裝權屬,比較少見)和封裝變化的結合。
現在我們可以定義一個有害的Feature Envy了:在非代理情況下,對象權屬的屬性或數據、職責在另外一個對象中,并且被這個對象頻繁調用,從而破壞了封裝的情形。
借助于代碼檢查工具,我們可以輕易的找出類之間頻繁調用的方法;考慮上述定義,我們可以在恰當的時機進行重構,消除有害的Feature Envy。