Sobes.tech
Middle+

Kuidas on seotud muutumatuse ja puhtusega?

sobes.tech AI

Vastus AI-lt

Immutability (muutumatud objektid) ja puhtus (funktsioonid ilma kõrvalmõjudeta) on tihedalt seotud, kuna immutability aitab saavutada puhtust.

Puhas funktsioon:

  • Tagastab alati sama tulemuse sama sisendi korral.
  • Ei muuda oma nähtavuspiirkonna seisundit (ilma kõrvalmõjudeta).

Kui funktsioon võtab argumentidena muudetavad objektid ja muudab neid, ei ole see puhas, kuna selle väljakutse võib muuta süsteemi seisundit väljaspool funktsiooni.

Kasutades immutabeleid objekte:

  • Funktsioon ei saa muuta edastatud objekte, kuna need on muutumatud.
  • Iga "muutus" põhjustab uue objekti loomise, mitte olemasoleva muutmise.
  • See tagab, et ei ole kõrvalmõjusid, mis on seotud edastatud argumentide muutmisega.

Näide:

<?php

// Muudetav objekt
class MutablePoint {
    public $x;
    public $y;

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

// Ebapuhas funktsioon (muudab edastatud objekti)
function moveMutablePoint(MutablePoint $point, $dx, $dy) {
    $point->x += $dx;
    $point->y += $dy;
}

$mutablePoint = new MutablePoint(0, 0);
moveMutablePoint($mutablePoint, 1, 1);
// $mutablePoint on nüüd (1, 1) - seisund muutus väljaspool funktsiooni

// Muutumat 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;
    }

    // Meetod tagastab UUE objekti, mitte ei muuda olemasolevat
    public function move($dx, $dy): self {
        return new self($this->x + $dx, $this->y + $dy);
    }
}

// Puhas funktsioon (töötab immutabelitega)
function moveImmutablePoint(ImmutablePoint $point, $dx, $dy): ImmutablePoint {
    return $point->move($dx, $dy);
}

$immutablePoint = new ImmutablePoint(0, 0);
$newImmutablePoint = moveImmutablePoint($immutablePoint, 1, 1);
// $immutablePoint jääb samaks (0, 0) - seisund ei muutu väljaspool funktsiooni
// $newImmutablePoint on (1, 1) - loodud on uus objekt

Seega, immutabelite objektide kasutamine on üks viis puhaste funktsioonide loomisel, mis soodustab etteaimatavat, testitavat ja kergesti hooldatavat koodi.