設計原則的簡單理解 一罪

2022-09-24 03:39:09 字數 1671 閱讀 5223

好的**需要有高內聚、低耦合、易擴充套件且擴充套件改動小等特點。說實話,我入行很久之後,才知道這些設計原則的名字,但是我並不覺得陌生,反而有一種理所當然的感覺。這得感謝自學時網路上前輩們推薦的書籍,培養了自己的**潔癖,還得感謝轉行後的第乙個東家!以下只是我的理解,如有錯誤,請指正。

顧名思義,單一職責就是函式或類只做一件事,但是"只做一件事"肯定是針對不同抽象層次的。

舉個例子,我要寫乙個檔案,於是我定義了write()這麼乙個函式,它確實只做一件事。但是這個write()對於寫乙個檔案來說是不夠的,我肯定還需要open()和close(),自然這兩個函式也只做了一件事。

但我要真正寫乙個檔案,希望得到的是下面的函式

int write_file()

對於write_file()的呼叫者來說,write_file()確實只做了一件事,它幫我寫了乙個檔案。但對於寫write_file()的程式設計師來說,write_file()明明做了三件事。

單一職責的職責是對外抽象後的職責,只要函式或類所做的事不超過這個抽象定義,那就不算違背單一職責。

越底層的函式越容易確定職責,甚至只需要這個函式寫的足夠短小,其職責一般就能保證單一。高層的函式或者類就需要考驗程式設計師的抽象能力了。乙個簡單的檢查該抽象是否能做到單一職責的方法,就是看看函式內是否只做了函式名要求的事,類內所有成員函式和成員變數是否只是為了做到類名要求的事。

當我們長期遵循單一職責原則時,我們會習慣於將乙個任務拆分為多個最小步驟,而這通常意味著可以通過流水線,並行等方式來執行這些最小步驟,達到提公升效能的目的。

黎克特制替換就是指子類可以出現在父類出現的任何地方。這是乙個指導我們何時使用繼承的原則。a繼承b,我們說"a是乙個b",既然"a是乙個b",a自然能替換到b出現的任何地方。如果無法替換的話,說明a不應繼承b。

依賴倒置就是為了做到面向介面程式設計。

那為什麼叫倒置呢?原本高層a直接呼叫底層b的介面,當高層a想用底層c時就可能需要修改大量**,原因是c和b是沒有約束的,c的介面與b可能完全不一樣。為了避免替換底層需要修改大量**的情況,高層a自己定義了抽象層d,讓底層b和底層c都依賴抽象層d的介面去實現。因為抽象層d是高層定義的,而底層b和c是依賴d去實現的,所以就叫依賴倒置。在c++中,這通過定義虛基類,並繼承該虛基類來實現。

依賴倒置可以使得高層切換底層實現類時,減少**修改量,只需要修改一下例項化的**即可,更靈活。

class d

class b : public d;

class c : public d;

void a()

介面隔離是針對介面呼叫者做的隔離,只讓呼叫者看到其能呼叫的介面,本質上是最小許可權。大部分it公司都會宣講資訊保安,而為了保證資訊保安的乙個原則就是最小化原則。介面隔離就是為了程式安全,如果提供了超過呼叫者許可權的介面,那可能就會引發問題。

迪公尺特法則就是最小依賴,依賴更少的類,更少的介面,這樣可以降低類之間的耦合和減少**複雜度。如果某個類依賴了很多類,很多介面,那以後其**就有更大的可能因為其依賴項的改動而改動,變得不穩定。

對擴充套件開放,對修改閉合。擴充套件可以是函式的擴充套件,也可以是類的擴充套件,這裡的對修改閉合指的是對本層的修改閉合,因為對於高層來說肯定是需要修改的,比如呼叫新介面,使用新類的例項。之所以對修改閉合,是為了避免修改引入bug。

總是遵頊這些設計原則,對自己的**能力是有很大益處的。再者設計原則是道,設計模式是術,如果對道理解通透的話,術是可以自行推演的,可能不知不覺中你已經用了某種設計模式了,甚至創造了新的設計模式。

對於設計原則 依賴倒轉原則的一些個人理解

依賴倒轉原則 什麼是依賴倒轉原則呢?先舉個例子,用造汽車舉例子 假如,造汽車的第一步是 造車輪 第二步是 根據車輪的大小造車底 第三步是 根據車底的大小造車身 最後一步是 根據車身的大小造出汽車。那麼這個過程中的依賴關係是 汽車依賴於車身的設計,車身依賴於車底的設計,車底依賴於車輪的設計。粗略的看,...

對設計原則 依賴倒置 的一些理解

作為一名oop程式設計師,設計原則是必須知道的知識 單一職責,開閉原則,依賴倒置,介面隔離,替換法則。在看 head first 一書時,突然對依賴倒置有了一些簡單的理解。先看依賴倒置的定義 要依賴抽象,不要依賴具體類。其意思是具體類要依賴抽象,抽象不應該依賴具體類,更擴充套件一點就是說具體類也盡量...

關於物件導向設計原則的一些理解

簡介 因為七大原則比較多,所以簡單梳理一下七大原則之間的關係和邏輯,便於理解和應用。對於每種原則具體的思想和實現,沒有舉例。開閉原則 open closed principle,ocp 黎克特制替換原則 liskov substitution principle,lsp 依賴倒置原則 depende...