Junior
Čo je to zapuzdrenie v objektovo orientovanom programovaní?
sobes.tech AI
Odpoveď od AI
Inkasulácia je spojenie dát (vlastností) a metód, ktoré s týmito dátami pracujú, do jednej entity (objekt alebo trieda), ako aj skrytie vnútornej implementácie pred vonkajším svetom. To umožňuje kontrolovať prístup k dátam a meniť vnútornú štruktúru triedy, bez ovplyvnenia ostatného kódu.
Hlavné aspekty inkasulácie:
- Skrytie dát: Priamy prístup k vnútorným dátam objektu je obmedzený. Prístup je umožnený prostredníctvom verejných (public) metód-getterov (pre získanie dát) a setterov (pre zmenu dát).
- Dodržiavanie invariantov: Metódy triedy môžu obsahovať logiku na kontrolu správnosti dát pri ich nastavovaní, čím sa zabezpečí, že objekt je v platnom stave.
Príklad:
<?php
class User {
private string $name; // Skrytá vlastnosť
private int $age; // Skrytá vlastnosť
public function __construct(string $name, int $age) {
$this->setName($name);
$this->setAge($age);
}
// Getter pre name
public function getName(): string {
return $this->name;
}
// Setter pre name s možnou validáciou
public function setName(string $name): void {
// Pri potrebe možno pridať validáciu mena
$this->name = $name;
}
// Getter pre age
public function getAge(): int {
return $this->age;
}
// Setter pre age s validáciou
public function setAge(int $age): void {
if ($age < 0) {
throw new InvalidArgumentException("Vek nemôže byť záporný.");
}
$this->age = $age;
}
// Metóda využívajúca vnútorné dáta
public function introduce(): string {
return "Volám sa " . $this->name . " a mám " . $this->age . " rokov.";
}
}
// Použitie triedy
$user = new User("Ivan", 30);
echo $user->introduce(); // Výstup: Volám sa Ivan a mám 30 rokov.
// Pokus o priame získanie prístupu k private vlastnosti spôsobí chybu:
// $user->age = -5; // Fatálna chyba: Uncaught Error: Cannot access private property User::$age
// Použitie setteru s validáciou
try {
$user->setAge(-5);
} catch (InvalidArgumentException $e) {
echo "\nChyba: " . $e->getMessage(); // Výstup: Chyba: Vek nemôže byť záporný.
}
Výhody inkasulácie:
- Kontrola prístupu: Určuje, ako môžu vonkajšie objekty interagovať s dátami triedy.
- Flexibilita: Umožňuje meniť vnútornú implementáciu triedy bez potreby meniť vonkajší kód, ktorý ju používa.
- Zlepšenie údržby kódu: Uľahčuje ladenie a modifikácie, pretože zmeny sú obmedzené vnútri triedy.
- Ochrana dát: Zabraňuje nesprávnej zmene stavu objektu.