回答
我不會說自己。一個班級可以承擔一個責任,但是在這個過程中要做很多事情,並且爲了履行其責任所需要做的每件事情都要實現一個界面。
此外,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. 退出($ status)是否違反單一責任原則?
- 6. 嚴格遵守單一責任原則是否違反封裝?
- 7. 「富域模式」能否違反單一責任原則?
- 8. PHPMD說違反單一職責原則具有布爾默認值參數
- 9. 什麼時候違反單一責任原則是合理的?
- 10. 單一職責原則綜合類
- 11. 瞭解單一職責原則
- 12. 單一職責原則和聚合
- 13. 單一責任原則是否適用於職能?
- 14. 「迴歸成功」的方法是否違反單一責任原則?
- 15. 自並流測試模式是否違反單一責任原則?
- 16. 以下代碼中的類CommaDelimLog是否違反單一責任原則?
- 17. 生成器設計模式是否違反單一責任原則?
- 18. 實用課程是否允許使用單一職責原則(SRP)
- 19. 抽象工廠違反單一責任原則?
- 20. 違反Java核心迭代器中的單一責任原則
- 21. IClientValidatable實現是否違反了MVC中的DRY原則?
- 22. 單一職責原則在特定代碼上的實施
- 23. 單一職責原則和實體類別
- 24. 單一職責原則:職業水平或方法水平
- 25. 您違反單一責任原則的最佳範例是什麼?
- 26. 單一職責
- 27. SOLID - 單一職責原則是否適用於班級中的方法?
- 28. 違反SOLID原則
- 29. 爲什麼一個類沒有實現ISerializable接口違反MissingSerializationConstructorRule
- 30. 這個班是否遵循單一責任原則?
如果該單一責任需要它實現多個接口,則不是。 – oldrinb 2012-08-07 23:05:41