更新時(shí)間:2020-10-15 17:24:13 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1168次
眾所周知,Java是一門面向?qū)ο笳Z(yǔ)言。而所謂面向?qū)ο?,是一種軟件開(kāi)發(fā)方法。面向?qū)ο蟮母拍詈蛻?yīng)用已超越了程序設(shè)計(jì)和軟件開(kāi)發(fā),擴(kuò)展到如數(shù)據(jù)庫(kù)系統(tǒng)、交互式界面、應(yīng)用結(jié)構(gòu)、應(yīng)用平臺(tái)、分布式系統(tǒng)、網(wǎng)絡(luò)管理結(jié)構(gòu)、CAD技術(shù)、人工智能等領(lǐng)域。隨著,面向?qū)γ娴念I(lǐng)域不斷擴(kuò)展,面向?qū)ο笤O(shè)計(jì)原則也不斷規(guī)范,本文就和大家分享10個(gè)面向?qū)ο笤O(shè)計(jì)原則。
1:DRY(Don't repeat yourself)
即不要寫重復(fù)的代碼,而是用“abstraction”類來(lái)抽象公有的東西。如果你需要多次用到一個(gè)硬編碼值,那么可以設(shè)為公共常量;如果你要在兩個(gè)以上的地方使用一個(gè)代碼塊,那么可以將它設(shè)為一個(gè)獨(dú)立的方法。SOLID設(shè)計(jì)原則注意,不要濫用,duplicate 不是針對(duì)代碼,而是針對(duì)功能。這意味著,即使用公共代碼來(lái)驗(yàn)證OrderID和SSN,二者也不會(huì)是相同的。使用公共代碼來(lái)實(shí)現(xiàn)兩個(gè)不同的功能,其實(shí)就是近似地把這兩個(gè)功能永遠(yuǎn)捆綁到了一起,如果OrderID改變了其格式,SSN驗(yàn)證代碼也會(huì)中斷。因此要慎用這種組合,不要隨意捆綁類似但不相關(guān)的功能。
2.封裝變化
在軟件領(lǐng)域中唯一不變的就是“Change”,因此封裝你認(rèn)為或猜測(cè)未來(lái)將發(fā)生變化的代碼。OOPS設(shè)計(jì)模式的優(yōu)點(diǎn)在于易于測(cè)試和維護(hù)封裝的代碼。如果你使用Java編碼,可以默認(rèn)私有化變量和方法,并逐步增加訪問(wèn)權(quán)限,比如從private到protected和not public。有幾種Java設(shè)計(jì)模式也使用封裝,比如Factory設(shè)計(jì)模式是封裝“對(duì)象創(chuàng)建”,其靈活性使得之后引進(jìn)新代碼不會(huì)對(duì)現(xiàn)有的代碼造成影響。
3.開(kāi)閉原則
即對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。這是另一種非常棒的設(shè)計(jì)原則,可以防止其他人更改已經(jīng)測(cè)試好的代碼。理論上,可以在不修改原有的模塊的基礎(chǔ)上,擴(kuò)展功能。這也是開(kāi)閉原則的宗旨。
4.單一職責(zé)原
類被修改的幾率很大,因此應(yīng)該專注于單一的功能。如果你把多個(gè)功能放在同一個(gè)類中,功能之間就形成了關(guān)聯(lián),改變其中一個(gè)功能,有可能中止另一個(gè)功能,這時(shí)就需要新一輪的測(cè)試來(lái)避免可能出現(xiàn)的問(wèn)題。
5.依賴注入或倒置原則
這個(gè)設(shè)計(jì)原則的亮點(diǎn)在于任何被DI框架注入的類很容易用mock對(duì)象進(jìn)行測(cè)試和維護(hù),因?yàn)閷?duì)象創(chuàng)建代碼集中在框架中,客戶端代碼也不混亂。有很多方式可以實(shí)現(xiàn)依賴倒置,比如像AspectJ等的AOP(Aspect Oriented programming)框架使用的字節(jié)碼技術(shù),或Spring框架使用的代理等。
6.優(yōu)先利用組合而非繼承
如果可能的話,優(yōu)先利用組合而不是繼承。一些人可能會(huì)質(zhì)疑,但我發(fā)現(xiàn),組合比繼承靈活得多。組合允許在運(yùn)行期間通過(guò)設(shè)置類的屬性來(lái)改變類的行為,也可以通過(guò)使用接口來(lái)組合一個(gè)類,它提供了更高的靈活性,并可以隨時(shí)實(shí)現(xiàn)。
7.里氏代換原則(LSP)
根據(jù)該原則,子類必須能夠替換掉它們的基類,也就是說(shuō)使用基類的方法或函數(shù)能夠順利地引用子類對(duì)象。LSP原則與單一職責(zé)原則和接口分離原則密切相關(guān),如果一個(gè)類比子類具備更多功能,很有可能某些功能會(huì)失效,這就違反了LSP原則。為了遵循該設(shè)計(jì)原則,派生類或子類必須增強(qiáng)功能。
8.接口分離原則
采用多個(gè)與特定客戶類有關(guān)的接口比采用一個(gè)通用的涵蓋多個(gè)業(yè)務(wù)方法的接口要好。設(shè)計(jì)接口很棘手,因?yàn)橐坏┽尫沤涌?,你就無(wú)法在不中斷執(zhí)行的情況下改變它。在Java中,該原則的另一個(gè)優(yōu)勢(shì)在于,在任何類使用接口之前,接口不利于實(shí)現(xiàn)所有的方法,所以單一的功能意味著更少的實(shí)現(xiàn)方法。
9.針對(duì)接口編程,而不是針對(duì)實(shí)現(xiàn)編程
該原則可以使代碼更加靈活,以便可以在任何接口實(shí)現(xiàn)中使用。因此,在Java中最好使用變量接口類型、方法返回類型、方法參數(shù)類型等?!禘ffective Java》 和《head first design pattern》書(shū)中也有提到。
10.委托原則
該原則最典型的例子是Java中的equals() 和 hashCode() 方法。為了平等地比較兩個(gè)對(duì)象,我們用類本身而不是客戶端類來(lái)做比較。這個(gè)設(shè)計(jì)原則的好處是沒(méi)有重復(fù)的代碼,而且很容易對(duì)其進(jìn)行修改。
希望這10大面向?qū)ο笤O(shè)計(jì)原則能幫助你寫出更靈活規(guī)范的代碼,編譯出更加優(yōu)秀的程序。當(dāng)然,我們也不能止于理論,畢竟實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn),需要我們?cè)诓粩嗟木幊讨袑W(xué)習(xí)進(jìn)步!此外,我不得不向大家強(qiáng)烈推薦本站的Java基礎(chǔ)教程,對(duì)于渴望學(xué)習(xí)Java基礎(chǔ)的小伙伴來(lái)說(shuō)無(wú)疑是雪中送炭,助你早日學(xué)有所成,成為一名Java大神!
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)