<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    潛魚在淵

    Concentrating on Architectures.

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

    代碼檢查(2)

    Posted on 2008-10-25 13:55 非魚 閱讀(2377) 評論(6)  編輯  收藏 所屬分類: 面向對象設計Java技術
    2. instanceof檢查鏈

    這個問題是連續使用if ... else + instanceof檢查來判斷一個對象的類型,并采取不同的處理邏輯。示例代碼如下:

    public void method(Fruit fruit) {
      if (fruit instanceof Apple) {
        ...
      }
      else if (fruit instanceof Orange) {
        ...
      }
      else if .....
    }

    這不是面向對象的方法,完全沒有利用到多態的面向對象特性。我相信一個合格的程序員是不會寫出這樣的編碼的,這一般是新手程序員,特別是對面向對象理解不深刻的程序員會犯的毛病。改正的方法就是在Fruit類中增加一個方法,并在Apple、Orange等子類中實現此方法:

    public abstract class Fruit {
      public int m();
    }

    當然,在環境允許的情況下,盡可能使用protected而不是public來定義這個方法。

    現在我們來看一個復雜一點的,同樣還是instanceof檢查的問題,但這個檢查只涉及了Fruit諸多子類中的一部分,而其他的子類,行為是一致的。這時候我們需要在Fruit中引入一致行為的實現:

    public abstract class Fruit {
      public int m() {
        //一般的實現。
        ...
      }
    }

    而更加復雜的行為需要對應復雜的設計,通過對具體水果的抽象,可以發現這些水果可以抽象為幾個較為一般的類:

    public abstract class Fruit {
      public int m(){
        ...
      }
    }

    public class TypeAFruit extends Fruit {
      public int m(){
        //特定類型的實現。
      }
    }

    public class TypeBFruit extends Fruit {
      public int m(){
        // 特定類型的實現。
      }
    }

    ...

    關于類的繼承層次的問題,有一種說法是“原則上”控制在一定的數量之內。一般來說 這個說法是有道理的(特別是對初學者,它可以有效的避免“濫繼承”),但不是放之四海皆準的道理,不要把它教條化。

    說到繼承層次,不得不提到抽象層次。我們總是在一定的抽象層次上解決問題,抽象層次決定了你解決問題的實現的復雜程度。設計以簡潔為美,不要把設計復雜化。但簡潔并不意味著“少”,簡潔的真正涵義是:模型不比模型所表達的事物更加復雜,不要把“本來簡單”的東西復雜化,也不要把本來復雜的東西簡單化。

    我所要表達的是,設計應該是簡潔的,但不是“簡單”的。“設計應該簡單”的說法,是來自翻譯的問題,還是來自理解的問題?簡單會導向“偷工減料”,而簡潔則要求不要在設計中加料(特別是廢料)。

    一個繼承結構有多少層才是合適的?最上層的類或接口對應著“一般概念”,最下層的類一定可以實例化為具體的對象,這中間有多少“層”,就有多少抽象層次。決定抽象層次,也就是決定你的繼承層次的原則有二:

    • 客戶代碼的需要:客戶代碼是指調用你的類繼承層次中的某些類的代碼,客戶代碼需要知道某個層次的細節。此外需要注意的是,客戶代碼應該盡量使用最上層的“一般概念”。
    • 重用的需要:在具體的不同類中存在相同代碼的時候,就要考慮有沒有可能進行抽象,形成一個用于重用目的的父類。
    類繼承層次的設計也不是一成不變的,按照上面這兩個原則,當客戶代碼不再需要某個層次時,或者當重用代碼不可能(一般標志就是大量的override)時,就要考慮改變繼承體系的設計。


    汗,感覺后面有點越扯越遠了。。。


    , ,


    評論

    # re: 編碼問題(2)  回復  更多評論   

    2008-10-25 18:07 by eng?
    為什么java程序難以維護,就是你們這些所謂的“合格程序員”寫的程序

    # re: 編碼問題(2)[未登錄]  回復  更多評論   

    2008-10-25 22:54 by Matthew
    樓上寫的不知啥意思,樓主講得很好啊,要可擴展又能應對實際項目的需要。

    # re: 編碼問題(2)  回復  更多評論   

    2008-10-26 00:39 by 非魚
    @Matthew
    兄弟沒有看懂樓上的話?我非常同意他的結論,我和比我在先的大量程序員們,不知道以前寫出了多少爛程序,一路踩著大量的項目的尸體,才能變得聰明一點。但合格的程序員有不少,其中又有多少人是合格的老師或者說引導者呢?于是雖然從事這個職業的人越來越多,寫出來的代碼質量卻未見提高。能夠給你帶來益處我當然高興;我卻仍然為自己知道的遲而感到遺憾。使后來者感到無助是我們這些先行者的錯,他們可能會因此而走向極端,而我們要做的,不是把他們劃到圈子之外。

    # re: 編碼問題(2)  回復  更多評論   

    2008-10-26 12:49 by 隔葉黃鶯
    能把本來復雜的東西簡單化

    若不失完整的表達了需求何樂而不為

    # re: 編碼問題(2)  回復  更多評論   

    2008-10-27 23:28 by 非魚
    @隔葉黃鶯
    能把本來復雜的東西簡單化,就是舍棄一些不重要的細節,實際就是“抽象”了。如果抽象可以滿足需求自然可以;否則必然要求在較低的抽象層次上建模。

    # re: 編碼問題(2)  回復  更多評論   

    2008-10-28 17:15 by flybean
    頂樓的說法有些欠妥。不僅僅是JAVA代碼難維護的問題。

    非魚所舉的例子,如果能來源于實際項目,效果會好一些。畢竟水果的這個例子不痛不癢。
    主站蜘蛛池模板: 免费v片在线观看品善网| 无码精品A∨在线观看免费| 特级淫片国产免费高清视频| 亚洲人成黄网在线观看| 桃子视频在线观看高清免费完整 | 久久久久久毛片免费看| 免费又黄又爽又猛的毛片| 最新亚洲人成网站在线观看| 成人永久免费福利视频网站| 怡红院亚洲红怡院在线观看| 国产三级电影免费观看| 一级做a爰片性色毛片免费网站| 亚洲精品人成无码中文毛片| 中国一级毛片免费看视频| 人人狠狠综合久久亚洲88| 100部毛片免费全部播放完整| 亚洲六月丁香六月婷婷色伊人| 成人免费无码大片a毛片软件| 国产大陆亚洲精品国产| 久久久青草青青国产亚洲免观 | 免费91麻豆精品国产自产在线观看 | 免费下载成人电影| 亚洲精品无码你懂的| 亚洲一级片内射网站在线观看| a色毛片免费视频| 亚洲a级成人片在线观看| 午夜时刻免费入口| CAOPORM国产精品视频免费| 亚洲gv猛男gv无码男同短文| 希望影院高清免费观看视频| 妇女自拍偷自拍亚洲精品| 亚洲日韩欧洲无码av夜夜摸| 最近免费2019中文字幕大全| 亚洲精品国产suv一区88| 国产午夜亚洲不卡| 免费看成人AA片无码视频羞羞网| 美国免费高清一级毛片| 亚洲人成在线播放网站岛国| 日本免费高清一本视频| 久久精品成人免费观看| 亚洲av无码成人精品国产|