Sobes.tech
Junior

Čo je to zapuzdrenie v objektovo orientovanom programovaní?

sobes.tech AI

Odpoveď od AI

Inkasulácia je spojenie dát (vlastností) a metód, ktoré s týmito dátami pracujú, do jednej entity (objekt alebo trieda), ako aj skrytie vnútornej implementácie pred vonkajším svetom. To umožňuje kontrolovať prístup k dátam a meniť vnútornú štruktúru triedy, bez ovplyvnenia ostatného kódu.

Hlavné aspekty inkasulácie:

  1. Skrytie dát: Priamy prístup k vnútorným dátam objektu je obmedzený. Prístup je umožnený prostredníctvom verejných (public) metód-getterov (pre získanie dát) a setterov (pre zmenu dát).
  2. Dodržiavanie invariantov: Metódy triedy môžu obsahovať logiku na kontrolu správnosti dát pri ich nastavovaní, čím sa zabezpečí, že objekt je v platnom stave.

Príklad:

<?php
class User {
    private string $name; // Skrytá vlastnosť
    private int $age;    // Skrytá vlastnosť

    public function __construct(string $name, int $age) {
        $this->setName($name);
        $this->setAge($age);
    }

    // Getter pre name
    public function getName(): string {
        return $this->name;
    }

    // Setter pre name s možnou validáciou
    public function setName(string $name): void {
        // Pri potrebe možno pridať validáciu mena
        $this->name = $name;
    }

    // Getter pre age
    public function getAge(): int {
        return $this->age;
    }

    // Setter pre age s validáciou
    public function setAge(int $age): void {
        if ($age < 0) {
            throw new InvalidArgumentException("Vek nemôže byť záporný.");
        }
        $this->age = $age;
    }

    // Metóda využívajúca vnútorné dáta
    public function introduce(): string {
        return "Volám sa " . $this->name . " a mám " . $this->age . " rokov.";
    }
}

// Použitie triedy
$user = new User("Ivan", 30);
echo $user->introduce(); // Výstup: Volám sa Ivan a mám 30 rokov.

// Pokus o priame získanie prístupu k private vlastnosti spôsobí chybu:
// $user->age = -5; // Fatálna chyba: Uncaught Error: Cannot access private property User::$age

// Použitie setteru s validáciou
try {
    $user->setAge(-5);
} catch (InvalidArgumentException $e) {
    echo "\nChyba: " . $e->getMessage(); // Výstup: Chyba: Vek nemôže byť záporný.
}

Výhody inkasulácie:

  • Kontrola prístupu: Určuje, ako môžu vonkajšie objekty interagovať s dátami triedy.
  • Flexibilita: Umožňuje meniť vnútornú implementáciu triedy bez potreby meniť vonkajší kód, ktorý ju používa.
  • Zlepšenie údržby kódu: Uľahčuje ladenie a modifikácie, pretože zmeny sú obmedzené vnútri triedy.
  • Ochrana dát: Zabraňuje nesprávnej zmene stavu objektu.