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) - ստեղծվել է նոր օբյեկտ

Այսպիսով, անփոփոխելի օբյեկտների օգտագործումը հանդիսանում է մաքուր գործառույթներ ստեղծելու մի միջոց, ինչը նպաստում է ավելի կանխատեսելի, թեստավորվող և հեշտությամբ պահպանվող կոդի։