5 幅插圖 讓你輕鬆看懂物件導向程式設計的S.O.L.I.D原則

京東科技開發者發表於2020-10-10
5 幅插圖 讓你輕鬆看懂物件導向程式設計的S.O.L.I.D原則
5 幅插圖 讓你輕鬆看懂物件導向程式設計的S.O.L.I.D原則
如果你熟悉物件導向的程式設計,那麼可能已經聽說過SOLID原理。 SOLID是針對物件導向程式設計和設計的五大依賴關係管理,每個字母代表另外一個三個字母的首字母縮寫,用來描述一個原則。這五項軟體開發原則是構建軟體時要遵循的準則,以便於系統擴充套件和維護。這項原則得到軟體工程師Robert C. Martin的贊同。 在其他網站上有太多關於SOLID的精彩文章,但我很少看到帶有圖片的示例,這使得像我這樣喜愛用圖片記憶的人在學習上變得有些困難。 因此,本文的主要目的是透過插圖強調每種原理的目標,幫助大家更好地理解這些原理。 你可能會看到,其中一些原則看起來很相似,但它們的目標並不相同。 注意!你大可以違反一個原則來滿足另一個原則。 為了使此操作更簡單明瞭,我將使用“Class”一詞,但請注意,本文中它也可以作為主體應用於函式、方法或模組。 現在,讓我們開始吧! S —Single Responsibility(單一責任) Class應負單一責任。
5 幅插圖 讓你輕鬆看懂物件導向程式設計的S.O.L.I.D原則
圖釋:
  • 錯誤示範 ——我是一名廚師、園丁、畫家和司機;
  • 正確做法 ——四個Class分別擔任廚師、園丁、畫家和司機。
如果一個Class承擔許多職責,便會增加發生錯誤的可能性,因為對其中一個Class進行更改可能會在您不知情的情況下影響其他角色。 目標:該原則旨在區分變數,以防由於更改而產生錯誤,這樣以後修改就不會影響其他無關的行為啦。 O —Open-Closed (開閉)Class應當在開放的時候進行程式設計擴充套件,封閉的時候進行修改。
5 幅插圖 讓你輕鬆看懂物件導向程式設計的S.O.L.I.D原則
圖釋:
  • 錯誤示範 ——我能做”Cut”這個動作->封閉後-> 修改成能做”Paint”;
  • 正確做法 ——我能做”Cut”這個動作->封閉後->擴充套件成能做”Cut”和”Paint”兩個動作。
更改Class的當前行為將影響使用該類的所有系統。 如果要讓Class執行更多功能,理想的方法是將功能新增到已經存在的功能中,而不是直接更改Class。 目標:該原則旨在擴充套件Class的功能,而不改變特定Calss的現有功能。這是為了避免在使用Class的任何地方引起錯誤。
L — Liskov Substitution(替換)如果S是T的子型別,則可以將程式中型別T的Class替換為型別S的Class,這樣就無需更改總程式內的任何所需屬性。
5 幅插圖 讓你輕鬆看懂物件導向程式設計的S.O.L.I.D原則
圖釋: 有一對父子Sam和Eden,有人希望Sam 做一杯咖啡
  • 錯誤示範 ——父親Sam不在場時,工作便失效;
  • 正確做法 ——繼承工作給兒子Eden。
當子類無法執行與其父類相同的操作時,可能會導致錯誤。 如果您有一個類並從中建立另一個類,則該類將成為父類,而新的類將成為子類。 子類應該能夠執行父類可以做的所有事情。此過程稱為繼承。 子類應該能夠處理與父類相同的請求並提供相同的結果,或者它可以傳遞相同型別的結果。 圖中父類提供咖啡(可以是任何型別的咖啡)。 子類交付Cappucino是可以接受的,因為它是一種特殊的咖啡,但是交付水是不可接受的。 如果子類別不符合這些要求,則意味著子類別已完全更改,並違反了這一原則。 目標:該原則旨在加強一致性,以便可以以相同的方式使用父類或其子類,而不會出現任何錯誤。
I —Interface Segregation(介面隔離)不應強迫客戶依賴他們不使用的方法
5 幅插圖 讓你輕鬆看懂物件導向程式設計的S.O.L.I.D原則
圖釋:
  • 錯誤示範 ——用混亂的方法去作排列 -> 無法使用;
  • 正確做法 ——用簡潔的方法去作排列 -> Awesome!
當要求一個Class執行無用的操作時,這是浪費的,並且如果該Class沒有能力執行那些操作,則可能會產生意外的錯誤。 Class應僅執行其職責所需的操作。如果將來其他Class可能會負責到其他任何動作,則應將其徹底刪除或移至其他位置。 目標:該原則旨在將一組動作分成較小的一組,以便Class僅執行其所需的一組動作。
D —Dependency Inversion(依賴倒置)- 高階模組不應依賴於低階模組,兩者都應取決於abstraction; - abstraction不應依賴細節,細節應取決於abstraction。
5 幅插圖 讓你輕鬆看懂物件導向程式設計的S.O.L.I.D原則
圖釋:
  • 錯誤示範 ——我用特定工具來工作;
  • 正確做法 ——我用任何給我的工具來工作。
首先,讓我們更簡單地定義此處使用的術語:
  • 高階模組(或Class):使用工具執行動作的Class;
  • 低階模組(或Class):執行操作所需的工具;
  • 抽象abstraction:表示連線兩個Class的介面;
  • 詳細資訊:該工具如何工作。
該原則表明,不應將Class與用於執行動作的工具融合在一起。而是應將其與允許工具連線到Class的介面融合。 它還說明,Class和介面都不應該知道工具的工作方式。但是,該工具需要滿足介面規範。 目標:該原理旨在透過引入介面來減少高階模組對低階模組的依賴性。 總結到目前為止,我們已經討論了這五個原則並突出了它們的目標。它們將幫助你使程式碼易於調整、擴充套件和測試,達到完美的境界。 最後,非常感謝你的閱讀。 我希望你能對這個主題形成一個更好的概念,並且閱讀時和我編寫程式碼時一樣開心。 ?原文連結: 以上資訊來源於網路,由“京東智聯雲開發者”公眾號編輯整理,不代表京東智聯雲立場


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69912185/viewspace-2725959/,如需轉載,請註明出處,否則將追究法律責任。

相關文章