观察者设计模式方法在做两件事时是否违反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:设置和通知的主要内容,如果未能解决你的问题,请参考以下文章

javascript addEventListener做两件事

如何让 C++ 程序同时做两件事?

让一个端口同时做两件事:http/https和ssh

手机被偷前必做的两件事

Facade模式是否违反SOLID原则?

C++:在不违反 SRP 的情况下向多态类层次结构添加方法?