Sobes.tech
Middle

Da li to znači da je klasa nepromenljiva ako ima javno svojstvo?

sobes.tech АИ

Одговор од АИ

Ne.

Javno svojstvo u klasi znači da se vrednost tog svojstva može menjati spolja objekta. Nepromenljiv (immutable) objekat je onaj čije stanje (vrednosti njegovih svojstava) ne može biti promenjeno nakon kreiranja. Prisustvo javnog svojstva protivreči principu nepromenljivosti.

Da bi se postigla nepromenljivost, klasa mora ispuniti sledeće uslove:

  • Sva svojstva moraju biti privatna (private) ili zaštićena (protected).
  • Ne smeju postojati setteri (metodi koji menjaju vrednosti svojstava).
  • Sve zavisnosti (objekti sa kojima radi klasa) takođe moraju biti nepromenljive ili njihovo stanje ne sme biti menjano spolja.
  • Konstruktor mora u potpunosti inicijalizovati objekat i ne sme se menjati nakon kreiranja.
  • Ako su potrebne promene, treba kreirati nove instance objekta sa novim vrednostima.

Primer klase sa javnim svojstvom (promenljivom):

<?php
class MutableObject
{
    public $value; // Javno svojstvo

    public function __construct($value)
    {
        $this->value = $value;
    }
}

$obj = new MutableObject(10);
echo $obj->value; // 10

$obj->value = 20; // Vrednost promenjena spolja

echo $obj->value; // 20

Primer implementacije nepromenljive klase:

<?php
class ImmutableObject
{
    private $value; // Privatno svojstvo

    public function __construct($value)
    {
        $this->value = $value;
    }

    public function getValue() : int
    {
        return $this->value;
    }

    // Metod za "promenu", u stvari kreira novi objekat
    public function withValue(int $newValue) : self
    {
        return new self($newValue);
    }
}

$obj1 = new ImmutableObject(10);
echo $obj1->getValue(); // 10

// $obj1->value = 20; // Greška: Ne može se pristupiti privatnom svojstvu

$obj2 = $obj1->withValue(20); // Kreira se novi objekat

echo $obj1->getValue(); // 10 (originalni objekat se nije promenio)
echo $obj2->getValue(); // 20 (novi objekat sa izmenjenom vrednošću)