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