Sobes.tech
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.