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) - створен је нови објекат
Стога, коришћење иммутабилних објеката је један од начина стварања чистих функција, што доприноси предвидљивијем, тестирањем и лакше одрживом коду.