实现多个接口是否违反单一职责原则?

16

来自维基百科:

单一职责原则指每个类应该只有一个单一的功能,并且该功能完全由该类封装。

这是否意味着实现多个接口会违反这个原则?


5
如果这个单一的责任需要实现多个接口,那就不行。 - obataku
3个回答

18

我认为单独来看并不能。一个类可以有一个职责,但在过程中做多个事情,并为每组需要执行的事情实现一个接口以履行其职责。

此外,在Java中,接口可用于说明类具有哪些属性(例如ComparableSerializable ),但并未说明类的职责。

然而,如果一个类实现多个接口,每个接口都对应一个职责,那么就会违反这个原则。


4

可能,但不一定。

接口并不是一个职责。有一种非常强大的架构模式(链接)将接口视为定义对象在应用程序中可能扮演的角色

想想这意味着什么。您可以拥有一个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规则更多的是确保您沿着某些思路思考,而不是每次都盲目跟随它们。

3
"单一职责原则"取决于抽象级别。例如,一个复杂的系统,在系统级别考虑时,可能只有一个职责。例如,电视系统的职责是显示视频画面。在下一个更低的级别,该系统由子系统、监视器、电源单元等组成。在这个级别,每个单元都有自己的职责。
同样地,一个类在一个级别上可能被认为具有单一职责。但是,在更低的级别上,它可能有其他组成模块(类、接口等)来执行其工作的部分。例如,学生类的职责是表示学生抽象。然而,它可能有另一个单元(一个类)来表示学生的地址。
以这种方式使用多个接口本身并不违反面向对象的原则。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接