Sobes.tech
Junior

Kas ir inkapsulācija objektorientētajā programmēšanā?

sobes.tech AI

Atbilde no AI

Iekapsulācija ir datu (īpašību) un metožu apvienošana, kas strādā ar šiem datiem, vienā vienībā (objektā vai klasē), kā arī iekšējās realizācijas slēpšana no ārpuses. Tas ļauj kontrolēt piekļuvi datiem un mainīt klases iekšējo struktūru, nemainot pārējo kodu.

Galvenie iekapsulācijas aspekti:

  1. Datu slēpšana: tieša piekļuve objekta iekšējiem datiem ir ierobežota. Piekļuve tiek nodrošināta caur publiskiem (public) metodēm — getteriem (datu iegūšanai) un setteriem (datu maiņai).
  2. Invariantu ievērošana: klases metodes var saturēt loģiku datu pareizības pārbaudei, nodrošinot, ka objekts ir derīgā stāvoklī.

Piemērs:

<?php
class User {
    private string $name; // Slēpta īpašība
    private int $age;    // Slēpta īpašība

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

    // Getter priekš vārda
    public function getName(): string {
        return $this->name;
    }

    // Setter priekš vārda ar validāciju
    public function setName(string $name): void {
        // Ja nepieciešams, var pievienot validāciju
        $this->name = $name;
    }

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

    // Setter priekš vecuma ar validāciju
    public function setAge(int $age): void {
        if ($age < 0) {
            throw new InvalidArgumentException("Vecums nevar būt mazāks par nulli.");
        }
        $this->age = $age;
    }

    // Metode, kas izmanto iekšējos datus
    public function introduce(): string {
        return "Mani sauc " . $this->name . " un man ir " . $this->age . " gadi.";
    }
}

// Klases izmantošana
$user = new User("Ivan", 30);
echo $user->introduce(); // Izvade: Mani sauc Ivan un man ir 30 gadi.

// Tieša piekļuve private īpašībai izraisīs kļūdu:
// $user->age = -5; // Fatāla kļūda: Uncaught Error: Cannot access private property User::$age

// Izmantojot setter ar validāciju
try {
    $user->setAge(-5);
} catch (InvalidArgumentException $e) {
    echo "\nKļūda: " . $e->getMessage(); // Izvade: Kļūda: Vecums nevar būt mazāks par nulli.
}

Iekapsulācijas priekšrocības:

  • Piekļuves kontrole: nosaka, kā ārējie objekti var mijiedarboties ar klases datiem.
  • Elastīgums: ļauj mainīt klases iekšējo realizāciju bez nepieciešamības mainīt ārējo kodu, kas to izmanto.
  • Koda uzturēšanas uzlabošana: atvieglo kļūdu labošanas un modifikāciju procesu, jo izmaiņas ir ierobežotas klasē.
  • Datu aizsardzība: novērš nepareizu objekta stāvokļa maiņu.