本文我們將討論物件導向程式設計中著名的 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;
}
這裡,我們對這個類的職責有乙個清晰的描述:文字維護。但是,如果我們不考率內聚性和對類的職責有清晰的定義。我們可以對於文字的寫和更新操作放在兩個類去實現,比如writetext
和updatetext
。 這樣設計的話,事實上,這兩個類緊耦合在一起,而且是低內聚,兩個類會經常放在一起使用。雖然這三個方法執行不同的操作,但是其目的都是乙個:操作文字,這樣的話,我們就過度設計了。
雖然這個設計原則從名字來講它是自解釋的,看起來實現也簡單,事實上,正確的實現 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...