Sobes.tech
Junior

Mis on kapseldumine objektorienteeritud programmeerimises?

sobes.tech AI

Vastus AI-lt

Inkapulsatsioon on andmete (omaduste) ja meetodite ühendamine, mis töötavad nende andmetega, üheks tervikuks (objekt või klass), ning sisemise teostuse varjamine väljastpoolt. See võimaldab kontrollida andmetele juurdepääsu ja muuta klassi sisemist struktuuri, mõjutamata ülejäänud koodi.

Inkapulsatsiooni peamised aspektid:

  1. Andmete varjamine: objekti sisemiste andmete otsene juurdepääs on piiratud. Juurdepääs toimub avalike (public) meetodite kaudu — getterite (andmete saamiseks) ja setterite (andmete muutmiseks).
  2. Invariantide järgimine: klassi meetodid võivad sisaldada loogikat andmete õigsuse kontrollimiseks, tagades, et objekt on kehtivas seisundis.

Näide:

<?php
class User {
    private string $name; // Varjatud omadus
    private int $age;    // Varjatud omadus

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

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

    // Setter nime jaoks, valideerimise võimalusega
    public function setName(string $name): void {
        // Vajadusel võib lisada nime valideerimise
        $this->name = $name;
    }

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

    // Setter vanuse jaoks, valideerimisega
    public function setAge(int $age): void {
        if ($age < 0) {
            throw new InvalidArgumentException("Vanus ei või olla negatiivne.");
        }
        $this->age = $age;
    }

    // Meetod, mis kasutab sisemisi andmeid
    public function introduce(): string {
        return "Minu nimi on " . $this->name . " ja ma olen " . $this->age . " aastat vana.";
    }
}

// Klass kasutamine
$user = new User("Ivan", 30);
echo $user->introduce(); // Väljund: Minu nimi on Ivan ja ma olen 30 aastat vana.

// Püüd otse pääseda private omadusele põhjustab vea:
// $user->age = -5; // Fataalne viga: Uncaught Error: Cannot access private property User::$age

// Setteri kasutamine valideerimisega
try {
    $user->setAge(-5);
} catch (InvalidArgumentException $e) {
    echo "\nViga: " . $e->getMessage(); // Väljund: Viga: Vanus ei või olla negatiivne.
}

Inkapulsatsiooni eelised:

  • Juurdepääsukontroll: määrab, kuidas välised objektid saavad klassi andmetega suhelda.
  • Paindlikkus: võimaldab muuta klassi sisemist teostust ilma välise koodi muutmiseta, mis seda kasutab.
  • Koodi hooldatavuse parandamine: lihtsustab vigade leidmist ja muudatusi, kuna muudatused on piiratud klassi sees.
  • Andmete kaitse: takistab objekti oleku ebaõiget muutmist.