13

来自维基百科

单一职责原则指出每个类都应该有单一职责,并且该职责应该完全由类封装。

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

4

3 回答 3

15

我会说不是自己。一个类可以有一个职责,但在这个过程中做多件事情,并为履行其职责需要做的每一件事情实现一个接口。

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

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

于 2012-08-07T23:04:57.567 回答
2

也许,但不一定。

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

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

于 2015-07-20T19:29:34.157 回答
1

“单一职责”取决于抽象级别。例如,一个复杂的系统,在系统级别上考虑它,可能有一个责任。例如,电视系统的职责是显示视频画面。在下一个较低级别,该系统由子系统、监视器、电源单元等组成。在这个级别,这些单元中的每一个都有自己的职责。

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

这样,使用多个接口本身并不违反面向对象的原则。

于 2012-08-08T03:44:15.433 回答