Sobes.tech
Middle+

Чӣ гуна тағйирнопазирӣ ва покӣ ба ҳам алоқаманданд?

sobes.tech AI

Ҷавоб аз AI

Иммутабелӣ (беғаразии объектҳо) ва тозагӣ (функсияҳо бе таъсири тарафҳо) ба ҳам наздик алоқаманданд, зеро иммутабелӣ кӯмак мекунад, ки тозагӣ ба даст ояд.

Функсияи тоза:

  • Ҳамеша натиҷаи якхела барои маълумоти воридотӣ медиҳад.
  • Ҳолати берун аз доираи худ (таъсири тарафҳоро) тағир намедиҳад.

Агар функсия ҳамчун аргументҳо объектҳои тағирёбанда қабул кунад ва онҳоро тағир диҳад, он тоза нест, зеро даъвати он метавонад ҳолати системаро берун аз функсия тағир диҳад.

Бо истифода аз объектҳои иммутабел:

  • Функсия наметавонад объектҳои додаашударо тағир диҳад, зеро онҳо ғайриқобили тағирот мебошанд.
  • Ҳар гуна "тағйирот" ба эҷоди объектҳои нав оварда мерасонад, на ба тағир додани мавҷуда.
  • Ин кафолат медиҳад, ки таъсири тарафҳо, ки бо тағир додани аргументҳои додашуда алоқаманданд, вуҷуд надорад.

Масалан:

<?php

// Объекти тағирёбанда
class MutablePoint {
    public $x;
    public $y;

    public function __construct($x, $y) {
        $this->x = $x;
        $this->y = $y;
    }
}

// Функсияи нозоиш (тағйир медиҳад объект додаашударо)
function moveMutablePoint(MutablePoint $point, $dx, $dy) {
    $point->x += $dx;
    $point->y += $dy;
}

$mutablePoint = new MutablePoint(0, 0);
moveMutablePoint($mutablePoint, 1, 1);
// $mutablePoint ҳоло (1, 1) - ҳолат берун аз функсия тағир ёфт

// Объекти иммутабел
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;
    }

    // Метод возвращает НОВИЙ объект, а не изменяет текущий
    public function move($dx, $dy): self {
        return new self($this->x + $dx, $this->y + $dy);
    }
}

// Функсияи тоза (кор мекунад бо объектҳои иммутабел)
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) - ҳолат дар берун аз функсия тағир наёфтааст
// $newImmutablePoint ҳоло (1, 1) - объект нав эҷод шудааст

Бинобар ин, истифодаи объектҳои иммутабел яке аз роҳҳои эҷоди функсияҳои тоза мебошад, ки ба коди пешгӯишаванда, тестшаванда ва осонтар нигоҳдошташаванда кӯмак мекунад.