2015-11-28 118 views
3

我在理解單一責任原則方面存在問題。 SRP是否應用於課堂級別或方法級別。 可以說我有學生班,我需要創建學生,更新學生和刪除學生。 如果我創建一個具有這三個動作的方法的服務類,這是否會打破SRP原則。單一職責原則:職業水平或方法水平

+2

這裏有一個簡單的啓發式...如果你不能描述這個東西的工作(不管是方法,類還是模塊),而不使用單詞「和」,那麼你需要分解它。你的服務班「管理學生對象」,因此滿足SRP。 :-) –

回答

3

我想說你有一個服務類負責對Student類型的對象進行CRUD操作。我沒有看到這個設計違反SRP。
從相同類(或甚至不同的類)的http://www.developerfusion.com/article/137636/taking-the-single-responsibility-principle-seriously/

兩種方法引述應注重不同的方面。然而,同一類中的兩種方法,例如一個存儲庫,可能都必須關注相同的高層責任,例如,持久性。

我在單個上下文中看到CRUD作爲衆所周知的操作,除非您有一些業務與之關聯。例如,您可能希望允許某些類只能讀取數據並拒絕它們對其進行任何更改。那時您可以使用另一個SOLID原理Interface segregation
您可以定義一個接口,只定義在這些類中使用的讀取方法。或者如果它是有意義的(例如性能),創建一個單獨的具體類,只是實現讀取操作。

+0

我的困惑是單一責任的定義是巨大的,如果我有批處理,我必須處理數據實際上是一個單一的責任,這個責任包括閱讀,處理和寫作。所以我的班級應該全部三個班,還是應該爲這三個班級分別設置三個班級 – sumedha

+0

這是開放的,我同意。可以從SRP的一般定義中解釋兩個結果。這在模式和實踐中並不罕見。這實際上取決於你如何對需求進行分類和抽象。例如對於我來說,一種方法不應該對添加和更新負責。但是這些方法可以駐留在負責持久化學生數據的同一個類中。以我的觀點來看,爲CRUD操作分開單獨的類只是過度使用原則,除非必須(請參閱答案中的示例)。所以我不會這樣做,如果我不必。 – Kamyar

3

SRP處於課堂和方法層面。所以如果你談論的是學生課,那麼在這種情況下,只有責任在學生實體上做CRUD。同時,當你談論方法時,你不應該有一個InsertStudent方法,並根據ID進行更新和插入。如果你有插入的InsertStudent和更新它的UpdateStudent,可以打破SRP.But SRP