Sobes.tech
Middle+

Jak jsou spojeny neměnnost a čistota?

sobes.tech AI

Odpověď od AI

Nem měnitelnost (nem měnitelné objekty) a čistota (funkce bez vedlejších efektů) jsou úzce spojeny, protože neměnitelnost přispívá k dosažení čistoty.

Čistá funkce:

  • Vždy vrací stejný výsledek pro stejné vstupní údaje.
  • Nemění stav mimo svůj rozsah (nem má vedlejší efekty).

Pokud funkce přijímá jako argumenty měnitelné objekty a tyto mění, není čistá, protože její volání může změnit stav systému mimo funkci.

Použitím neměnitelných objektů:

  • Funkce nemůže změnit předané objekty, protože jsou neměnitelné.
  • Jakákoli "změna" vede ke vzniku nového objektu, nikoli ke změně stávajícího.
  • To zajišťuje absenci vedlejších efektů spojených se změnou předaných argumentů.

Příklad:

<?php

// Měnitelný objekt
class MutablePoint {
    public $x;
    public $y;

    public function __construct($x, $y) {
        $this->x = $x;
        $this->y = $y;
    }
}

// Není čistá funkce (mění předaný objekt)
function moveMutablePoint(MutablePoint $point, $dx, $dy) {
    $point->x += $dx;
    $point->y += $dy;
}

$mutablePoint = new MutablePoint(0, 0);
moveMutablePoint($mutablePoint, 1, 1);
// $mutablePoint je nyní (1, 1) - stav se změnil mimo funkci

// Neměnitelný objekt
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;
    }

    // Metoda vrací NOVÝ objekt, nemění ten stávající
    public function move($dx, $dy): self {
        return new self($this->x + $dx, $this->y + $dy);
    }
}

// Čistá funkce (pracuje s neměnitelnými objekty)
function moveImmutablePoint(ImmutablePoint $point, $dx, $dy): ImmutablePoint {
    return $point->move($dx, $dy);
}

$immutablePoint = new ImmutablePoint(0, 0);
$newImmutablePoint = moveImmutablePoint($immutablePoint, 1, 1);
// $immutablePoint zůstal na (0, 0) - stav se nezměnil mimo funkci
// $newImmutablePoint je nyní (1, 1) - byl vytvořen nový objekt

Použití neměnitelných objektů je jedním ze způsobů, jak vytvářet čisté funkce, což přispívá k předvídatelnějšímu, testovatelnějšímu a snadno udržovatelnému kódu.