Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当做两件事:设置和通知时,观察者设计模式方法是否违反SRP_Java_Design Patterns_Observer Pattern - Fatal编程技术网

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

Java 当做两件事:设置和通知时,观察者设计模式方法是否违反SRP,java,design-patterns,observer-pattern,Java,Design Patterns,Observer Pattern,我刚刚从中的observer设计模式中阅读了这个示例代码。但是,请任何人解释一下设置状态方法(不询问主题类)是否在做两件事(设置状态并通知观察者) 如果是,那么该方法是否违反了单一责任原则(SRP) 如果没有,那么我们如何才能正确理解SRP?先谢谢你 我也跟着,但找不到合适的答案 公共类科目{ 私有列表观察员=新的ArrayList(); 私人和国家; 公共无效设置状态(int状态){ this.state=状态; notifyAllobserver(); } public void notif

我刚刚从中的observer设计模式中阅读了这个示例代码。但是,请任何人解释一下
设置状态
方法
(不询问
主题
类)是否在做两件事(设置
状态
并通知
观察者

如果是,那么该方法是否违反了单一责任原则(SRP)

如果没有,那么我们如何才能正确理解SRP?先谢谢你

我也跟着,但找不到合适的答案

公共类科目{
私有列表观察员=新的ArrayList();
私人和国家;
公共无效设置状态(int状态){
this.state=状态;
notifyAllobserver();
}
public void notifyAllobserver(){
观察员(观察员:观察员){
observer.update();
}
}
//[…省略了其他不相关的方法…]
}

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

SRP:单一责任原则 一个类改变的原因不应该超过一个

()

因此,一个类可以做不止一件事,只要它只有一个改变的理由


我得说你很好。

问题在于方法“setState”是否有两个功能。答案是否定的

引用“清洁代码”第36页:

如果一个函数只执行比函数名称低一级的步骤,那么该函数只执行一件事。毕竟,我们编写函数的原因是将一个更大的概念(换句话说,函数的名称)分解为下一级抽象的一组步骤。。。因此,了解一个函数所做的不仅仅是“一件事”的另一种方法是,如果您可以从它提取另一个函数,并使用一个名称,而不仅仅是对其实现的重述

困难在于名称“setState(int state)”表示函数设置状态(使用this.state=state;),然后调用另一个函数,执行两项操作

public void setState(int state) {
 this.state = state;
 notifyAllObservers();
}

但是,如果我们将函数重命名为processChange(),则很明显,该函数包含两个步骤(1.设置状态和2.通知观察者,即上面引用的“下一抽象级别的步骤集”)中的一件事(处理更改)


}

给定的示例不是很好,命名
setState()
在通知时会引起混淆(与设置无关)


在这种情况下,将名称更改为例如
processStateChanged()
会有所帮助

根据定义,改变主体的状态应该由观察者做出反应。因此,它没有被破坏SRP(设置状态只做一件事)通知反映任何状态更改的观察者。注意:可能重复的观察者集合确实应该是一个集合,否则您将冒向同一观察者发送重复通知的风险。@jaco0646谢谢您的回复,但是根据链接我找不到正确的答案。仍然期望有人能拥有更好的。SRP不应被解释为保证类、模块等“只做一件事”。它实际上意味着“一个改变的理由”,而这些理由就是参与者。这意味着,类中的更改,…,应该影响单个参与者。
processChange()
是一个相当模糊的名称。我们可以在该方法中放入100行代码,并声称每行代码都在处理一个更改。@jaco0646我们确实可以:“在该方法中放入100行代码,并声称每行代码都在处理一个更改”,但声明是,该方法中的代码行是下一抽象级别的一组步骤。声称他们都在“处理一个变化”会使他们处于同一个抽象层次。引用比定义容易得多。一个班级做了不止一件事,你可能会有不止一个理由去改变。一个做一件事的类很可能有不止一个改变的理由。即使如此,“改变的一个原因”本身也是令人困惑的,这就是为什么鲍勃叔叔承认许多人误解了它,并以“做一件事”为主要例子误用了它。
public void setState(int state) {
 this.state = state;
 notifyAllObservers();
public void processChange(int state) {
 this.state = state;
 notifyAllObservers();