Middle+
Nimlik va pokliklik qanday bog'liq?
sobes.tech AI
AIdan javob
O'zgarmaslik (o'zgarmas ob'ektlar) va toza (yon ta'sir qilmaydigan funktsiyalar) yaqindan bog'liq, chunki o'zgarmaslik toza bo'lishga yordam beradi.
Toza funktsiya:
- Har doim bir xil kirish ma'lumotlari uchun bir xil natijani qaytaradi.
- O'zining doirasidan tashqaridagi holatni o'zgartirmaydi (yon ta'sirlar yo'q).
Agar funktsiya o'zgartiriladigan ob'ektlarni argument sifatida olsa va ularni o'zgartirsa, u toza emas, chunki uning chaqirilishi tashqaridagi tizim holatini o'zgartirishi mumkin.
O'zgarmas ob'ektlardan foydalanib:
- Funktsiya berilgan ob'ektlarni o'zgartira olmaydi, chunki ular o'zgarmas.
- Har qanday "o'zgartirish" yangi ob'ekt yaratishga olib keladi, mavjudini o'zgartirish emas.
- Bu berilgan argumentlarning o'zgarishi bilan bog'liq yon ta'sirlarning oldini oladi.
Misol:
<?php
// O'zgartiriladigan ob'ekt
class MutablePoint {
public $x;
public $y;
public function __construct($x, $y) {
$this->x = $x;
$this->y = $y;
}
}
// Toza bo'lmagan funktsiya (berilgan ob'ektni o'zgartiradi)
function moveMutablePoint(MutablePoint $point, $dx, $dy) {
$point->x += $dx;
$point->y += $dy;
}
$mutablePoint = new MutablePoint(0, 0);
moveMutablePoint($mutablePoint, 1, 1);
// $mutablePoint endi (1, 1) - holat tashqarida o'zgardi
// O'zgarmas ob'ekt
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 YANGI ob'ektni qaytaradi, mavjudini o'zgartirmaydi
public function move($dx, $dy): self {
return new self($this->x + $dx, $this->y + $dy);
}
}
// Toza funktsiya (o'zgarmas ob'ektlar bilan ishlaydi)
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) da qoldi - holat tashqarida o'zgarmadi
// $newImmutablePoint endi (1, 1) - yangi ob'ekt yaratildi
Shu tarzda, o'zgarmas ob'ektlardan foydalanish toza funktsiyalar yaratishning usullaridan biridir, bu esa kodni yanada bashoratli, test qilish oson va oson qo'llab-quvvatlashga yordam beradi.