色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

面向對象開發的SOLID五大基本原則

Q4MP_gh_c472c21 ? 來源:typedef ? 作者:typedef ? 2022-10-17 14:31 ? 次閱讀

C語言開發的應該都知道,C是面向過程開發的,而c++是面向對象開發的。而封裝、繼承與多態是面向對象開發的三大特征。

但你可能不知道OOD(Object-Oriented Design)還有五大基本原則,被Bob大叔稱為SOLID原則,字母為每個原則的首字母,遵循這些原則能夠讓你的代碼在擴展性、維護性以及重用性提高。而這些不正是我們所追求的嗎?

接下來,我們就一塊學習學習這些原則。

五大基本原則-SOLID

1. SRP

SRP(The Single Responsibility Principle)單一職責原則。

SRP是SOLID五大設計原則中最容易被誤解的一個,SRP不就是每個模塊都應該只做一件事嗎?非也非也,這只是在實現底層細節的實際原則,并非是SRP的全部。

SRP最初是這樣描述的:

任何一個模塊都應該有且只有一個被修改的原因(There should never be more than one reason for a class to change)

SRP的定義幾經迭代,最終被Robert C.Martin在《Clean Architecture》中定義為:

任何一個軟件模塊都應該只對某一類行為者負責

那么上文中提到的軟件模塊究竟是指什么呢?大部分情況下,其最簡單的定義就是指一個源代碼文件。然而有些編程語言和編程環境并不是用源代碼文件來存儲程序的。在這些情況下,軟件模塊指的就是一組緊密相關的函數和數據結構。

來看一個正面例子,C標準庫中的模塊就是用來處理數學相關的,模塊就是用來處理字符串相關的的,等等...,每個模塊職責都比較明確。

再來看一個反面例子,還記得剛開始學習單片機編程的時候,項目工程中從始至終就一個main源文件,真的是連頭文件都不寫的,一個main里面包含了LED、按鍵等相關全部代碼,這明顯是不符合SRP這一原則的。就像下圖一樣。

9a7496f0-4dd2-11ed-a3b6-dac502259ad0.png

2. OCP

OCP(The Open-Closed Principle)開放封閉原則。

OCP的定義如下:

軟件實體應當對擴展開放,對修改關閉(Software entities should be open for extension,but closed for modification)

設計良好的計算機軟件應該易于擴展,同時抗拒修改。換句話說,一個良好的計算機系統應該在不需要修改的前提下就可以輕易被擴展。

OCP是系統框架設計的主導原則,其主要目的是讓系統易于擴展,同時限制其每次被修改所影響的范圍。實現的方式是通過將系統劃分為一系列的組件,并且將這些組件的依賴關系按層次結構進行組織,使得高階的組件不會因低階組件被修改而受到影響。

我們來看一個網絡中協議的例子,如下圖:9a968896-4dd2-11ed-a3b6-dac502259ad0.png

圖中分為三個層級,最上方層級最高,每個層級有若干組件,高層級的組件依賴低層級的組件。

3. LSP

LSP(LSP-Liskov Substitution Principle)里氏替換原則。

LSP定義:

使用基類對象指針或引用的函數必須能夠在不了解衍生類的條件下使用衍生類的對象(Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it)

里氏代換原則中說,任何基類可以出現的地方,子類一定可以出現。只有當衍生類可以替換掉基類,軟件單位的功能不受到影響時,基類才能真正被復用,而衍生類也能夠在基類的基礎上增加新的行為。

我們來看一個經典的反面案例,正方形(Square)與長方形(Rectangle)。

那這里提出疑問了,正方形和長方形之間的繼承關系是如何呢?

如果A is-a B,則認為B是基類,A為子類,A應該繼承B。那這個簡單了,眾所周知正方形是長方形,立即推,長方形是基類,正方形是子類,正方形應該繼承長方形。

9ab72c86-4dd2-11ed-a3b6-dac502259ad0.png

基類長方形中有SetHeight()和SetWidth()方法,但是子類正方形有一個特點,長和寬是相等的,所以在實現SetHeight()和SetWidth()都必須同時設置寬和高,我們來看代碼。

9ac9177a-4dd2-11ed-a3b6-dac502259ad0.png

還是那句話任何基類可以出現的地方,子類一定可以出現,所以在創建Rectangle對象指針的時候,這里其實給的是子類的對象,最終代碼運行斷言報錯。

Assertionfailed:rect->GetArea()==10,file.main.cpp,line10

如果new出來的對象是Rectangle,則程序能夠正常執行。如果new出來的是Square則會進入斷言。從而Square不能代替Rectangle,所以不符合LSP原則,實際上Square并不是Rectangle的子類。

正方形是長方形,但是他們的行為并不一樣,所謂的行為,就是抽象出來的東西。正方形只要有一個設置邊長的方法就行了,而長方形需要設置寬和高兩種方法。

4. ISP

ISP(ISP-Interface Segregation Principle)接口隔離原則。

ISP定義:

不應強制客戶端依賴于它們不使用的接口(Clients should not be forced to depend upon interfaces that they do not use.)

該原則還有另外一個定義:一個類對另一個類的依賴應該建立在最小的接口上(The dependency of one class to another one should depend on the smallest possible interface)

假如現在有一個OPS類。用戶1只需要使用OPS類的op1方法,用戶2只需要OPS類的op2方法,但是呢,OPS類除了提供op1和op2方法還提供了若干方法。如下圖:

9af6dee4-4dd2-11ed-a3b6-dac502259ad0.png

此時用戶2沒什么意見,心想著反正能實現我要的功能就可以了。

但是呢,用戶1不愿意,于是就去找開發人員理論,我就要實現一個op1功能,給我整這么多依賴干啥。除了這個功能,其他的全部都給我隱藏掉,下班之前我就要,說完頭一扭就走了。

開發人員心想,這么簡單的事情,讓我下班之前給你,這不是眼看人低嗎,說完就在用戶1和OPS之間又封裝一層IU1Ops接口,兩分鐘搞定。于是就去跟用戶1說,你用IU1Ops,里面有你要的接口,拿去用吧。說完頭一扭就走了。模型如下圖:

9b209acc-4dd2-11ed-a3b6-dac502259ad0.png

接口隔離原則和單一職責都是為了提高類的內聚性、降低它們之間的耦合性,體現了封裝的思想,但兩者是不同的:

單一職責原則注重的是職責,而接口隔離原則注重的是對接口依賴的隔離。

單一職責原則主要是約束類,它針對的是程序中的實現和細節;接口隔離原則主要約束接口,主要針對抽象和程序整體框架的構建。

5. DIP

DIP(DIP-Dependency Inversion Principle)依賴倒置原則。

DIP定義:

高層次的模塊不應該依賴低層次的模塊,他們都應該依賴于抽象(High level modules should not depend upon low level modules. Both should depend upon abstractions)

抽象不應該依賴于具體實現,具體實現應該依賴于抽象(Abstractions should not depend upon details. Details should depend upon abstractions)

這個名字看著有點別扭,“依賴”還“倒置”,這到底是啥意思?

依賴指兩個相對獨立的對象,當一個對象負責構造另一個對象的實例,或者依賴另一個對象的服務時,這兩個對象之間主要體現為依賴關系。

老樣子,看示例,現在甲方需要能讓BMW車跑起來的功能,再看一下乙方的設計。

9b38ca52-4dd2-11ed-a3b6-dac502259ad0.png

司機有駕駛BMW車輛的方法,BMW車輛有run的方法,所以是甲方滿足需求的。

后來甲方需求變了,甲方不僅要能開BMW車,也要能開Benz車,卻發現使用乙方原來的的設計Benz車卻開不起來,因為+driver()只接受BMW的車輛,不接受Benz的車輛,這明顯不合理,一個司機會開BMW卻不會開Benz,太反常了。于是去找乙方重新設計。

乙方也認識到了不足,經過多方討論終于有了如下設計。

9b569442-4dd2-11ed-a3b6-dac502259ad0.png

對于每種車輛,都應該有一個run的方法,所有的車輛都應該繼承ICar實現。而司機呢,也不應該依賴具體的車輛,而應該依賴所有車輛的抽象方法。原本直接指向BMW的依賴箭頭被反置了?,F在即使甲方在添加別的車輛,司機仍然能開。不會出現只會開BMW而不會開其他車輛的情況了。

簡單來說,依賴倒轉原則就是指:代碼要依賴于抽象的類,而不要依賴于具體的類;要針對接口或抽象類編程,而不是針對具體類編程。根據上面的例子可以加深理解。

依賴倒置原則(Dependency Inversion Principle)是很多面向對象技術的根基。它特別適合應用于構建可復用的軟件框架,并且,因為抽象和細節已經彼此隔離,代碼也變得更易維護。

采用依賴倒置原則可以減少類間的耦合性,提高系統的穩定性,減少并行開發引起的風險,提高代碼的可讀性和可維護性。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7618

    瀏覽量

    138656
  • 面向對象
    +關注

    關注

    0

    文章

    64

    瀏覽量

    10030
  • Solid
    +關注

    關注

    0

    文章

    8

    瀏覽量

    9021

原文標題:工作這么久,才明白的SOLID設計原則!

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    面向對象設計的基本原則

    更快捷?!痹O計一個軟件不關要追求代碼的優雅問題,更關乎生產成本等。技術大師們在對軟件架構的研究中經歷了很長時間的摸索,從面向過程到面向對象,從設計原則到設計模式,總結了許多設計上的經典
    發表于 07-12 08:39

    FPGA設計基本原則及設計思想

    今天給大俠帶來FPGA設計基本原則及思想,話不多說,上貨。FPGA設計基本原則及思想一、硬件設計基本原則1、速度與面積平衡和互換原則:一個設計如果時序余量較大,所能跑的頻率遠高于設計要
    發表于 10-11 12:26

    MOS設計選型的基本原則

    6個MOS設計選型的基本原則
    發表于 03-18 07:04

    電源IC的選擇基本原則

    及成本等問題。這里給出一些選擇基本原則,供參考。成本等問題。這里給出一些選擇基本原則,供參考。1、優先考慮升壓式DC/DC變換器采用升壓式DC/DC變換器不僅效率高并且可減少電池數(減小整個電源體積及...
    發表于 11-17 08:10

    傳感器選用的基本原則

    傳感器選用的基本原則       現代傳感器在原理與結構上千差萬別,如何根據具體的測量目的、測量對象以及測量  環
    發表于 11-07 11:39 ?2432次閱讀

    內電層分割基本原則

    內電層分割基本原則,內電層分割基本原則,內電層分割基本原則
    發表于 12-24 11:02 ?0次下載

    PCB設計基本原則

    PCB設計基本原則,好東西,喜歡的朋友可以下載來學習。
    發表于 01-18 15:17 ?0次下載

    PLC選型的基本原則有哪些

    PLC選型的基本原則是:所選的PLC應能夠滿足控制系統的功能需要。
    發表于 04-25 10:10 ?1.8w次閱讀

    PLC控制系統設計的基本原則

    PLC控制系統的設計四項基本原則如下
    發表于 05-18 08:57 ?3949次閱讀

    PID控制器選型基本原則

    PID控制器選型應根據控制對象特性及生產過程對控制系統的要求進行,PID控制器選型基本原則如下:
    發表于 06-14 11:10 ?1877次閱讀

    片上系統(SoC)基本原則和參考書

    片上系統(SoC)基本原則和參考書說明。
    發表于 03-26 14:59 ?10次下載

    硬件原理圖設計基本原則

    硬件原理圖設計還應該遵守一些基本原則,這些基本原則要貫徹到整個設計過程,雖然成功的參考設計中也體現了這些原則,但因為我們可能是“拼”出來的原理圖,所以我們還是要隨時根據這些原則來設計審
    的頭像 發表于 06-14 10:29 ?4746次閱讀

    工業傳感器選型的六大基本原則

    工業傳感器選型的六大基本原則
    的頭像 發表于 01-06 09:17 ?1202次閱讀

    手機故障維修基本原則及方法

    電子發燒友網站提供《手機故障維修基本原則及方法.ppt》資料免費下載
    發表于 10-24 14:22 ?1次下載
    手機故障維修<b class='flag-5'>基本原則</b>及方法

    群脈沖預防方案的基本原則

    群脈沖預防方案的基本原則?|深圳比創達電子
    的頭像 發表于 01-15 14:03 ?744次閱讀
    群脈沖預防方案的<b class='flag-5'>基本原則</b>?
    主站蜘蛛池模板: 国产精品成久久久久三级四虎 | 18禁止看的免费污网站 | 精品无人区麻豆乱码无限制 | 色AV色婷婷96人妻久久久 | 91天堂国产在线 在线播放 | 撕开美女的衣服2 | 国产欧美在线亚洲一区刘亦菲 | 18美女腿打开无遮软件 | 久久这里的只有是精品23 | 激情丛林电影完整在线 | 伊人久久综在合线影院 | 19十主播福利视频 | 人妖干美女 | 国产熟妇无码一区二 | 日本一在线中文字幕 | 婷婷综合久久狠狠色 | 国产69精品久久久久麻豆 | 戳女人屁股流水羞羞漫画 | 国产精品久久久久精品A片软件 | 97国产视频 | 国产美女视频一区二区二三区 | 2020年国产精品午夜福利在线观看 | 王雨纯羞羞 | 99在线观看视频免费 | 嫩草影院地址一地址二 | 亚洲国产在线视频中文字 | 亚洲国产精品VA在线看黑人 | 无码人妻精品一区二区蜜桃色欲 | 精品一区二区免费视频蜜桃网 | 97精品视频在线观看 | 亚洲午夜电影 | 99国产精品免费视频 | 无限资源在线完整高清观看1 | 亚洲中文热码在线视频 | 处初女处夜情视频在线播放 | 成人毛片免费在线观看 | 无码免费视频AAAAAA片草莓 | 亚洲成人日韩 | 小柔的性放荡羞辱日记 | 真人美女精美小穴 | 99久久免热在线观看 |