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:
- 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).
- 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.