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