Middle+
Como estão relacionados a imutabilidade e a pureza?
sobes.tech IA
Resposta da IA
A imutabilidade (objetos não modificáveis) e a pureza (funções sem efeitos colaterais) estão estreitamente relacionadas, pois a imutabilidade ajuda a alcançar a pureza.
Função pura:
- Sempre devolve o mesmo resultado para os mesmos dados de entrada.
- Não altera o estado fora do seu âmbito (não tem efeitos colaterais).
Se uma função aceita objetos mutáveis como argumentos e os modifica, ela não é pura, pois a sua chamada pode alterar o estado do sistema fora da função.
Usando objetos imutáveis:
- A função não pode alterar os objetos passados, pois eles são imutáveis.
- Qualquer "alteração" resulta na criação de um novo objeto, não na modificação do existente.
- Isto garante a ausência de efeitos colaterais relacionados com a alteração dos argumentos passados.
Exemplo:
<?php
// Objeto mutável
class MutablePoint {
public $x;
public $y;
public function __construct($x, $y) {
$this->x = $x;
$this->y = $y;
}
}
// Função não pura (altera o objeto passado)
function moveMutablePoint(MutablePoint $point, $dx, $dy) {
$point->x += $dx;
$point->y += $dy;
}
$mutablePoint = new MutablePoint(0, 0);
moveMutablePoint($mutablePoint, 1, 1);
// $mutablePoint agora é (1, 1) - o estado mudou fora da função
// Objeto imutável
final class ImmutablePoint {
private $x;
private $y;
public function __construct($x, $y) {
$this->x = $x;
$this->y = $y;
}
public function getX(): int {
return $this->x;
}
public function getY(): int {
return $this->y;
}
// O método devolve UM NOVO objeto, não altera o atual
public function move($dx, $dy): self {
return new self($this->x + $dx, $this->y + $dy);
}
}
// Função pura (trabalha com objetos imutáveis)
function moveImmutablePoint(ImmutablePoint $point, $dx, $dy): ImmutablePoint {
return $point->move($dx, $dy);
}
$immutablePoint = new ImmutablePoint(0, 0);
$newImmutablePoint = moveImmutablePoint($immutablePoint, 1, 1);
// $immutablePoint permaneceu em (0, 0) - o estado não mudou fora da função
// $newImmutablePoint agora é (1, 1) - um novo objeto foi criado
Assim, o uso de objetos imutáveis é uma das formas de criar funções puras, o que contribui para um código mais previsível, testável e fácil de manter.