[我正在阅读Robert C. Martin的'Clean Code',但我无法完全理解第44-45页上的'Hear no副作用'和'Output Arguments'部分。
在“没有副作用”部分中,声明传递给方法参数的更改被认为是副作用,不应进行。
在“输出参数”部分中指出,方法的参数不应突变。如果必须更改某个状态,则方法仅应更改其拥有对象的状态。
我的理解是,如果确实没有意识到这一点的客户端调用了指定这种行为的方法,则副作用和输出参数会导致混乱的行为和错误。在多线程环境中工作时,这也是有问题的。
但是关于“ Clean Code”这本书是基于Java的示例编写的,我很困惑。
让我们看一个例子。假设我们有一个玩家类:
public class Player { private int healthPoints; private boolean alive = true; public Player(int healthPoints) { if(healthPoints < 1) { throw new IllegalArgumentException(); } this.healthPoints = healthPoints; } public boolean isAlive() { return this.alive; } public void fight(Player otherPlayer) { //do some fighting which will change this instance // but also the otherPlayer instance } }
如果现在调用以下函数:
player1.fight(player2);
这将更改玩家1的状态以及玩家2的状态。大多数情况下,Robert C. Martin不建议这样做。但实际上,我经常看到这种模式。实际上,大多数有关变异和对象的Java程序都在其创建范围之外进行了更改。
如果我们进行一场改变双方玩家的战斗,那就更糟了,因为现在另一个对象在其方法内改变了两个参数:
battle.fight(player1, player2)
我想念这里的东西吗?什么时候可以对方法内部的参数进行突变(在Java中)?不久前,我问了一个类似的问题(Is mutating object-parameters in a method(in Java) a bad practice?)。
我正在阅读Robert C. Martin的'Clean Code',但我无法完全理解第44-45页上的'没有副作用'和'输出参数'部分。在'没有副作用'中部分...
归根结底,这些规则通过消除意外行为而使程序员的生活更轻松。他们帮助人们对程序进行推理。因此,关键是要确保您可以看一行代码并了解它的作用。