Middle+
Ako súvisia nemennosť a čistota?
sobes.tech AI
Odpoveď od AI
Imutabilita (nezmenljivost objektov) a čistota (funkcie bez vedľajších efektov) sú úzko prepojené, pretože imutabilita prispieva k dosiahnutiu čistoty.
Čistá funkcia:
- Vždy vracia rovnaký výsledok pre rovnaké vstupné údaje.
- Nemodifikuje stav mimo svojej oblasti viditeľnosti (nemá vedľajšie efekty).
Ak funkcia prijíma ako argumenty meniteľné objekty a modifikuje ich, nie je čistá, pretože jej volanie môže zmeniť stav systému mimo funkcie.
Použitím imutabilných objektov:
- Funkcia nemôže zmeniť odovzdané objekty, pretože sú nezmeniteľné.
- Akákoľvek "zmena" vedie k vytvoreniu nového objektu, nie k modifikácii existujúceho.
- To zaručuje absenciu vedľajších efektov spojených so zmenou odovzdaných argumentov.
Príklad:
<?php
// Meniteľný objekt
class MutablePoint {
public $x;
public $y;
public function __construct($x, $y) {
$this->x = $x;
$this->y = $y;
}
}
// Nečistá funkcia (mení odovzdaný objekt)
function moveMutablePoint(MutablePoint $point, $dx, $dy) {
$point->x += $dx;
$point->y += $dy;
}
$mutablePoint = new MutablePoint(0, 0);
moveMutablePoint($mutablePoint, 1, 1);
// $mutablePoint teraz (1, 1) - stav sa zmenil mimo funkcie
// Imutabilný 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;
}
// Metóda vracia NOVÝ objekt, nie mení aktuálny
public function move($dx, $dy): self {
return new self($this->x + $dx, $this->y + $dy);
}
}
// Čistá funkcia (pracuje s imutabilnými objektmi)
function moveImmutablePoint(ImmutablePoint $point, $dx, $dy): ImmutablePoint {
return $point->move($dx, $dy);
}
$immutablePoint = new ImmutablePoint(0, 0);
$newImmutablePoint = moveImmutablePoint($immutablePoint, 1, 1);
// $immutablePoint zostáva (0, 0) - stav sa nezmenil mimo funkcie
// $newImmutablePoint je (1, 1) - vytvorený je nový objekt
Použitie imutabilných objektov je teda jedným zo spôsobov tvorby čistých funkcií, čo prispieva k predvídateľnejšiemu, testovateľnejšiemu a ľahšie udržiavateľnému kódu.