單一職責原則是面向對象原則五大原則中最簡單,也是最重要的一個原則, 他的字面定義以下:數據庫
單一職責原則(Single Responsibility Principle, SRP): 一個類只負責一個功能領域中的相應職責,或者能夠定義爲:就一個類而言,應該只有一個引發它變化的緣由。spa
從定義中能夠看出在定義類的時候要將職責劃分清楚, 不能讓一個類負責幹多個事情。換句話說就是一個類只有一個引發他變化的點。若是一個類負責幹多個事情那麼就會有多個引發他變化的緣由。那麼這個類就不穩定了,這個類就容易變化,由於咱們知道若是乾的事情越少變化的誘因就愈少,若是乾的事情越多變化的誘因就愈多。變化的越多引發bug的可能性就越大, 最終就會影響到你設計的系統容易出現bug,反之系統出現bug的肯能性就越小。設計
如今咱們有這麼一個場景,對人員信息的維護, 一般對用數據庫的操做以下:code
public class Employee { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public int Age { get; set; } public DateTime BirthDay { get; set; } } public class EmployeeRepository { public void Create(Employee employee) { DataBase<Employee> dataBase = new DataBase<Employee>(); dataBase.Create(employee); } public IEnumerable<Employee> Query() { DataBase<Employee> dataBase = new DataBase<Employee>(); return dataBase.Query(); } }
咋一看這個設計彷佛是沒有問題的,可是在看看咱們剛剛講的那個原則,其實這個設計已經違背了我麼的SRP原則,主要是EmployeeRepository 類的職責太多,它包含的兩個方法,一個是給數據庫中建立數據一個是查詢數據,從這個拆分粒度上來講是EmployeeRepository 承擔了兩個職責。 所以咱們因該將他拆分開來以下:對象
public class EmployeeRepository { public void Create(Employee employee) { DataBase<Employee> dataBase = new DataBase<Employee>(); dataBase.Create(employee); } } public class EmployeeQuery { public IEnumerable<Employee> Query() { DataBase<Employee> dataBase = new DataBase<Employee>(); return dataBase.Query(); } }
這樣咱們就將原來的EmployeeRepository中的查詢數據的職責拆分到EmployeeQuery類中,這樣EmployeeRepository就只負責對數據的"寫"操做而EmployeeQuery 只負責對數據"讀"操做, 這就回到了計算機的本質上來了, 即計算機的本質就是 "讀寫".ip
寫到這裏就應該告一段落了, 可是我想不少人都會說第一個EmployeeRepository 的職責劃分的也能夠啊,只負責數據的操做啊, 其實這個問題也沒有錯, SRP原則自己就是一個充滿爭議的原則, 每一個人對類的組織不一樣,職責的劃分不一樣, 系統的規模不一樣對SRP使用也是不一樣, 對SRP的把握粒度也不一樣,這要根據具體問題具體對待.ci