回答
我不會說自己。一個班級可以承擔一個責任,但是在這個過程中要做很多事情,並且爲了履行其責任所需要做的每件事情都要實現一個界面。
此外,Java中的接口可用於說明該類所具有的屬性(例如,Comparable
和Serializable
),但沒有真正說出該類的責任。
但是,如果一個類實現了多個接口,其中每個接口對應於一個責任,那麼然後是這將違反該原則。
「單一責任」取決於抽象層次。例如,考慮到系統級別的複雜系統可能有一個責任。例如,電視系統的責任是顯示視頻圖像。在下一級,該系統由子系統,監視器,動力裝置等組成。在這個級別,每個單元都有自己的責任。
以同樣的方式,一個級別的一個級別可能被認爲具有單一責任。但是,在較低層次上,它可能有其他組成模塊(類,接口等)執行其部分工作。例如,學生班的職責是代表學生抽象。然而,它可能有另一個代表學生地址的單元(一個班級)。
這樣,使用多個接口本身並不違反面向對象的原則。
也許,但不一定。
接口不是一個責任。 There's a very powerful mode of architecture,其將界面視爲定義該對象可以在應用程序中播放的角色。
想一下這是什麼意思。你可以有一個Person
類的各種接口(讓我們使用.NET約定命名)
class Person : IAmAStudent, IDrawSocialSecurity, IAmACitizen {
public SocialSecurityNumber getSocialSecurityNumber() {
return this.ssn;
}
private SocialSecurityNumber ssn;
public Person(SocialSecurityNumber ssn) { this.ssn = ssn; }
}
現在顯然這不能違反SRP。顯然只有一個變化原因 - 如果人與社會安全號碼之間的關係發生變化。然而,該對象實現了許多接口,並在應用程序中扮演了幾個角色
現在,如果您實施的多個接口公開不同的功能,您可能會違反SRP,但這也可能是一個判斷呼叫。單一責任原則對於實現鬆耦合來說是一個很好的經驗法則,但這不是鎮上唯一的理想。還有高凝聚力其中規定相關的代碼應該共同生活。這兩者基本上存在矛盾(儘管通常有很多方法可以實現良好的平衡)。所以你可能會合理地選擇一個在另一個的方向,並有意識地決定違反SRP。
最終,SRP和所有SOLID規則更多的是確保您按照特定的思路思考,而不是每次盲目追隨他們。
- 1. 單一職責原則的實現
- 2. 嚴格遵守單一責任原則是否違反封裝?
- 3. 我的代碼是否違反單一責任原則?
- 4. 單一責任原則是否適用於職能?
- 5. 自並流測試模式是否違反單一責任原則?
- 6. 抽象工廠違反單一責任原則?
- 7. 違反Java核心迭代器中的單一責任原則
- 8. 單一職責原則在特定代碼上的實施
- 9. 您違反單一責任原則的最佳範例是什麼?
- 10. 單一職責
- 11. 這個班是否遵循單一責任原則?
- 12. 這個ruby模式是否遵守單一責任原則?
- 13. 如何在MVVM中構建ViewModel不違反單一責任原則?
- 14. 是單一責任原則OOP的一個規則?
- 15. 在「現實世界」中使用單一責任原則
- 16. 這是單一責任原則的正確實施
- 17. 這是違反Liskov替換原則嗎?
- 18. 爲了表現,你會否違反REST的冪等原則?
- 19. 有沒有辦法違背單一責任原則做了不止一件事?
- 20. 這是否違反了「最左邊最長」的原則?
- 21. 防禦性編程是否違反DRY原則?
- 22. 服務層類是否違反SRP原則?
- 23. 從ViewModel訪問數據庫是否違反了MVC原則?
- 24. 工廠方法模式是否違反開放/關閉原則?
- 25. 單一責任原則和Backbone.View
- 26. 幫助理解單一責任原則
- 27. 單一責任原則和知識庫
- 28. PetClinic例子破單個責任原則
- 29. 使用「單一職責原則」迫使我的容器有公共設置器
- 30. 正在調用其他代碼(SOLID)單一責任原則(SRP)違規?
如果該單一責任需要它實現多個接口,則不是。 – oldrinb 2012-08-07 23:05:41