程序設(shè)計原則

開閉原則

  • 定義
    軟件實體應(yīng)當(dāng)對擴展開放,對修改關(guān)閉。
    當(dāng)應(yīng)用的需求改變時,在不修改軟件實體的源代碼或者二進(jìn)制代碼的前提下,可以擴展模塊的功能,使其滿足新的需求。
  • 作用
    降低對軟件測試的影響,只需要對擴展的代碼進(jìn)行測試即可。
    增強穩(wěn)定性和延續(xù)性,從而易于擴展和維護(hù)。
  • 舉例
    Glide內(nèi)置了一些解碼實現(xiàn),這些實現(xiàn)對外是不開放的;
    但是預(yù)留了各種接口,用戶可以通過注冊數(shù)據(jù)加載和解碼實現(xiàn),擴展所支持的解碼格式。

依賴倒置原則

  • 定義
    要面向接口編程,不要面向?qū)崿F(xiàn)編程。
    簡單的說就是要求對抽象進(jìn)行編程,不要對實現(xiàn)進(jìn)行編程。
  • 作用
    降低了客戶與實現(xiàn)模塊間的耦合。
    可以減少并行開發(fā)引起的風(fēng)險。
  • 舉例
  1. 工程劃分模塊化后,模塊之前相互調(diào)用的部分,如果接口來調(diào)用。
  2. 實現(xiàn)SDK時,一些功能(如圖片加載,網(wǎng)絡(luò)請求,日志等)通過預(yù)留接口給外部去注入實現(xiàn),而非直接依賴實現(xiàn)。
    比如需要加載圖片,可以定義ImageLoader接口,定義loadImage方法,而非引入某個圖片加載框架。

單一職責(zé)原則

  • 定義
    一個類應(yīng)該有且僅有一個引起它變化的原因,否則類應(yīng)該被拆分。
    如果一個對象承擔(dān)了太多的職責(zé),至少存在以下兩個缺點
    一個職責(zé)的變化可能會削弱或者抑制這個類實現(xiàn)其他職責(zé)的能力;
    當(dāng)客戶端需要該對象的某一個職責(zé)時,不得不將其他不需要的職責(zé)全都包含進(jìn)來,從而造成冗余代碼或代碼的浪費。
  • 作用
    降低類的復(fù)雜度。
    降低變更代碼所引起的風(fēng)險。
    提高類的可讀性。
    提高系統(tǒng)的可維護(hù)性。

接口隔離原則

  • 定義
    客戶端不應(yīng)該被迫依賴于它不使用的方法。一個類對另一個類的依賴應(yīng)該建立在最小的接口上。
    與單一職責(zé)原則的區(qū)別:
    單一職責(zé)原則注重的是職責(zé),而接口隔離原則注重的是對接口依賴的隔離。
    單一職責(zé)原則主要是約束類,它針對的是程序中的實現(xiàn)和細(xì)節(jié);接口隔離原則主要約束接口,主要針對抽象和程序整體框架的構(gòu)建。
  • 作用
    能減少項目工程中的代碼冗余。
    過大的大接口里面通常放置許多不用的方法,當(dāng)實現(xiàn)這個接口的時候,被迫設(shè)計冗余的代碼。
  • 舉例
    View的 OnClickListener 和 OnLongClickListener 等就是隔離的,不然開發(fā)者需要監(jiān)聽點擊事件還要同時實現(xiàn)各種其他事件的接口。

里氏替換原則

  • 定義
    繼承必須確?;愃鶕碛械男再|(zhì)在子類中仍然成立。
    子類可以擴展父類的功能,但不能改變父類原有的功能。
  • 作用
    是實現(xiàn)開閉原則的重要方式之一。
    克服了繼承中重寫父類造成的可復(fù)用性變差的缺點。
    類的擴展不會給已有的系統(tǒng)引入新的錯誤,降低了代碼出錯的可能性。
  • 舉例
    繼承一些已經(jīng)現(xiàn)成的View, 需保持原來View的邏輯。
    比如網(wǎng)上一些實現(xiàn)變色的TintXxxView的控件,其覆寫"setEnabled"等方法時,除了自己處理變色的邏輯之外,還會調(diào)用super.setEnabled()方法,因為要保持父類的處理。

迪米特法則 (最少知識原則)

  • 定義
    如果兩個軟件實體無須直接通信,那么就不應(yīng)當(dāng)發(fā)生直接的相互調(diào)用。
    如果其中的一個類需要調(diào)用另一個類的某一個方法的話,可以通過第三者轉(zhuǎn)發(fā)這個調(diào)用。
  • 作用
    降低了類之間的耦合度,提高了模塊的相對獨立性。
  • 舉例
    觀察者模式。

合成復(fù)用原則 (組合/聚合復(fù)用原則)

  • 定義
    在軟件復(fù)用時,要盡量先使用組合或者聚合等關(guān)聯(lián)關(guān)系來實現(xiàn),其次才考慮使用繼承關(guān)系來實現(xiàn)。
  • 作用
    維持了類的封裝性, 不需要知道所引用的類的實現(xiàn)細(xì)節(jié)。
    繼承是靜態(tài)復(fù)用,組合復(fù)用是動態(tài)復(fù)用,可動態(tài)地引用類型相同的對象。
  • 舉例:
    裝飾者模式。

總結(jié)

設(shè)計原則 歸納
開閉原則 對擴展開放,對修改關(guān)閉。
依賴倒置原則 要面向接口編程,不要面向?qū)崿F(xiàn)編程。
單一職責(zé)原則 一個類應(yīng)該有且僅有一個引起它變化的原因,否則類應(yīng)該被拆分。
接口隔離原則 一個類對另一個類的依賴應(yīng)該建立在最小的接口上。
里氏替換原則 繼承必須確?;愃鶕碛械男再|(zhì)在子類中仍然成立。
迪米特法則 如果兩個軟件實體無須直接通信,那么就不應(yīng)當(dāng)發(fā)生直接的相互調(diào)用。
合成復(fù)用原則 組合優(yōu)先于繼承。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容