Sobes.tech
Middle+

Kā ir saistīta nemainīgums un tīrība?

sobes.tech AI

Atbilde no AI

Immutabilitāte (neizmaināmie objekti) un tīrība (funkcijas bez blakusparādībām) ir cieši saistītas, jo immutabilitāte veicina tīrības sasniegšanu.

Tīra funkcija:

  • Vienmēr atgriež to pašu rezultātu tiem pašiem ievades datiem.
  • Nemaina savu redzes lauku ārpus (nav blakusparādību).

Ja funkcija pieņem kā argumentus maināmus objektus un tos modificē, tā nav tīra, jo tās izsaukums var mainīt sistēmas stāvokli ārpus funkcijas.

Izmantojot immutablus objektus:

  • Funkcija nevar mainīt nodotos objektus, jo tie ir neizmaināmi.
  • Jebkura "izmaiņa" noved pie jauna objekta izveides, nevis esoša modificēšanas.
  • Tas nodrošina, ka nav blakusparādību, kas saistītas ar nodoto argumentu izmaiņām.

Piemērs:

<?php

// Maināms objekts
class MutablePoint {
    public $x;
    public $y;

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

// Netrusīga funkcija (maina nodoto objektu)
function moveMutablePoint(MutablePoint $point, $dx, $dy) {
    $point->x += $dx;
    $point->y += $dy;
}

$mutablePoint = new MutablePoint(0, 0);
moveMutablePoint($mutablePoint, 1, 1);
// $mutablePoint tagad ir (1, 1) - stāvoklis mainījās ārpus funkcijas

// Neizmaināms objekts
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;
    }

    // Metode atgriež JAUNU objektu, nevis maina esošo
    public function move($dx, $dy): self {
        return new self($this->x + $dx, $this->y + $dy);
    }
}

// Tīra funkcija (strādā ar neizmaināmiem objektiem)
function moveImmutablePoint(ImmutablePoint $point, $dx, $dy): ImmutablePoint {
    return $point->move($dx, $dy);
}

$immutablePoint = new ImmutablePoint(0, 0);
$newImmutablePoint = moveImmutablePoint($immutablePoint, 1, 1);
// $immutablePoint paliek (0, 0) - stāvoklis nav mainījies ārpus funkcijas
// $newImmutablePoint tagad ir (1, 1) - ir izveidots jauns objekts

Tādējādi, izmantojot neizmaināmus objektus, ir iespējams izveidot tīras funkcijas, kas veicina prognozējamāku, testējamu un viegli uzturamu kodu.