我只是从this link的观察者设计模式中读取了此示例代码。但是,谁能解释setState
方法(不询问Subject
类)是否在做两件事(设置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;),然后调用另一个函数,执行2件事。
public void setState(int state) {
this.state = state;
notifyAllObservers();
}
但是,如果我们将函数重命名为processChange(),则很明显,该函数包括2个步骤(1.设置状态和2.通知观察者,即“上一引文中的下一个抽象层次)。
public void processChange(int state) {
this.state = state;
notifyAllObservers();
}