Sobes.tech
Middle+

Kako su nepokolebljivost i čistoća povezani?

sobes.tech АИ

Одговор од АИ

Иммутабилност (непроменљивост објеката) и чистота (функције без споредних ефеката) су тесно повезане, јер иммутабилност доприноси постизању чистоте.

Чиста функција:

  • Увек враћа исти резултат за исте улазне податке.
  • Не мења стање ван своје области видљивости (нема споредне ефекте).

Ако функција прихвата као аргументе променљиве објекте и модификује их, она није чиста, јер њен позив може променити стање система ван функције.

Користећи иммутабилне објекте:

  • Функција не може променити предате објекте, јер су неизменљиви.
  • Свако "промена" доводи до стварања новог објекта, а не до модификације постојећег.
  • Ово гарантује одсуство споредних ефеката везаних за промену предатих аргумената.

Пример:

<?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) - створен је нови објекат

Стога, коришћење иммутабилних објеката је један од начина стварања чистих функција, што доприноси предвидљивијем, тестирањем и лакше одрживом коду.