SOLID原則 單一職責原則

2021-10-08 17:00:31 字數 2266 閱讀 8838

本文我們將討論物件導向程式設計中著名的 solid 原則之一的單一職責原則。我們將深入講解什麼是單一職責原則和在設計**時如何實現它,最後將如何避免濫用此設計規則。單一職責的英文表達為 single responsibility principle ,簡稱 srp。

就像它的名字的字面意思一樣,這個原則表示每個類應該只有乙個職責,也就是只有乙個目的,乙個類只做一樣工作,以此可以推斷出這個類只有乙個原因被修改。我們不想讓物件知道的太多以及承擔與自己無關的職責,否則,這些類很難維護,例如,乙個類由於不同的原因被修改,這個類應該根據職責被拆分為多個類,每個類符合單一職責原則。這樣,當錯誤發生時,可以很容易的找到發生錯誤的地方。

下面乙個類負責用不同的方法來修改文字資訊,修改文字資訊是它唯一的職責。

public

class

textmanipulator

public string gettext()

public

void

(string newtext)

public string findwordandreplace

(string word, string replacementword)

return text;

}public string findwordanddelete

(string word)

return text;

}public

void

printtext()

}

雖然這個類看上去沒問題,但是對於 srp 來說,不是乙個好的例子,它承擔了兩個職責,維護和列印文字。

方法printtext違反了單一職責原則,為了符合此原則,我們需要另外乙個類專門用來列印文字,**如下:

public

class

textprinter

public

void

printtext()

public

void

printouteachwordoftext()

public

void

printrangeofcharacters

(int startingindex,

int endindex)

}

textprinter專門用來提供各種列印文字的方法,列印是它的唯一職責,符合 srp。

在開發過程中使用 srp 的技巧是理清每個類的職責。然而,每個開發者對每個類的目的都有自己理解,這樣增加了使用srp 的難度,因為沒有嚴格的規則指導我們如何實現 srp,因此,可能會出現根據每個人不同的理解設計出不同的類實現。這樣的實現比較主觀,會使實現srp 比較困難,不像我們上面的例子這麼簡單。那有沒有其他原則來規範我們實現srp 呢?有的,下面來講內聚性

遵循srp 原則,我們的類將承擔單一職責,類的方法和資料都是和這個職責相關聯的,這樣的設計從內聚性的角度來看是高內聚的,高內聚和健壯性一起來減少我們程式的出錯概率。

當我們的設計基於srp 時,根本上也符合高內聚特性,高內聚能幫我們為類找到單一職責,反過來,也能幫我們找到某些類承擔了過多的職責。

讓我們回到類textmanipulator的方法定義:

public

void

(string newtext)

public string findwordandreplace

(string word, string replacementword)

return text;

}public string findwordanddelete

(string word)

return text;

}

這裡,我們對這個類的職責有乙個清晰的描述:文字維護。但是,如果我們不考率內聚性和對類的職責有清晰的定義。我們可以對於文字的更新操作放在兩個類去實現,比如writetextupdatetext。 這樣設計的話,事實上,這兩個類緊耦合在一起,而且是低內聚,兩個類會經常放在一起使用。雖然這三個方法執行不同的操作,但是其目的都是乙個:操作文字,這樣的話,我們就過度設計了。

雖然這個設計原則從名字來講它是自解釋的,看起來實現也簡單,事實上,正確的實現 srp不是那麼容易 , 我們要仔細從職責的角度設計類而且還要額外的關注類的內聚性。

單一職責原則

定義 不要存在多於乙個導致類變更的原因。通俗的說,即乙個類只負責一項職責。問題由來 類t負責兩個不同的職責 職責p1,職責p2。當由於職責p1需求發生改變而需要修改類t時,有可能會導致原本執行正常的職責p2功能發生故障。解決方案 遵循單一職責原則。分別建立兩個類t1 t2,使t1完成職責p1功能,t...

單一職責原則

單一職責原則 乙個類,只有乙個引起它變化的原因。應該只有乙個職責。每乙個職責都是變化的乙個軸線,如果乙個類有乙個以上的職責,這些職責就耦合在了一起。這會導致脆弱的設計。當乙個職責發生變化時,可能會影響其它的職責。另外,多個職責耦合在一起,會影響復用性。例如 要實現邏輯和介面的分離。對於user類,裡...

單一職責原則

問題由來 一心二用,效率降低 類t負責兩個不同的職責 職責p1,職責p2。當由於職責p1需求發生改變而需要修改類t時,有可能會導致原本執行正常的職責p2功能發生故障。解決方案 專注做某件事情 遵循單一職責原則。分別建立兩個類t1 t2,使t1完成職責p1功能,t2完成職責p2功能。這樣,當修改類t1...