2010-04-15 28 views
5

假設我們正在設計一個執行CRUD(創建,讀取,更新和刪除)操作的UserServiceImpl類。在我看來,創建,閱讀,更新和刪除是班級改變的四個原因。這個班是否違反單一責任原則?如果違反,我們應該有CreateUserServiceImpl,ReadUserServiceImpl, UpdateUserServiceImplDeleteUserServiceImpl這四個等級。有很多 類是不是有點矯枉過正?如何將單一責任原則應用於服務類

假設我爲創建,讀取,更新和刪除操作定義了4個接口,並且我的服務類實現了所有四個接口。現在我只能使用一個 實現類,但通過分離它們的接口,我已經將其他應用程序的概念解耦爲 。這是正確的方式還是你在其中看到一些問題 ?

回答

1

它不違反單一責任原則,直到服務負責單個類型或業務信息的數據服務。

4

這就是我喜歡的模式和原則 - 他們是爲大家在軟件設計上不同意不亞於同意:-)編組方式

我的觀點是建立在任何方式使它成爲類可用且易於理解的課程 - 取決於班級所處的複雜程度和背景。通過一個簡單的實現和上下文,一個類將做。您可以說它確實遵守SRP,因爲它負責管理CRUD操作。但是如果實現過程複雜,或者有很多共享代碼適合放入抽象父類,那麼可能有4個獨立的類,每個CRUD操作一個更有意義。這完全取決於你如何看待它。

模式和原則是偉大的事情,但使用不當,他們可以做一個簡單的問題一樣複雜,沒有他們。

+0

感謝您的回答。我已經更新了這個問題。現在設計更好了嗎? – Shekhar 2010-04-15 08:16:57

2

在我看來,創建,讀取,更新和刪除是改變 類的四個原因。

爲什麼?

如果我有Stack班,是PushPop班級改變的原因?

我不這麼認爲。這是人們用堆棧做的兩個標準操作。與CRUD相同,它是一個簡單的,建立的,衆所周知的數據存儲操作集。

現在您的底層存儲技術本身就是您的課程改變的原因。這就是說,如果您的CRUD實現是硬編碼的,只能與特定的MS SQL 6.0數據庫實例一起使用,那麼您違反了SRP,並且該類不會輕易重用或可擴展。

關於4個接口,這更接近另一個SOLID原則,ISP,這裏的需求取決於數據存儲的使用模式。例如,如果某些類只需要從數據存儲中讀取數據,則只需使用Read方法提取一個接口並將該接口請求爲此類方法的參數即可。通過分離這個接口,你可以稍後對它進行單獨的實現。誰知道,也許對於只讀客戶端,您可以發出更好的優化查詢或使用內存緩存,但如果不是的話 - 您可以將實現此接口的默認數據存儲實例傳遞給它們。