将查询和修饰符分开
问题
你有一个方法,返回一个值,但也改变一个对象内部的东西吗?
解决方案
将该方法拆分为两个单独的方法。如您所料,其中一个返回值,另一个修改对象。
之前

后

为什么重构
这种分解技术实现了命令和查询职责隔离.这个原则告诉我们将负责获取数据的代码与更改对象内部内容的代码分开。
获取数据的代码被命名为a查询.中更改内容的代码可见状态一个对象的值被命名为a修饰符.当一个查询而且修饰符结合在一起,就无法在不改变数据条件的情况下获得数据。换句话说,你问了一个问题,甚至可以在被接受的时候改变答案。当调用查询的人可能不知道方法的“副作用”时,这个问题会变得更加严重,这通常会导致运行时错误。
但请记住,副作用只有在修饰符这就改变了可见对象的状态。例如,这些字段可以从对象的公共接口、数据库中的条目、文件中的条目等中访问。如果一个修饰符只缓存一个复杂的操作并将其保存在类的私有字段中,它几乎不会引起任何副作用。
好处
- 如果你有查询这并不会改变程序的状态,您可以任意多次调用它,而不必担心仅仅因为调用方法而导致的结果中的意外变化。
缺点
- 在某些情况下,在执行命令后获取数据是很方便的。例如,当从数据库中删除内容时,您希望知道删除了多少行。
如何重构
创建一个新的查询方法返回原始方法所做的。
更改原来的方法,使其只返回调用new方法的结果查询方法.
方法的调用替换对原始方法的所有引用查询方法.在这一行之前,对修饰符的方法.这将使您避免在条件操作符或循环的条件中使用原始方法时产生的副作用。
在原来的方法中去掉返回值的代码,现在它已经成为一个合适的方法修饰符的方法.