<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          6大設(shè)計(jì)原則解讀

          共 3069字,需瀏覽 7分鐘

           ·

          2021-06-13 18:15

          點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”

          優(yōu)質(zhì)文章,第一時(shí)間送達(dá)

          起因:團(tuán)隊(duì)依次分享講到 SOLID,雖然能知道大概,但是要比較準(zhǔn)確地說出各個(gè)設(shè)計(jì)原則還是有很大的困難。因此,有了這篇文章。

          SRP(Single Responsibility Priciple)

          There should never be more than one reason for a class to change

          有且僅有一個(gè)原因引起類的改變

          最典型的例子,就是我們會(huì)創(chuàng)建用戶,除了設(shè)置用戶的基本屬性還包括對用戶的增刪查改。顯然,用戶的基本屬性和增刪查改應(yīng)該分離開來。

          單一職責(zé)只用于接口、類、同時(shí)也適用于方法。

          好處

          1. 類的復(fù)雜度降低

          2. 可讀性和可維護(hù)性提供

          3. 變更引起的風(fēng)險(xiǎn)降低。

          難點(diǎn):

          用 “職責(zé)”或“變化原因”來衡量接口或類的設(shè)計(jì)是否有利,但是“職責(zé)”和“變化原因”不可度量,因項(xiàng)目而已,因理解方式而異。

          建議:

          接口一定要做到單一職責(zé),類的設(shè)計(jì)盡量做到只有一個(gè)原因引起變化。生搬硬套單一職責(zé)會(huì)引起類的劇增,而且給維護(hù)帶來非常多的麻煩,過于細(xì)分的職責(zé)會(huì)增加系統(tǒng)的復(fù)雜度。本來一個(gè)類可以實(shí)現(xiàn)的行為硬要拆分成兩個(gè)類,然后通過組合或聚合耦合在一起,人為制造復(fù)雜度。

          里氏替換原則(Liskov Substitution Principle)

          里氏代換原則是由麻省理工學(xué)院(MIT)計(jì)算機(jī)科學(xué)實(shí)驗(yàn)室的Liskov女士,在1987年的OOPSLA大會(huì)上發(fā)表的一篇文章《Data Abstraction and Hierarchy》里面提出來的,主要闡述了有關(guān)繼承的一些原則,也就是什么時(shí)候應(yīng)該使用繼承,什么時(shí)候不應(yīng)該使用繼承,以及其中的蘊(yùn)涵的原理。2002年,軟件工程大師Robert C. Martin,出版了一本《Agile Software Development Principles Patterns and Practices》,在文中他把里氏代換原則最終簡化為一句話:“Subtypes must be substitutable for their base types”,也就是說,子類必須能夠替換成它們的基類。

          LSP 講的是基類和子類的關(guān)系。只有當(dāng)這種關(guān)系存在時(shí),里氏代換關(guān)系才存在。

          第一種定義

          if for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T

          類型為 S 的對象 o1,類型為 T 的對象 o2,類型為 T 的所有程序 P, 當(dāng) o2 用 o1 替換之后,程序 P 的行為沒有發(fā)生改變,那么 S 是 T 的子類。

          第二種定義

          Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it

          所有用基類的指針或者引用的函數(shù),必須可以透明地使用其子類。

          通俗地講,只要父類能出現(xiàn)的地方,就可以使用其子類。這其實(shí)是對子類繼承父類時(shí),對子類的一個(gè)約束。具體指

          1. 子類必須完全實(shí)現(xiàn)父類的方法,一個(gè)子類型不得具有比基類型有更多的限制

          2. 子類應(yīng)該可以替換任何基類能夠出現(xiàn)的地方,并且經(jīng)過替換以后,代碼還能正常工作。

          3. 子類也能夠在基類的基礎(chǔ)上增加新的行為。

          4. 里氏代換原則是對開閉原則的補(bǔ)充,它講的是基類和子類的關(guān)系。

          依賴倒置原則(Dependence Inversion Principle)

          Hign level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend on abstractions.

          1. 高層模塊不應(yīng)該依賴底層模塊,兩者都應(yīng)該依賴抽象

          2. 抽象不應(yīng)該依賴細(xì)節(jié)

          3. 細(xì)節(jié)應(yīng)該依賴抽象

          翻譯之后變?yōu)?/span>

          1. 類與類之間通過抽象類或接口來關(guān)聯(lián)。

          2. 接口或抽象類不依賴實(shí)現(xiàn)類

          3. 實(shí)現(xiàn)類依賴抽象類

          什么是依賴:

          1. 構(gòu)造函數(shù)依賴

          2. Setter 方法依賴

          3. 接口聲明依賴

          一句話:面向接口編程

          接口隔離原則(Interface Segregation Principle)

          定義一

          Client should not be forced to depend upon interface that they don't use

          客戶端不應(yīng)該強(qiáng)制依賴它不需要的接口

          定義二

          They dependency of one class to another one should depend on the smallest possible interface.

          類間關(guān)系應(yīng)該建立在最小接口上

          這里要與單一職責(zé)區(qū)分開來,單一職責(zé)是從業(yè)務(wù)邏輯劃分的角度,類應(yīng)該功能單一。而接口隔離指的是接口的方法要少。這里難點(diǎn)是如何把握度。接口過于分散,維護(hù)難度增加,接口過于集中,擴(kuò)展性受限。和微服務(wù)的服務(wù)劃分面臨的問題是一樣的。解決辦法就是領(lǐng)域驅(qū)動(dòng)。

          迪米特原則(Law of Demeter)

          也稱最少知識(shí)原則(LKP)。一個(gè)類應(yīng)該對自己需要耦合或者調(diào)用的類知道得最少。

          Only talk to your immediate friends.

          開放封閉原則(Open Close Priciple)

          Software entities like classes modules and functions should be open for extension but closed for modification

          軟件實(shí)體(類、模塊、函數(shù))對擴(kuò)展開放、對修改封閉

          一句話:通過擴(kuò)展來適配新需求而不是修改。當(dāng)然,不是說一點(diǎn)也不需要修改,而是將修改降到最小。

          總結(jié)

          核心:高內(nèi)聚,低耦合

          SRP :對單個(gè)類的設(shè)計(jì)提供指導(dǎo)。高內(nèi)聚

          IS:對接口的方法給出了限制,要盡量的少。高內(nèi)聚

          DIP:子類和父類的依賴關(guān)系。子類要依賴父類,父類不能依賴子類。低耦合

          LSP:對子類繼承父類給出了約束。子類必須完成實(shí)現(xiàn)父類的方法,這樣父類可以在多個(gè)子類之間透明切換。低耦合

          LoD:對應(yīng)類間依賴的約束。低耦合

          OCP: 從類的角度對高內(nèi)聚和低耦合的詮釋。



          版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。

          本文鏈接:

          https://blog.csdn.net/wenxueliu/article/details/98472238









          瀏覽 48
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  高清无码扣逼视频 | 一级AA毛片 | 亚洲午夜无码久久 | 国内成人精品 | 美女福利网站 |