观察者设计模式方法在做两件事时是否违反SRP:设置和通知

时间:2018-03-26 12:10:43

标签: java design-patterns observer-pattern

我刚刚从this link的观察者设计模式中读取了此示例代码。但是,是否有人可以解释 setState方法(不询问Subject类)是否正在做两件事(设置state并通知{{ 1}})?

如果是,那么方法observers是否违反了单一责任原则(SRP)?

如果否,那么我们如何才能正确理解SRP?提前谢谢。

我也关注this topic,但找不到合适的答案。

setState

3 个答案:

答案 0 :(得分:1)

我将引用罗伯特·C·马丁(鲍勃叔叔)的话:

  

SRP:单一责任原则   一个班级改变的理由绝不应该是一个原因。

ref.

所以一个类可以做多个事情,只要它只有一个改变的理由。

我说你没事。

答案 1 :(得分:1)

问题是关于方法'setState'是否做了两件事。答案是否定的。

引用“清洁代码”第36页:

  

如果一个函数只执行比函数声明的名称低一级的那些步骤,那么该函数正在做一件事。毕竟,我们编写函数的原因是将更大的概念(换句话说,函数的名称)分解为下一个抽象级别的一组步骤。 ...因此,另一种知道函数不仅仅是“一件事”的方法是,如果你可以从中提取另一个函数,其名称不仅仅是对其实现的重述。

难点在于名称'setState(int state)'表示函数设置状态(使用this.state = state;)然后调用另一个函数,做两件事。

if ($.fn.WOW) { //statement }

}

但是,如果我们将函数重命名为processChange(),那么很明显该函数包括在两个步骤中做一件事(处理变更)(1.设置状态和2.通知观察者,'上面引用中的下一个抽象级别的步骤。

public void setState(int state) {
 this.state = state;
 notifyAllObservers();

}

答案 2 :(得分:1)

来自给定link的示例并不是很好,命名setState()会引起混淆,因为它会通知(与设置无关)。

将名称更改为例如在这种情况下,processStateChanged()会有所帮助。