潛魚在淵

          Concentrating on Architectures.

          posts - 77, comments - 309, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          代碼檢查(5)

          Posted on 2008-10-28 00:43 非魚 閱讀(2599) 評論(1)  編輯  收藏 所屬分類: 面向?qū)ο笤O(shè)計 、Java技術(shù)
          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è)計過的對象,有多少是封裝良好的?

          因為我們不知道封裝的根基,這是東方文化中缺乏的東西。大家都知道要封裝,但不知道封裝什么:

          • 封裝權(quán)屬。
          “讓上帝的歸給上帝,凱撒的歸給凱撒。”不要把狗尾巴裝到貓身上。當(dāng)然在實踐中總是不那么簡單的。在日常生活中,我們常常不知道誰有什么樣的權(quán)利,不知道某個東西屬于誰,不知道誰是管事的等等。長期處于這樣的環(huán)境中,使人習(xí)慣于一種莫愣兩可的態(tài)度。人都這樣了還怎么分的清楚權(quán)屬呢。但在設(shè)計之初記住這個還是有益的。
          • 封裝職責(zé)。
          這是上一個原則的推論。西方人常說的兩句話是:It's you business, not mine. None of your business. 西方人認(rèn)為你的是你的,我的是我的;中國人認(rèn)為你的是我的,我的還是我的。在我們設(shè)計的類中,常??梢娋同F(xiàn)象就是大雜燴,什么方法都丟到一個類里面處理了。
          • 封裝變化。
          這也是把不變的東西抽象出來的過程。變化無處不在以具有相對性,把相對不變和相對易變的東西分離開,這個過程是一個抽象的過程,也是對已封裝對象的解包和再封裝。顯然封裝變化是從時間的角度來考察對象,結(jié)合“軟件”的可變特性而來的。如果說封裝權(quán)屬和封裝職責(zé)在于尊重現(xiàn)實,那么封裝變化就是設(shè)計過程中真正體現(xiàn)價值的東西。前者意味著照貓畫虎,后者才見設(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。


          , , ,


          評論

          # re: 編碼問題(5)  回復(fù)  更多評論   

          2008-10-28 18:46 by 123
          不錯不錯。。。。
          主站蜘蛛池模板: 偃师市| 永吉县| 阳江市| 侯马市| 礼泉县| 徐州市| 屏南县| 罗山县| 南京市| 饶河县| 抚远县| 安西县| 勐海县| 峡江县| 大港区| 德昌县| 安丘市| 邢台县| 商南县| 海阳市| 富蕴县| 新密市| 左贡县| 芮城县| 兖州市| 英吉沙县| 三明市| 团风县| 牟定县| 青海省| 文安县| 铜陵市| 淮滨县| 资源县| 牟定县| 河南省| 黄浦区| 新泰市| 南京市| 江城| 原阳县|