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.