Immutable object

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

Immutable object (česky neměnný objekt) je název pro návrhový vzor, používaný při programování. Vyznačuje se tím, že žádná z jeho metod není schopná změnit jeho nastavenou hodnotu.

Obsah

Účel [editovat]

Vzor se hodí pro případy, kdy nechceme aby se nám mohla změnit hodnota objektu se kterým pracujeme. Změnit hodnotu muttable objektů (tj. opak immutable objektů) nám při běhu programu může např. jiné vlákno.

Základní implementace [editovat]

Implementace vzoru se skládá z vytvoření jednoho (či více) privátních atributů, ve kterých uložíme hodnotu. Dále musíme zajistit nastavení těchto atributů. Nejčastěji se hodnota nastaví již při tvorbě objektu - tedy v kostruktoru.

Další možností je mít setter, ve kterém hodnotu nastavíme. Ovšem v tomto případě musíme zajistit, že pokud se o nastavení hodnoty pokusí někdo další (tedy změnit hodnotu objektu), tak se operace nepovede (například vyvoláme výjimku).

Implementace v jazyce PHP [editovat]

V ukázce vidíme, že přestože posouváme bod v rovině o určitý vektor, tak vracíme nový bod. Tím zajistíme, že jsme nezměníme hodnoty původního objektu.

class Point
{
        private $x;
 
        private $y;
 
        public function __construct($x, $y)
        {
                $this->x = $x;
                $this->y = $y;
        }
 
        public function getX()
        {
                return $this->x;
        }
 
        public function getY()
        {
                return $this->y;
        }
 
        /**
         * Posune bod o dany vektor
         * 
         * Predpokladame rozhrani tridy vektor:
         * $vector->getX();
         * $vector->getY();
         */
        public function addVector(Vector $vector)
        {
                $x = $this->x + $vector->getX();
                $y = $this->y + $vector->getY();
 
                return new Point($x, $y);
        }
 
        public function __toString()
        {
                return "[" . $this->x . ", " . $this->y . "]";
        }
}
 
$point1 = new Point(0, 0);
$point2 = $point1->addVector(new Vector(1, 2));
 
// $point1 a $point2 jsou ruzne objekty
$dumpPoint1 = (string)$point1; // [0, 0]
$dumpPoint2 = (string)$point2; // [1, 2]

Literatura [editovat]

Související články [editovat]

Externí odkazy [editovat]