我刚刚从this link的观察者设计模式中读取了此示例代码。但是,是否有人可以解释 setState
方法(不询问Subject
类)是否正在做两件事(设置state
并通知{{ 1}})?
如果是,那么方法observers
是否违反了单一责任原则(SRP)?
如果否,那么我们如何才能正确理解SRP?提前谢谢。
我也关注this topic,但找不到合适的答案。
setState
答案 0 :(得分:1)
答案 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()
会有所帮助。