Я читаю «Чистый код» от Роберта C. Мы с Мартином не можем полностью понять разделы «Не иметь побочных эффектов» и «Выходные аргументы» на страницах с 44 по 45.
В разделе «Не иметь побочных эффектов» указано, что изменения передаются в параметры метода считаются побочными эффектами и не должны выполняться.
В разделе «Выходные аргументы» указано, что параметры метода не должны изменяться. Метод должен изменять состояние своего объекта-владельца только в том случае, если необходимо изменить какое-либо состояние.
Я понимаю, что побочные эффекты и выходные аргументы могут привести к запутанному поведению и ошибкам, если метод, который действительно определяет это поведение, вызывается клиентом, который не полностью осведомлен об этом. Кроме того, это проблематично c при работе в многопоточной среде.
Но, учитывая, что книга «Чистый код» написана на основе примеров с 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);
Это изменит статус player1, а также статус player2. Это не одобряется Робертом C. Мартин в большинстве случаев. Но на самом деле я вижу эту картину очень часто. Большинство Java программ, которые действительно имеют мутации и объекты, изменяются вне области, в которой они были созданы.
Если мы создаем битву, в которой меняются оба игрока, это еще хуже, потому что теперь другой объект мутирует два параметры внутри его метода:
battle.fight(player1, player2)
Я что-то здесь пропускаю? Когда можно изменять параметры внутри метода (в Java)? Я задал довольно похожий вопрос: go ( Является ли изменение параметров объекта в методе (в Java) плохой практикой? ).