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:
- Andmete varjamine: objekti sisemiste andmete otsene juurdepääs on piiratud. Juurdepääs toimub avalike (public) meetodite kaudu — getterite (andmete saamiseks) ja setterite (andmete muutmiseks).
- 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.