Sobes.tech
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.