Sobes.tech
Junior

Co je to zapouzdření v objektově orientovaném programování?

sobes.tech AI

Odpověď od AI

Zapouzdření je spojení dat (vlastností) a metod, které s těmito daty pracují, do jedné entity (objekt nebo třída), stejně jako skrytí vnitřní implementace před vnějším světem. To umožňuje kontrolovat přístup k datům a měnit vnitřní strukturu třídy, aniž by to ovlivnilo ostatní kód.

Hlavní aspekty zapouzdření:

  1. Skrytí dat: Přímý přístup k vnitřním datům objektu je omezen. Přístup je umožněn prostřednictvím veřejných (public) metod-getterů (pro získání dat) a setterů (pro změnu dat).
  2. Dodržování invariantů: Metody třídy mohou obsahovat logiku pro kontrolu správnosti dat při jejich nastavování, což zajišťuje, že objekt je ve validním stavu.

Příklad:

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

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

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

    // Setter pro name s možnou validací
    public function setName(string $name): void {
        // Případná validace jména
        $this->name = $name;
    }

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

    // Setter pro age s validací
    public function setAge(int $age): void {
        if ($age < 0) {
            throw new InvalidArgumentException("Věk nemůže být záporný.");
        }
        $this->age = $age;
    }

    // Metoda využívající vnitřní data
    public function introduce(): string {
        return "Jmenuji se " . $this->name . " a je mi " . $this->age . " let.";
    }
}

// Použití třídy
$user = new User("Ivan", 30);
echo $user->introduce(); // Výstup: Jmenuji se Ivan a je mi 30 let.

// Pokus o přímý přístup k soukromé vlastnosti způsobí chybu:
// $user->age = -5; // Fatální chyba: Uncaught Error: Cannot access private property User::$age

// Použití setteru s validací
try {
    $user->setAge(-5);
} catch (InvalidArgumentException $e) {
    echo "\nChyba: " . $e->getMessage(); // Výstup: Chyba: Věk nemůže být záporný.
}

Výhody zapouzdření:

  • Kontrola přístupu: Určuje, jak mohou vnější objekty interagovat s daty třídy.
  • Flexibilita: Umožňuje měnit vnitřní implementaci třídy bez nutnosti měnit vnější kód, který ji používá.
  • Zlepšení údržby kódu: Usnadňuje ladění a modifikaci, protože změny jsou omezeny uvnitř třídy.
  • Ochrana dat: Zabraňuje nesprávné změně stavu objektu.