Sobes.tech
Junior

Kas yra inkapsuliacija objektų orientuotoje programavime?

sobes.tech AI

Atsakymas iš AI

Inkapulsacija yra duomenų (savybių) ir metodų sujungimas, kurie dirba su šiais duomenimis, į vieną visumą (objektą arba klasę), taip pat vidinės įgyvendinimo paslėpimas nuo išorinio pasaulio. Tai leidžia kontroliuoti prieigą prie duomenų ir keisti klasės vidinę struktūrą, nepažeidžiant kodo.

Pagrindiniai inkapsuliacijos aspektai:

  1. Duomenų paslėpimas: tiesioginė prieiga prie objekto vidinių duomenų yra ribojama. Prieiga suteikiama per viešus (public) metodus — getterius (duomenų gavimui) ir setterius (duomenų keitimui).
  2. Invarianto laikymasis: klasės metodai gali turėti logiką duomenų teisingumui patikrinti, užtikrinant, kad objektas yra galiojančioje būklėje.

Pavyzdys:

<?php
class User {
    private string $name; // Paslėpta savybė
    private int $age;    // Paslėpta savybė

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

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

    // Setteris vardui su validacija
    public function setName(string $name): void {
        // Jei reikia, galima pridėti validaciją
        $this->name = $name;
    }

    // Getteris amžiui
    public function getAge(): int {
        return $this->age;
    }

    // Setteris amžiui su validacija
    public function setAge(int $age): void {
        if ($age < 0) {
            throw new InvalidArgumentException("Amžius negali būti mažesnis už nulį.");
        }
        $this->age = $age;
    }

    // Metodas, naudojantis vidinius duomenis
    public function introduce(): string {
        return "Mano vardas " . $this->name . " ir man " . $this->age . " metų.";
    }
}

// Klasės naudojimas
$user = new User("Ivan", 30);
echo $user->introduce(); // Išvestis: Mano vardas Ivan ir man 30 metų.

// Bandymas tiesiogiai pasiekti private savybę sukels klaidą:
// $user->age = -5; // Fatali klaida: Uncaught Error: Cannot access private property User::$age

// Naudojant setterį su validacija
try {
    $user->setAge(-5);
} catch (InvalidArgumentException $e) {
    echo "\nKlaida: " . $e->getMessage(); // Išvestis: Klaida: Amžius negali būti mažesnis už nulį.
}

Inkapulsacijos privalumai:

  • Prieigos kontrolė: nustato, kaip išoriniai objektai gali sąveikauti su klasės duomenimis.
  • Lankstumas: leidžia keisti klasės vidinę įgyvendinimą be poreikio keisti išorinį kodą, kuris ją naudoja.
  • Kodo palaikymo gerinimas: palengvina klaidų radimą ir modifikacijas, nes pakeitimai yra riboti klasės viduje.
  • Duomenų apsauga: užkerta kelią netinkamiems objekto būsenos pakeitimams.