Sobes.tech
Junior

Šta je enkapsulacija u objektno-orijentisanom programiranju?

sobes.tech АИ

Одговор од АИ

Инкапсуација је спајање података (својстава) и метода који ради са тим подацима у једну целину (објекат или класа), као и скривање унутрашње реализације од спољашњег света. Ово омогућава контролу приступа подацима и измену унутрашње структуре класе без утицаца на остали код.

Главни аспекти инкапсуације:

  1. Скривање података: Примарни приступ унутрашњим подацима објекта је ограничен. Приступ се обезбеђује преко јавних (public) метода-јетара (за добијање података) и сеттера (за измену података).
  2. Поштовање инваријаната: Методи класе могу садржати логику за проверу исправности података приликом њиховог постављања, што гарантује да је објекат у валидном стању.

Пример:

<?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(); // Излаз: Грешка: Възрастта не може бити мања од нуле.
}

Предности инкапсуације:

  • Контрола приступа: Одређује како спољашњи објекти могу да комуницирају са подацима класе.
  • Флексибилност: Омогућава промену унутрашње реализације класе без потребе за изменом спољашњег кода који је користи.
  • Побољшање одрживости кода: Олакшава дијагностику и модификације, јер су промене ограничене унутар класе.
  • Заштита података: Превентивно спречава неправилне промене стања објекта.