日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

面向对象五个基本原则

發(fā)布時(shí)間:2024/1/18 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面向对象五个基本原则 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

軟件開發(fā)中需要知道基本概念,由羅伯特·C·馬丁(Robert C. Martin)于《敏捷軟件開發(fā):原則、模式和實(shí)踐》一書中給出的。在此記錄。

目錄

一.單一職責(zé)原則

二.開放封閉原則

三.?里氏替換原則

四.接口分離原則

五.依賴倒置原則



一.單一職責(zé)原則

一個(gè)類,只有一個(gè)引起它變化的原因。應(yīng)該只有一個(gè)職責(zé)。每一個(gè)職責(zé)都是變化的一個(gè)軸線,如果一個(gè)類有一個(gè)以上的職責(zé),這些職責(zé)就耦合在了一起。這會(huì)導(dǎo)致脆弱的設(shè)計(jì)。當(dāng)一個(gè)職責(zé)發(fā)生變化時(shí),可能會(huì)影響其它的職責(zé)。另外,多個(gè)職責(zé)耦合在一起,會(huì)影響復(fù)用性。

如果一個(gè)類承擔(dān)的職責(zé)過多,就等于把這些職責(zé)耦合在一起了。一個(gè)職責(zé)的變化可能會(huì)削弱或者抑制這個(gè)類完成其他職責(zé)的能力。這種耦合會(huì)導(dǎo)致脆弱的設(shè)計(jì),當(dāng)發(fā)生變化時(shí),設(shè)計(jì)會(huì)遭受到意想不到的破壞。而如果想要避免這種現(xiàn)象的發(fā)生,就要盡可能的遵守單一職責(zé)原則。此原則的核心就是解耦和增強(qiáng)內(nèi)聚性。

問題理解

T負(fù)責(zé)兩個(gè)不同的職責(zé):職責(zé)P1,職責(zé)P2。當(dāng)由于職責(zé)P1需求發(fā)生改變而需要修改類T時(shí),有可能會(huì)導(dǎo)致原本運(yùn)行正常的職責(zé)P2功能發(fā)生故障。也就是說職責(zé)P1和P2被耦合在了一起。

解決辦法

遵守單一職責(zé)原則,將不同的職責(zé)封裝到不同的類或模塊中。

二.開放封閉原則

關(guān)于開放封閉原則,其核心的思想是:

軟件實(shí)體應(yīng)該是可擴(kuò)展,而不可修改的。也就是說,對(duì)擴(kuò)展是開放的,而對(duì)修改是封閉的。

因此,開放封閉原則主要體現(xiàn)在兩個(gè)方面:

對(duì)擴(kuò)展開放,意味著有新的需求或變化時(shí),可以對(duì)現(xiàn)有代碼進(jìn)行擴(kuò)展,以適應(yīng)新的情況。

對(duì)修改封閉,意味著類一旦設(shè)計(jì)完成,就可以獨(dú)立完成其工作,而不要對(duì)類進(jìn)行任何修改。

“需求總是變化”、“世界上沒有一個(gè)軟件是不變的”,這些言論是對(duì)軟件需求最經(jīng)典的表白。從中透射出一個(gè)關(guān)鍵的意思就是,對(duì)于軟件設(shè)計(jì)者來說,必須在不需要對(duì)原有的系統(tǒng)進(jìn)行修改的情況下,實(shí)現(xiàn)靈活的系統(tǒng)擴(kuò)展。而如何能做到這一點(diǎn)呢?

只有依賴于抽象。實(shí)現(xiàn)開放封閉的核心思想就是對(duì)抽象編程,而不對(duì)具體編程,因?yàn)槌橄笙鄬?duì)穩(wěn)定。讓類依賴于固定的抽象,所以對(duì)修改就是封閉的;而通過面向?qū)ο蟮睦^承和對(duì)多態(tài)機(jī)制,可以實(shí)現(xiàn)對(duì)抽象體的繼承,通過覆寫其方法來改變固有行為,實(shí)現(xiàn)新的擴(kuò)展方法,所以對(duì)于擴(kuò)展就是開放的。這是實(shí)施開放封閉原則的基本思路,同時(shí)這種機(jī)制是建立在兩個(gè)基本的設(shè)計(jì)原則的基礎(chǔ)上,這就是Liskov替換原則和合成/聚合復(fù)用原則。

三.?里氏替換原則

里氏替換原則(Liskov Substitution Principle LSP)面向?qū)ο笤O(shè)計(jì)的基本原則之一。 里氏替換原則中說,任何基類可以出現(xiàn)的地方,子類一定可以出現(xiàn)。 LSP是繼承復(fù)用的基石,只有當(dāng)衍生類可以替換掉基類,軟件單位的功能不受到影響時(shí),基類才能真正被復(fù)用,而衍生類也能夠在基類的基礎(chǔ)上增加新的行為。

  • 子類必須實(shí)現(xiàn)父類的抽象方法,但不得重寫(覆蓋)父類的非抽象(已實(shí)現(xiàn))方法。
  • 子類中可以增加自己特有的方法。
  • 當(dāng)子類覆蓋或?qū)崿F(xiàn)父類的方法時(shí),方法的前置條件(即方法的形參)要比父類方法的輸入?yún)?shù)更寬松。
  • 當(dāng)子類的方法實(shí)現(xiàn)父類的抽象方法時(shí),方法的后置條件(即方法的返回值)要比父類更嚴(yán)格。

四.接口分離原則

接口分離原則指在設(shè)計(jì)時(shí)采用多個(gè)與特定客戶類有關(guān)的接口比采用一個(gè)通用的接口要好。即,一個(gè)類要給多個(gè)客戶使用,那么可以為每個(gè)客戶創(chuàng)建一個(gè)接口,然后這個(gè)類實(shí)現(xiàn)所有的接口;而不要只創(chuàng)建一個(gè)接口,其中包含所有客戶類需要的方法,然后這個(gè)類實(shí)現(xiàn)這個(gè)接口。

如果不使用接口分離:

?如果Client A類需要改變所使用的Service接口中的方法,那么不但要改動(dòng)Service接口和ServiceImp類,還要對(duì)ClientB類和ClientC類重新編譯。

五.依賴倒置原則

依賴倒置原則(Dependence Inversion Principle)是程序要依賴于抽象接口,不要依賴于具體實(shí)現(xiàn)。簡單的說就是要求對(duì)抽象進(jìn)行編程,不要對(duì)實(shí)現(xiàn)進(jìn)行編程,這樣就降低了客戶與實(shí)現(xiàn)模塊間的耦合。

面向過程的開發(fā),上層調(diào)用下層,上層依賴于下層,當(dāng)下層劇烈變動(dòng)時(shí)上層也要跟著變動(dòng),這就會(huì)導(dǎo)致模塊的復(fù)用性降低而且大大提高了開發(fā)的成本。

面向?qū)ο蟮拈_發(fā)很好的解決了這個(gè)問題,一般情況下抽象的變化概率很小,讓用戶程序依賴于抽象,實(shí)現(xiàn)的細(xì)節(jié)也依賴于抽象。即使實(shí)現(xiàn)細(xì)節(jié)不斷變動(dòng),只要抽象不變,客戶程序就不需要變化。這大大降低了客戶程序與實(shí)現(xiàn)細(xì)節(jié)的耦合度。

百度上有一個(gè)代碼示例:例子

總結(jié)

以上是生活随笔為你收集整理的面向对象五个基本原则的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。