Samuel's Weblog

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            7 隨筆 :: 2 文章 :: 9 評(píng)論 :: 0 Trackbacks
          最近在審查(review)代碼時(shí),常常發(fā)現(xiàn)一大堆代碼充滿了各種bad smell.即使工作了三五年的同事,也不會(huì)例外.溝通時(shí)往往發(fā)現(xiàn)他們對(duì)OO的理解只是表現(xiàn)出簡(jiǎn)單的概念理解.對(duì)OO的一些原則不甚了解,或者寫代碼也是跟著感覺(jué)走.

          我最初做開(kāi)發(fā)的時(shí)候也是跟著感覺(jué)走,初次聽(tīng)到OCP如天外來(lái)物.使用Java或C#不代表你就是在做OO開(kāi)發(fā),熟練使用OO語(yǔ)言不代表已經(jīng)對(duì)OO非常了解.感謝Uncle Bob的經(jīng)典巨著<Agile Software Development>,堅(jiān)持閱讀的習(xí)慣讓我接觸并努力理解OO原則.一旦對(duì)這些原則有了深入的認(rèn)識(shí),寫代碼時(shí)就已經(jīng)從更高的角度來(lái)分析問(wèn)題,解決問(wèn)題,力爭(zhēng)寫出優(yōu)雅的代碼.

          我對(duì)OO的了解也不算多深刻,只在這里拋磚引玉.因?yàn)樵瓌t比較多,用一個(gè)系列來(lái)介紹會(huì)讓大家更容易溝通.

          同時(shí),原則是死的,人是活的,不要被這些原則束縛,有一些原則在特定的情況下才會(huì)有效.

          Single Choice Principle(SCP)
          所有的判斷只在一處進(jìn)行.違反此原則的典型情況是不同的方法中充斥著相同的if ... else ...或類似的語(yǔ)句.

          Linguistic Modular Units

          Few Interfaces

          Small Interfaces

          Explicit Interfaces

          Behavioral Completeness
          一個(gè)完整的類必須包含完整的方法.如果類沒(méi)有完成它的職責(zé),或者沒(méi)有完成其父類需要完成的工作,那么它就是不完整的類.

          Law Of Demeter
          只與直接協(xié)作的類交互.

          The Principle of Essential Representation(PER)
          類應(yīng)該包含而且只包含其本質(zhì)的定義和表現(xiàn),與SRP比較接近.

          Single Responsibility Principle(SRP)
          一個(gè)類只承擔(dān)一項(xiàng)職責(zé),只能有一個(gè)發(fā)生變化的理由,那就是它的職責(zé)變化了.

          Open-Colse Principle(OCP)
          類應(yīng)該對(duì)擴(kuò)展是開(kāi)放的,對(duì)修改是封閉的.

          Liskov Substitution (LSP)
          子類必須可以替換父類.

          Dependency-Inversion Principles(DIP)
          高層應(yīng)該不依賴于低層,雙方都應(yīng)該依賴于抽象.抽象不依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象.

          Interface Segregation Principles(ISP)
          接口屬于客戶程序.

          ---------------------------------
          Reuse Release Equivalence Principle(REP)
          重用的粒度等于發(fā)布的粒度.

          Common Reuse Principle(CRP)
          包中的類應(yīng)該是共同重用的.

          Common Closure Principle(CCP)
          包中的類對(duì)同一類變化共同封閉的,一個(gè)類發(fā)生變化,可能所有的類都要發(fā)生變化.

          ---------------------------------
          Acyclic Dependencies Principle(ADP)
          包之間的依賴結(jié)構(gòu)不應(yīng)該存在環(huán)依賴.

          Stable Dependencies Principle (SDP)
          包應(yīng)該依賴于比它更穩(wěn)定的包.

          Stable Abstractions Principle(SAP)
          包的穩(wěn)定程度與抽象程度成正比,越抽象的包越穩(wěn)定.

          ---------------------------------
          開(kāi)發(fā)時(shí)應(yīng)該避免的bad design smell:
          僵化(Rigidity) 一處變化會(huì)影響系統(tǒng)中的很多地方.
          脆弱(Fragility) 一處變化會(huì)影響系統(tǒng)中不應(yīng)該被影響的地方.
          牢固(Immobility) 很難被重用.

          還有一些原則可能被遺漏掉,如果你發(fā)現(xiàn)了,請(qǐng)及時(shí)提醒我.

           更多內(nèi)容在另一博客http://samuelray.javaeye.com.
          posted on 2008-03-14 09:55 SamuelRay 閱讀(1857) 評(píng)論(8)  編輯  收藏

          評(píng)論

          # re: OO 原則 2008-03-14 11:53 和風(fēng)細(xì)雨
          孫子兵法很多人都讀過(guò),可按教條行事就能成一個(gè)合格的將軍了嗎?  回復(fù)  更多評(píng)論
            

          # re: OO 原則 2008-03-14 12:42 dennis
          做code review的時(shí)候,你會(huì)發(fā)現(xiàn)原來(lái)這世界上大多數(shù)的“程序員”是在混日子,寫的代碼慘不忍睹。  回復(fù)  更多評(píng)論
            

          # re: OO 原則 2008-03-14 14:53 shoru
          讀讀也無(wú)妨啊,哪個(gè)將軍不讀孫子?  回復(fù)  更多評(píng)論
            

          # re: OO 原則 2008-03-16 08:52 卜清楚
          學(xué)孫子兵法不是背孫子兵法
          領(lǐng)悟了孫子兵法精髓的,甚至領(lǐng)悟一半的都是合格的將軍了。  回復(fù)  更多評(píng)論
            

          # re: OO 原則[未登錄](méi) 2008-03-16 11:32 paul
          1有些情況下知道這些原則,但是不徹底理解,所以也用不了
          2,有時(shí)運(yùn)用這些原則,會(huì)多寫很多代碼,在工期緊的情況下,實(shí)現(xiàn)功能第一位
          有時(shí)間可以重構(gòu)下  回復(fù)  更多評(píng)論
            

          # re: OO 原則 2008-03-17 10:39 hyx
          有時(shí)候不用那么教條  回復(fù)  更多評(píng)論
            

          # re: OO 原則 2008-03-17 12:16 legendsen
          OO固然好,值得發(fā)揚(yáng)和學(xué)習(xí),不過(guò)也不能凡事都OO,否則就是OOOO了,
          不能為了OO而OO。OO也是為了項(xiàng)目服務(wù)的。要想做得徹底,程序非常非
          常規(guī)范,還得要分公司分項(xiàng)目分領(lǐng)導(dǎo)啊...
            回復(fù)  更多評(píng)論
            

          # re: OO 原則 2008-03-18 21:27 咖啡屋的鼠標(biāo)
          總感覺(jué)這里面有些原則是告訴我們應(yīng)該做什么,而有些只是說(shuō)了做好了應(yīng)該是什么樣。  回復(fù)  更多評(píng)論
            


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 武山县| 潮安县| 长沙市| 泉州市| 凌云县| 讷河市| 邹平县| 刚察县| 定边县| 阳山县| 巩义市| 明光市| 承德县| 施秉县| 铅山县| 黑山县| 彭阳县| 舞钢市| 观塘区| 雷山县| 鸡泽县| 聊城市| 台东市| 镇赉县| 安多县| 涿鹿县| 渑池县| 儋州市| 东城区| 明星| 金坛市| 星子县| 梁山县| 平和县| 抚远县| 东海县| 云和县| 双江| 龙陵县| 泰兴市| 玉田县|