Sobes.tech
Middle+

Hogyan kapcsolódik egymáshoz a változhatatlanság és a tisztaság?

sobes.tech MI

Válasz az MI-től

A változatlan (nem módosítható) objektumok és a tiszta (mellékhatások nélküli) függvények szorosan összefüggnek, mivel a változatlanság segít elérni a tisztaságot.

Tiszta függvény:

  • Mindig ugyanazt az eredményt adja ugyanazokra a bemeneti adatokra.
  • Nem változtatja meg a környezeti állapotot (nincs mellékhatása).

Ha egy függvény módosítható objektumokat vesz argumentumként és módosítja azokat, akkor nem tiszta, mert a hívása megváltoztathatja a rendszer állapotát a függvényen kívül.

A változatlan objektumok használatával:

  • A függvény nem módosíthatja a kapott objektumokat, mivel azok változatlanok.
  • Bármilyen "módosítás" új objektum létrehozásához vezet, nem a meglévő módosításához.
  • Ez garantálja, hogy nincsenek mellékhatások a kapott argumentumok módosításával kapcsolatban.

Példa:

<?php

// Módosítható objektum
class MutablePoint {
    public $x;
    public $y;

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

// Nem tiszta függvény (módosítja a kapott objektumot)
function moveMutablePoint(MutablePoint $point, $dx, $dy) {
    $point->x += $dx;
    $point->y += $dy;
}

$mutablePoint = new MutablePoint(0, 0);
moveMutablePoint($mutablePoint, 1, 1);
// $mutablePoint most (1, 1) - az állapot megváltozott a függvényen kívül

// Változatlan objektum
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;
    }

    // A metódus ÚJ objektumot ad vissza, nem módosítja a meglévőt
    public function move($dx, $dy): self {
        return new self($this->x + $dx, $this->y + $dy);
    }
}

// Tiszta függvény (működik változatlan objektumokkal)
function moveImmutablePoint(ImmutablePoint $point, $dx, $dy): ImmutablePoint {
    return $point->move($dx, $dy);
}

$immutablePoint = new ImmutablePoint(0, 0);
$newImmutablePoint = moveImmutablePoint($immutablePoint, 1, 1);
// $immutablePoint marad (0, 0) - az állapot nem változott a függvényen kívül
// $newImmutablePoint most (1, 1) - új objektum lett létrehozva

Az immutábilis objektumok használata az egyik módja a tiszta függvények létrehozásának, ami elősegíti a kiszámíthatóbb, tesztelhetőbb és könnyebben karbantartható kódot.