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

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

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

    隨筆 - 81  文章 - 1033  trackbacks - 0
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    在浮躁的年代里,我們進取心太切,患得患失;虛榮心太強,戰戰兢兢。一心爭強好勝,惟恐榜上無名。
    I think I can fly , and flying like a bird !
    程序員一名,已售出,缺貨中!

    我的郵件聯系方式

    用且僅用于MSN

    博客點擊率
    free web counter
    free web counter

    常用鏈接

    留言簿(36)

    隨筆檔案

    搜索

    •  

    積分與排名

    • 積分 - 186918
    • 排名 - 308

    最新評論

    閱讀排行榜

    評論排行榜


          OO經過這么多年的錘煉和考驗證明是極好的,雖然也有些的人提出一些反面的意見,證明時代在發展、進步大家需要更先進的設計方法,不過OO終歸是目前應用最為廣泛也最為適用的程序設計方法學。個人覺得適用最為重要,畢竟OO是能夠很好解決大多數復雜系統設計的。不過同時OO也讓設計者陷入一個兩難的境地。一來容易設計過輕,也就是設計的不夠,發揮不了OO的強大和精妙之處,面向過程和面向對象的夾雜反而使得實現者摸不著頭腦非常痛苦(很多時候這里指的設計者和實現著會是同一個人);二來容易設計過度,讓OO從一個手中的工具變成了一塊腳下的石頭,讓實現者工作起來異常的不順利,覺得做了很多脫了褲子放屁的事情(請容許我的粗魯,因為我再也找不到比這個更好的比喻了)。

          要解決這些問題往往需要經驗的積累和技巧的總結,知道OO理論的人不少,真正在設計中運用的好的確實不多。當然OO設計中最最重要的一個部分就是繼承了,下面列舉一些常見的繼承設計技巧,讀過《Core Java》的人可能對它們非常熟悉,我結合我自己的理解做一些說明,也當作一個學習。當然不是記住了這些所謂的技巧就學會了繼承設計,總的來講設計是需要遵循一定規律、結合實際情況、發揮自己的經驗而做出的,還是需要自己多多總結和積累。

    1.  將公共操作和域放置在超類

          顯然這是繼承最基本的目的,減少編碼量,減少業務關注面。讓子類更多關注自己的業務實現,而公共的由共同的超類去操心。


    2.  不要使用受保護的域

          很多程序員其實都很喜歡“受保護的”(protected)這種作用域,特別是應用在域上,因為在這種作用域的作用下子類可以輕松的直接訪問超類中相應的域,可能也覺得這是理所當然的事情,因為既然在子類中繼承了這個域而不能直接使用它還需要使用super關鍵字來調用超類方法去訪問往往顯得很別扭和難看。但是protected機制會帶來很嚴重的安全問題,第一,因為子類集合是無限制的,任何人都可以由一個類派生出另外一個子類,并編寫代碼直接訪問protected的實例域,從而破壞封裝性;第二,在Java中同一個包中的所有類都可以訪問protected域,而不管它是否為這個類的子類。

          所以推薦在盡可能的情況下把域設置為私有,不允許外部直接訪問甚至修改。但其實很多初學者,包括一些編程老手都沒辦法理解和接受這種做法。我個人認為如果OO失去了封裝性就好比失去了靈魂的空殼,沒有了什么意義,反而變成累贅而已。


    3.  使用繼承實現is-a關系

          如果拋開所謂的設計思想來看,實現繼承最基本的目的就是節省代碼量,并且很容易就做到。但這樣往往很多人會濫用繼承,純粹為了節約代碼而節約代碼,而沒有顧及超類與子類的關系導致在實現其他相關問題的時候帶來很多麻煩,反而會多寫很多代碼,撿了芝麻丟了西瓜。

          繼承應該要遵循is-a關系,要判斷是否遵循了is-a關系也有個很簡單的辦法,就是你念出這么一句話:“子類”是個“超類”,看是否合理。例如有一個雇員(Employee)類繼承與人(Person),這個時候就有這樣的關系:雇員是個人,顯然是正確的。


    4.  除非所有繼承的方法都有意義,否則不要繼承

          當子類和超類之間遵循了is-a關系,但子類從超類繼承來的某些方法對于子類是沒有意義的,甚至是實現錯誤功能的,這個時候應該取消繼承關系,因為這相當的危險。或者可以選擇重新審視你的設計。


    5.  在覆蓋方法的時候,不要改變預期的行為

          結合上面4中的觀點,有些人可能會說這個很簡單,把意義不同的方法在子類中重寫,或者干脆什么也不做,也或者拋出一個異常不久解決了,so easy!其實這樣也是違背OO思想的,應該盡量保持覆蓋方法的預期行為,只可能因為各自的業務含義而改變實現方式,但是語義和行為是要保證的,就好像超類有個方法名字叫add是用來做加法的,但是你一定要極端的在子類中重寫了它,里面的代碼偷偷實現了一個減法,這種做法的危險我想很容易理解。為什么說是偷偷的,因為可能只有你知道這里是做了減法,或者說幾個星期后你自己都認為這個方法實現的是一個加法運算!


    6.  使用多態,而非類型信息

          很多時候需要判斷當前對象的類型來執行相應不同的方法,看下面的示例代碼:

    1 if(x is of type 1)
    2   action1(x);
    3 else if(x is of type 2)
    4   action2(x);

          這個時候應該去考慮action1和action2是不是表示同一個概念,如果是就應該使用多態性來處理。這個時候應該定義一個方法放置在這兩個類的超類或者接口中,然后就可以調用

    1 x.action();

          讓語言提供的多態性自己去找應該調用那個類的方法來實現。是不是像極了某種模式:)


    7.  不要過多的使用反射

          個人覺得Java擁有了反射機制簡直就是太強大了,在運行時能夠查看甚至修改、調用域和方法極大的提高了程序實現的靈活性和技巧性。以至于我甚至有一段時間把Java當作JavaScript來玩(愛死JavaScript的靈活性但同樣具有那么優秀的OO)。看看現在大多數流行不流行的開發框架都是基于Java這種強大的能力來實現的,它讓大家可以編寫更加通用的程序,也是為什么它在系統程序(包括一些框架、工具甚至服務器等)中使用這么廣泛并都作為核心技術;但是在編寫應用程序的過程中應該減少反射的使用,因為反射其實是很脆弱的,編譯器很難幫助大家發現程序中的錯誤,任何錯誤都到了運行時才被發現,并導致一些莫名其妙的異常。說起莫名其妙其實不是說反射功能不夠健壯或有問題,而是出現錯誤后很難跟蹤和排查,給開發和維護帶來很大困難。

          還有一點也很重要,反射比直接調用慢,這個要時刻記住。所以應該用接口來實現回調之類的功能而不是反射。




          其實這些只是繼承技巧的冰山一角而已,每個人在設計過程中都會總結出自己的經驗。

          總的來說我們應該用理論來指導實踐,而在實踐中總結出理論!
    posted on 2007-04-12 01:51 cresposhi 閱讀(2087) 評論(12)  編輯  收藏

    FeedBack:
    # re: Core Java之OO繼承設計技巧[未登錄] 2007-04-12 08:57 阿蜜果
    總結得不錯!  回復  更多評論
      
    # re: Core Java之OO繼承設計技巧 2007-04-12 10:18 BeanSoft
    兄弟改行做培訓吧....  回復  更多評論
      
    # re: Core Java之OO繼承設計技巧 2007-04-12 10:21 cresposhi
    我也有這種想法啊。。。
    我們來搞個業界領先的Java培訓機構列,呵呵  回復  更多評論
      
    # re: Core Java之OO繼承設計技巧 2007-04-12 10:23 劉甘泉
    繼承會造成基類的脆弱性,所以能不用繼承最好不用。。。  回復  更多評論
      
    # re: Core Java之OO繼承設計技巧 2007-04-12 10:30 cresposhi
    @劉甘泉
    不用繼承用接口嗎?我這里不單指Java中的概念
    請甘泉兄指教  回復  更多評論
      
    # re: Core Java之OO繼承設計技巧 2007-04-12 10:50 junglesong
    >>不要使用受保護的域?

    這句話應該改寫為"如果一個成員不是為了繼承而設計,不要使用protected而使用private".


    <<代碼大全2>>中的關于類質量的觀點也值得推薦:
    硬性規定:
    1.類層次不宜超過三層.
    2.類成員數量不宜超過7個,如果全是簡單數據類型最多9個,有其它類的話限制為5個,否則需要分解成更小的類.
    3.避免創建萬能類
    4.消除不必要的成員.
    5.消除無關精要的類.
    6.避免用動詞命名類.

    抽象:
    1.類是否有一個中心目的.
    2.類的命名是否表現了其中心目的.
    3.類的接口是否展現了一致的抽象.
    4.類的接口是否讓人明白了知道該如何使用它.
    5.類的接口是否足夠抽象,使使用者不必顧慮它是如何進行服務的.
    6.類提供的服務是否足夠完整,能讓其它類無須動用其內部數據.
    7.是否已經盡量分解.
    8.在修改類是是否維持了接口的完整性.

    封裝:
    1.是否把類成員的可訪問性降至最小.
    2.是否避免暴露類中的數據成員.
    3.類是否已經盡可能的對其它類隱藏了實現細節.
    4.類是否不依賴其它類,它是松耦合的嗎?

    http://junglesong.yculblog.com  回復  更多評論
      
    # re: Core Java之OO繼承設計技巧 2007-04-12 11:26 cresposhi
    @junglesong
    我覺得即使是為了繼承而設計,也不應該使用protected。原因是因為既然定義在超類中的域,它的訪問規則應該由超類來關心和處理,不應該授權給子類直接干涉,這樣既破壞了封裝性也不利于維護。
    特別是protected作用域還可以本包訪問,這樣就給了更多其他對象修改本類對象狀態的機會,相當危險。  回復  更多評論
      
    # re: Core Java之OO繼承設計技巧 2007-04-12 14:43 kirari_wxy
    模式應用有很多矛盾的地方,度的把握很難,不過四人幫的設計模式還是經典的。關于類庫的設計我個人比較欣賞只有樹葉才是實現類的做法,其他都是接口和抽象類,至少ocp是最基礎的一條。protected應該去掉。。  回復  更多評論
      
    # re: Core Java之OO繼承設計技巧 2007-04-12 22:59 軒朗=maninred
    《Core Java》中提到的OO設計思想并不多,更多的是對JDK中的API的示例。關于OO的設計思想建議你看看Robert C.Martin《敏捷軟件開發》,書中提到的OO設計原則是經過了多年業界OO實踐得到的。《Core Java》中的代碼用來練習重構手法還差不多。

    這篇文章開頭說到的OO過度設計和OO不足其實用K.Back的TDD就可以比較好的解決。  回復  更多評論
      
    # re: Core Java之OO繼承設計技巧 2007-04-13 12:41 cresposhi
    TDD?倒是一直都沒機會真正領略它的風采。。。  回復  更多評論
      
    # re: Core Java之OO繼承設計技巧 2007-04-13 12:43 cresposhi
    @軒朗=maninred
    《Core Java》確實不是一本專門講OO的書。。。只是看到作者總結的這么幾點自己的心得覺得比較通用和好用,所以拿來分析一把
    要真正了解OO設計方法確實要寫好幾本數。。。  回復  更多評論
      
    # re: Core Java之OO繼承設計技巧 2007-05-08 19:56 咖啡屋的鼠標
    個人認為抽象類才是為繼承而設計的,普通類不是。而能用接口的盡量還是不使用抽象類。
    >>>>>>
    最近發現TDD很容易造成設計欠賬,相對與過度設計,設計欠賬也是不好的。想要用好TDD還得修煉啊。  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 337p日本欧洲亚洲大胆色噜噜| 亚洲国产精品久久久久婷婷老年| 亚洲人成7777影视在线观看| 久久成人a毛片免费观看网站| 亚洲精品V欧洲精品V日韩精品| 国产黄在线观看免费观看不卡| 四虎在线播放免费永久视频 | 亚洲无砖砖区免费| 99国产精品视频免费观看| 婷婷亚洲久悠悠色悠在线播放| 国产精品免费观看调教网| 亚洲天堂久久精品| 午夜免费1000部| 亚洲精品午夜国产va久久| 97无码免费人妻超级碰碰碰碰| 99999久久久久久亚洲| 成年女人喷潮毛片免费播放| 亚洲人成色777777精品| 国产精品国产自线拍免费软件| 国产精品亚洲色婷婷99久久精品| 无码专区一va亚洲v专区在线| 四虎在线播放免费永久视频| 鲁啊鲁在线视频免费播放| 国产偷国产偷亚洲高清日韩| 亚洲精品无码成人片久久不卡| 国产成人免费永久播放视频平台 | 免费萌白酱国产一区二区| 美女羞羞喷液视频免费| 国产亚洲一区二区三区在线不卡| 日本道免费精品一区二区| 亚洲色欲www综合网| 热99re久久精品精品免费| 人碰人碰人成人免费视频| 亚洲成人在线网站| 色吊丝永久在线观看最新免费| 在线播放国产不卡免费视频| 亚洲黄色在线观看网站| 国产大片免费观看中文字幕| 成人精品一区二区三区不卡免费看| 亚洲国产成人久久99精品| 国产乱子影视频上线免费观看|