Middle+
Dəyişməzlik və saflıq necə əlaqəlidir?
sobes.tech Süni İntellekt
AI-dan cavab
Dəyişməzlik (dəyişməz obyektlər) və saflıq (yan təsirləri olmayan funksiyalar) sıx əlaqəlidir, çünki dəyişməzlik saflığı əldə etməyə kömək edir.
Saf funksiya:
- Eyni giriş məlumatları üçün həmişə eyni nəticəni verir.
- Xaricdəki vəziyyəti dəyişmir (yan təsirləri yoxdur).
Əgər funksiya dəyişkən obyektləri arqument kimi qəbul edir və onları dəyişdirsə, o, saf deyil, çünki onun çağırışı sistemin vəziyyətini funksiyadan kənarda dəyişə bilər.
Dəyişməz obyektlərdən istifadə etməklə:
- Funksiya ona ötürülən obyektləri dəyişə bilməz, çünki onlar dəyişməzdir.
- Hər hansı "dəyişiklik" yeni obyektin yaradılmasına gətirib çıxarır, mövcudun dəyişdirilməsinə yox.
- Bu, ötürülən arqumentlərin dəyişdirilməsi ilə əlaqəli yan təsirlərin qarşısını alır.
Nümunə:
<?php
// Dəyişkən obyekt
class MutablePoint {
public $x;
public $y;
public function __construct($x, $y) {
$this->x = $x;
$this->y = $y;
}
}
// Dəyişməz funksiya (verilmiş obyekti dəyişir)
function moveMutablePoint(MutablePoint $point, $dx, $dy) {
$point->x += $dx;
$point->y += $dy;
}
$mutablePoint = new MutablePoint(0, 0);
moveMutablePoint($mutablePoint, 1, 1);
// $mutablePoint indi (1, 1) - vəziyyət dəyişib
// Dəyişməz obyekt
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;
}
// Metod YENİ obyekt qaytarır, mövcudunu dəyişmir
public function move($dx, $dy): self {
return new self($this->x + $dx, $this->y + $dy);
}
}
// Saf funksiya (dəyişməz obyektlərlə işləyir)
function moveImmutablePoint(ImmutablePoint $point, $dx, $dy): ImmutablePoint {
return $point->move($dx, $dy);
}
$immutablePoint = new ImmutablePoint(0, 0);
$newImmutablePoint = moveImmutablePoint($immutablePoint, 1, 1);
// $immutablePoint (0, 0) qalır - vəziyyət dəyişməyib
// $newImmutablePoint indi (1, 1) - yeni obyekt yaradılıb
Dəyişməz obyektlərin istifadəsi saf funksiyalar yaratmağın yollarından biridir və bu, daha proqnozlaşdırıla bilən, test edilə bilən və asan saxlanılan kod təmin edir.