观察者设计模式方法在做两件事时是否违反SRP:设置和通知
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了观察者设计模式方法在做两件事时是否违反SRP:设置和通知相关的知识,希望对你有一定的参考价值。
我刚刚从this link的观察者设计模式中读取了这个示例代码。但是,任何人都可以解释是否setState
方法(不询问Subject
类)是做2件事(设置state
并通知observers
)?
如果是,那么setState
方法是否违反了单一责任原则(SRP)?
如果否,那么我们如何才能正确理解SRP?先感谢您。
我也跟着this topic但找不到合适的答案。
public class Subject {
private List<Observer> observers = new ArrayList<Observer>();
private int state;
public void setState(int state) {
this.state = state;
notifyAllObservers();
}
public void notifyAllObservers(){
for (Observer observer : observers) {
observer.update();
}
}
// [...omitted other unrelated methods...]
}
问题是明确的方法'setState'是否做了两件事。答案是不。
引用“清洁代码”第36页:
如果一个函数只执行比函数的声明名称低一级的那些步骤,那么该函数正在做一件事。毕竟,我们编写函数的原因是将更大的概念(换句话说,函数的名称)分解为下一个抽象级别的一组步骤。 ...因此,另一种知道函数不仅仅是“一件事”的方法是,如果你可以从中提取另一个函数,其名称不仅仅是对其实现的重述。
困难在于名称'setState(int state)'表明该函数设置状态(使用this.state = state;)然后调用另一个函数,做两件事。
public void setState(int state) {
this.state = state;
notifyAllObservers();
}
但是,如果我们将函数重命名为processChange(),则很明显该函数包括以2个步骤执行1个事务(处理更改)(1。设置状态和2.通知观察者,'上面引用中的下一级抽象'。
public void processChange(int state) {
this.state = state;
notifyAllObservers();
}
我要引用罗伯特·C·马丁(鲍勃叔叔)的话:
SRP:单一责任原则一个班级改变的理由永远不应有多于一个。
(Qazxswpoi)
因此,只要一个类只有一个改变的理由,一个类可以做多个事情。
我会说你很好。
来自给定的ref.的例子并不是很好,命名link会引起混淆,因为它会通知(与设置无关)。
将名称更改为例如setState()
将在这种情况下提供帮助。
以上是关于观察者设计模式方法在做两件事时是否违反SRP:设置和通知的主要内容,如果未能解决你的问题,请参考以下文章