Middle+
Cum sunt legate imutabilitatea și puritatea?
sobes.tech AI
Răspuns de la AI
Imutabilitatea (obiecte neschimbabile) și puritatea (funcții fără efecte secundare) sunt strâns legate, deoarece imutabilitatea contribuie la atingerea purității.
Funcție pură:
- Returnează întotdeauna același rezultat pentru aceleași date de intrare.
- Nu modifică starea în afara domeniului său (nu are efecte secundare).
Dacă o funcție acceptă obiecte modificabile ca argumente și le modifică, ea nu este pură, deoarece apelul său poate schimba starea sistemului în afara funcției.
Folosind obiecte imutabile:
- Funcția nu poate modifica obiectele transmise, deoarece acestea sunt imutabile.
- Orice "modificare" duce la crearea unui nou obiect, nu la modificarea celui existent.
- Acest lucru garantează absența efectelor secundare legate de modificarea argumentelor transmise.
Exemplu:
<?php
// Obiect modificabil
class MutablePoint {
public $x;
public $y;
public function __construct($x, $y) {
$this->x = $x;
$this->y = $y;
}
}
// Funcție nepură (modifică obiectul transmis)
function moveMutablePoint(MutablePoint $point, $dx, $dy) {
$point->x += $dx;
$point->y += $dy;
}
$mutablePoint = new MutablePoint(0, 0);
moveMutablePoint($mutablePoint, 1, 1);
// $mutablePoint acum este (1, 1) - starea s-a schimbat în afara funcției
// Obiect imutabil
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;
}
// Metoda returnează UN NOU obiect, nu modifică cel existent
public function move($dx, $dy): self {
return new self($this->x + $dx, $this->y + $dy);
}
}
// Funcție pură (lucrează cu obiecte imutabile)
function moveImmutablePoint(ImmutablePoint $point, $dx, $dy): ImmutablePoint {
return $point->move($dx, $dy);
}
$immutablePoint = new ImmutablePoint(0, 0);
$newImmutablePoint = moveImmutablePoint($immutablePoint, 1, 1);
// $immutablePoint rămâne (0, 0) - starea nu s-a schimbat în afara funcției
// $newImmutablePoint acum este (1, 1) - s-a creat un nou obiect
Folosirea obiectelor imutabile este una dintre modalitățile de a crea funcții pure, ceea ce contribuie la un cod mai previzibil, testabil și ușor de întreținut.