实施多个接口是否违反单一责任原则?

时间:2012-08-07 23:02:05

标签: oop language-agnostic multiple-inheritance solid-principles single-responsibility-principle

来自Wikipedia

  

单一责任原则规定每个班级都应该有一个   单一责任,责任应该完全   由班级封装。

这是否意味着实施多个接口违反了这一原则?

3 个答案:

答案 0 :(得分:14)

我不会说它本身。一个类可以有一个责任,但在这个过程中做多个事情,并为履行其职责所需要做的每一组事情实现一个接口。

此外,Java中的接口可用于说明类具有哪些属性(例如,ComparableSerializable),但不能真正说出类的责任。

但是,如果一个类实现了多个接口,每个接口都对应一个责任,将违反该原则。

答案 1 :(得分:2)

可能,但不一定。

界面不是责任。 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规则更多的是确保您按照某些方式思考,而不是每次都盲目地遵循它们。

答案 2 :(得分:1)

“单一责任”取决于抽象程度。例如,在系统级考虑它的复杂系统可能有一个责任。例如,电视系统的责任是显示视频图像。在下一个较低级别,该系统由子系统,监视器,动力装置等组成。在这个级别,每个单元都有自己的责任。

同样,一个级别的班级可能被认为只有一个责任。但是,在较低级别,它可能具有执行其部分工作的其他组成模块(类,接口等)。例如,学生班的职责是代表学生抽象。然而,它可能有另一个代表学生地址的单元(一个班级)。

通过这种方式,使用多个接口本身并不违反面向对象的原则。