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

问题描述 投票:1回答:3

我刚刚从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...]
}
java design-patterns observer-pattern
3个回答
1
投票

问题是明确的方法'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();

}


1
投票

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

SRP:单一责任原则一个班级改变的理由永远不应有多于一个。

(Qazxswpoi)

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

我会说你很好。


1
投票

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

将名称更改为例如setState()将在这种情况下提供帮助。

© www.soinside.com 2019 - 2024. All rights reserved.