避免输出参数(没有副作用)

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

[我正在阅读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页上的'没有副作用'和'输出参数'部分。在'没有副作用'中部分...

java coding-style parameter-passing mutate side-effects
1个回答
0
投票

归根结底,这些规则通过消除意外行为而使程序员的生活更轻松。他们帮助人们对程序进行推理。因此,关键是要确保您可以看一行代码并了解它的作用。

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