什麼是單一職責原則?
單一職責原則的英文是Single Responsibility Principle
,簡稱SRP
。其原始英文描述是:
A class or module should have a single responsibility.
一個類或者模塊應當只負責完成一個功能(或職責)。
舉個栗子:
在社交產品中,需設計一個UserInfo
類來記錄用戶心信息:
public class UserInfo{
private long userId;
private String userName;
private String email;
private String telephone;
private long createTime;
private long lastLoginTime;
private String provinceOfAddress; // 省
private String cityOfAddress; // 市
private String regionOfAddress; // 區
private String detailedAddress; // 詳細地址
//... 其他屬性
}
在上述這個代碼樣例裏,UserInfo
類中包含的均爲和用戶相關的屬性,比較滿足SRP
原則。但有很多和地址信息相關的屬性,其實可以考慮拆分爲UserAddress
類,後續在擴展如電商物流等模塊功能時,能更好的與UserInfo
解耦。
單一職責的好處
單一職責原則,通過設計粒度小、功能單一的類,避免了將不相關的功能耦合在一起,提高了類的內聚性。同時,類依賴和被依賴的其他類也變少了,減少了代碼的耦合性。
但不可過多拆分類,如果拆分過細,反而會降低內聚性,影響代碼的可維護性。
如何判斷類職責是否單一?
這裏沒有一個具體的金科玉律,但從實際代碼開發經驗上,有一些可執行性的側面判斷指標,可供參考:
-
類中的代碼行數、函數、或者屬性過多;
-
類依賴的其他類過多
-
私有方法過多
-
類中大量的方法都是集中操作類中的幾個屬性
-
比較難給類起一個合適的名字
回顧一下
單一職責原則的英文是Single Responsibility Principle
,簡稱SRP
。我們在設計類的時候,儘量避免設計大而全的類,要設計粒度小、功能單一的類,使得一個類只負責完成一個功能,這樣有利於提高代碼的複用性、可讀性、可維護性,實現代碼高內聚、低耦合。