2012-08-07 104 views

回答

13

我不会说自己。一个班级可以承担一个责任,但是在这个过程中要做很多事情,并且为了履行其责任所需要做的每件事情都要实现一个界面。

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

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

0

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

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

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

1

也许,但不一定。

接口不是一个责任。 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规则更多的是确保您按照特定的思路思考,而不是每次盲目追随他们。

相关问题