單一職責原則
單一職責原則
單一職責原則(SRP:Single responsibility principle)又稱單一功能原則,面向對象五個基本原則(SOLID)之一。它規定一個類應該只有一個發生變化的原因。該原則由羅伯特·C·馬丁(Robert C. Martin)於《敏捷軟體開發:原則、模式和實踐》一書中給出的。馬丁表示此原則是基於湯姆·狄馬克(Tom DeMarco)和Meilir Page-Jones的著作中的內聚性原則發展出的。
所謂職責是指類變化的原因。如果一個類有多於一個的動機被改變,那麼這個類就具有多於一個的職責。而單一職責原則就是指一個類或者模塊應該有且只有一個改變的原因。
一個類,只有一個引起它變化的原因。應該只有一個職責。每一個職責都是變化的一個軸線,如果一個類有一個以上的職責,這些職責就耦合在了一起。這會導致脆弱的設計。當一個職責發生變化時,可能會影響其它的職責。另外,多個職責耦合在一起,會影響復用性。例如:要實現邏輯和界面的分離。
如果一個類承擔的職責過多,就等於把這些職責耦合在一起了。一個職責的變化可能會削弱或者抑制這個類完成其他職責的能力。這種耦合會導致脆弱的設計,當發生變化時,設計會遭受到意想不到的破壞。而如果想要避免這種現象的發生,就要儘可能的遵守單一職責原則。此原則的核心就是解耦和增強內聚性。
之所以會出現單一職責原則就是因為在軟體設計時會出現以下類似場景:
T負責兩個不同的職責:職責P1,職責P2。當由於職責P1需求發生改變而需要修改類T時,有可能會導致原本運行正常的職責P2功能發生故障。也就是說職責P1和P2被耦合在了一起。
沒有任何的程序設計人員不清楚應該寫出高內聚低耦合的程序,但是很多耦合常常發生在不經意之間,其原因就是:
職責擴散:因為某種原因,某一職責被分化為顆粒度更細的多個職責了。
遵守單一職責原則,將不同的職責封裝到不同的類或模塊中。
單一職責原則並不是一個孤立的面向對象設計原則,它是面向對象設計五個基本原則(SOLID)之一。這些原則是:單一職責原則、開閉原則、介面隔離原則、里氏替換原則和依賴倒置原則。這些原則被一起應用時可以使一個軟體系統更易被維護和擴展。這些原則被典型的應用在測試驅動開發上,並且是敏捷開發以及自適應軟體開發等指導思想的重要組成部分。