Posted on 2008-10-28 00:43
非魚(yú) 閱讀(2597)
評(píng)論(1) 編輯 收藏 所屬分類(lèi):
面向?qū)ο笤O(shè)計(jì) 、
Java技術(shù)
5. Feature Envy
Feature Envy,按照Martin Fowler的定義是:
函數(shù)對(duì)某個(gè)class的興趣高過(guò)對(duì)自己所處之host class的興趣。通常的代碼檢查工具會(huì)根據(jù)一個(gè)類(lèi)中的方法調(diào)用另一個(gè)類(lèi)中方法的次數(shù)來(lái)判斷是否存在Feature Envy。
遺憾的是這個(gè)定義是含糊的。Feature Envy做為一種代碼現(xiàn)象,如果不能精確的描述和界定其害處,就不能指導(dǎo)我們?nèi)绾握_處理它,因此我們需要定義什么是有害的Feature Envy。
定義一個(gè)有害的Feature Envy,必須從封裝說(shuō)起。
封裝是面向?qū)ο笞罡镜脑瓌t,泛泛的定義是“把數(shù)據(jù)和對(duì)數(shù)據(jù)的操作丟到一起就是封裝”。這對(duì)實(shí)踐毫無(wú)益處,每個(gè)人都可以很容易的理解這句話,但仔細(xì)想想,過(guò)往設(shè)計(jì)過(guò)的對(duì)象,有多少是封裝良好的?
因?yàn)槲覀儾恢婪庋b的根基,這是東方文化中缺乏的東西。大家都知道要封裝,但不知道封裝什么:
“讓上帝的歸給上帝,凱撒的歸給凱撒。”不要把狗尾巴裝到貓身上。當(dāng)然在實(shí)踐中總是不那么簡(jiǎn)單的。在日常生活中,我們常常不知道誰(shuí)有什么樣的權(quán)利,不知道某個(gè)東西屬于誰(shuí),不知道誰(shuí)是管事的等等。長(zhǎng)期處于這樣的環(huán)境中,使人習(xí)慣于一種莫愣兩可的態(tài)度。人都這樣了還怎么分的清楚權(quán)屬呢。但在設(shè)計(jì)之初記住這個(gè)還是有益的。
這是上一個(gè)原則的推論。西方人常說(shuō)的兩句話是:It's you business, not mine. None of your business. 西方人認(rèn)為你的是你的,我的是我的;中國(guó)人認(rèn)為你的是我的,我的還是我的。在我們?cè)O(shè)計(jì)的類(lèi)中,常常可見(jiàn)就現(xiàn)象就是大雜燴,什么方法都丟到一個(gè)類(lèi)里面處理了。
這也是把不變的東西抽象出來(lái)的過(guò)程。變化無(wú)處不在以具有相對(duì)性,把相對(duì)不變和相對(duì)易變的東西分離開(kāi),這個(gè)過(guò)程是一個(gè)抽象的過(guò)程,也是對(duì)已封裝對(duì)象的解包和再封裝。顯然封裝變化是從時(shí)間的角度來(lái)考察對(duì)象,結(jié)合“軟件”的可變特性而來(lái)的。如果說(shuō)封裝權(quán)屬和封裝職責(zé)在于尊重現(xiàn)實(shí),那么封裝變化就是設(shè)計(jì)過(guò)程中真正體現(xiàn)價(jià)值的東西。前者意味著照貓畫(huà)虎,后者才見(jiàn)設(shè)計(jì)者的功力。
而所謂“代理”,基本上就是封裝職責(zé)(甚至封裝權(quán)屬,比較少見(jiàn))和封裝變化的結(jié)合。
現(xiàn)在我們可以定義一個(gè)有害的Feature Envy了:在非代理情況下,對(duì)象權(quán)屬的屬性或數(shù)據(jù)、職責(zé)在另外一個(gè)對(duì)象中,并且被這個(gè)對(duì)象頻繁調(diào)用,從而破壞了封裝的情形。
借助于代碼檢查工具,我們可以輕易的找出類(lèi)之間頻繁調(diào)用的方法;考慮上述定義,我們可以在恰當(dāng)?shù)臅r(shí)機(jī)進(jìn)行重構(gòu),消除有害的Feature Envy。
feature envy, encapsulation, responsibility, refactor