Junior
Šta je enkapsulacija u objektno-orijentisanom programiranju?
sobes.tech АИ
Одговор од АИ
Инкапсуација је спајање података (својстава) и метода који ради са тим подацима у једну целину (објекат или класа), као и скривање унутрашње реализације од спољашњег света. Ово омогућава контролу приступа подацима и измену унутрашње структуре класе без утицаца на остали код.
Главни аспекти инкапсуације:
- Скривање података: Примарни приступ унутрашњим подацима објекта је ограничен. Приступ се обезбеђује преко јавних (public) метода-јетара (за добијање података) и сеттера (за измену података).
- Поштовање инваријаната: Методи класе могу садржати логику за проверу исправности података приликом њиховог постављања, што гарантује да је објекат у валидном стању.
Пример:
<?php
class User {
private string $name; // Скривена својство
private int $age; // Скривена својство
public function __construct(string $name, int $age) {
$this->setName($name);
$this->setAge($age);
}
// Јетар за name
public function getName(): string {
return $this->name;
}
// Сеттер за name са могућом валидацијом
public function setName(string $name): void {
// Уколико је потребно, можете додати валидацију имена
$this->name = $name;
}
// Јетар за age
public function getAge(): int {
return $this->age;
}
// Сеттер за age са валидацијом
public function setAge(int $age): void {
if ($age < 0) {
throw new InvalidArgumentException("Возраст не може бити мањи од нуле.");
}
$this->age = $age;
}
// Метод који користи унутрашње податке
public function introduce(): string {
return "Зовем се " . $this->name . " и имам " . $this->age . " година.";
}
}
// Коришћење класе
$user = new User("Иван", 30);
echo $user->introduce(); // Излаз: Зовем се Иван и имам 30 година.
// Покушај директног приступа приватном својству ће изазвати грешку:
// $user->age = -5; // Фатална грешка: Uncaught Error: Cannot access private property User::$age
// Коришћење сеттера са валидацијом
try {
$user->setAge(-5);
} catch (InvalidArgumentException $e) {
echo "\nГрешка: " . $e->getMessage(); // Излаз: Грешка: Възрастта не може бити мања од нуле.
}
Предности инкапсуације:
- Контрола приступа: Одређује како спољашњи објекти могу да комуницирају са подацима класе.
- Флексибилност: Омогућава промену унутрашње реализације класе без потребе за изменом спољашњег кода који је користи.
- Побољшање одрживости кода: Олакшава дијагностику и модификације, јер су промене ограничене унутар класе.
- Заштита података: Превентивно спречава неправилне промене стања објекта.