如何不违反单一职责原则?

How to not violate Single Responsibility Principle?

我是编程新手,正在学习设计方面的知识。

有人告诉我 SRP 非常重要,因此每个 class 都应该承担一项责任。因此,我想继承其他 classes 的职责。但是后来,我意识到 java 不允许多重继承,只允许接口。我认为实现多个接口的问题是你必须在实现接口的 class 中编写方法。所以你要到实现接口的class去修复方法。那还不算违反SRP?

简而言之,我想要一个 class A,比如狗,它构造一个东西,需要关于 A 的方法 B(bark)、C(eat) 和 D(sleep)。我如何在不违反 SRP 的情况下做到这一点?

SRP 通常表示为 "Every class should have one responsibility,",但这是不准确的。更好的说法是,"A module should have one and only one reason to change." 正如我在 Single Responsibility Principle: Is It a Fundamental Mistake? 中所描述的,我可以想到两个可能的变化轴:

  1. 业务变化
  2. 技术变革

将业务更改减少到 "one reason to change" 意味着业务中应该只有一个人要求您更改特定模块。例如,一些可能要求改变的人是产品负责人或设计负责人。所以这意味着我们应该将事物的行为与其外观分开。

技术变革的一个例子是改变事物的存储方式。 "We need to change from an SQL database to flat NoSQL storage."

所以它的作用、外观、它所依赖的基础设施——这些都是应该分开的东西。不是你的狗。界面隔离原则导致了界面的薄片,比如 Barking 和 Eating。这使调用者能够依赖于这些薄片,而不是依赖于像 Animal 这样有很多不需要的东西的巨大接口。

所以我会说

class Dog: Barking & Eating & Sleeping

不一定违反 SRP,尤其是当每个接口都很薄时。

就是说,我见过有人将不相关的界面拼凑在一起来制造怪物。这主要是懒惰地使用现有 class 作为垃圾场的结果。只要你不断地问,"Can this be separated?" 看看你是否能推卸责任,你就比大多数人做得更好。