Middle+
Kaip yra susiję nekintamumas ir grynumas?
sobes.tech AI
Atsakymas iš AI
Immutabilumas (nepakitumas objektų) ir švarumas (funkcijos be šalutinių poveikių) yra glaudžiai susiję, nes imutabilumas prisideda prie švaros pasiekimo.
Švari funkcija:
- Visada grąžina tą patį rezultatą tiems patiems įvesties duomenims.
- Nekeičiama už savo matymo srities ribų (neturi šalutinių poveikių).
Jei funkcija priima kaip argumentus keičiamus objektus ir juos modifikuoja, ji nėra švari, nes jos iškvietimas gali pakeisti sistemos būseną už funkcijos ribų.
Naudojant imutabilius objektus:
- Funkcija negali pakeisti perduotų objektų, nes jie yra nepakitę.
- Bet kokie "pakeitimai" sukelia naujo objekto sukūrimą, o ne esamo modifikavimą.
- Tai užtikrina, kad nebūtų šalutinių poveikių, susijusių su perduotų argumentų keitimu.
Pavyzdys:
<?php
// Keičiamas objektas
class MutablePoint {
public $x;
public $y;
public function __construct($x, $y) {
$this->x = $x;
$this->y = $y;
}
}
// Neteisinga funkcija (keičia perduotą objektą)
function moveMutablePoint(MutablePoint $point, $dx, $dy) {
$point->x += $dx;
$point->y += $dy;
}
$mutablePoint = new MutablePoint(0, 0);
moveMutablePoint($mutablePoint, 1, 1);
// $mutablePoint dabar (1, 1) - būseną pakeitė už funkcijos ribų
// Nepakitęs objektas
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;
}
// Metodas grąžina NAUJĄ objektą, o ne keičia esamą
public function move($dx, $dy): self {
return new self($this->x + $dx, $this->y + $dy);
}
}
// Švari funkcija (dirba su imutabiliais objektais)
function moveImmutablePoint(ImmutablePoint $point, $dx, $dy): ImmutablePoint {
return $point->move($dx, $dy);
}
$immutablePoint = new ImmutablePoint(0, 0);
$newImmutablePoint = moveImmutablePoint($immutablePoint, 1, 1);
// $immutablePoint lieka (0, 0) - būseną pakeitė ne funkcijos ribose
// $newImmutablePoint dabar (1, 1) - sukurtas naujas objektas
Taigi, naudojant imutabilius objektus, galima sukurti švarias funkcijas, kurios prisideda prie labiau prognozuojamo, testuojamo ir lengvai prižiūrimo kodo.