Sobes.tech
Junior

Объектке багытталган программалоодо инкапсуляция деген эмне?

sobes.tech AI

AIден жооп

Инкапсуляция — бул маалыматтарды (мүлктөрдү) жана алар менен иштөөчү ыкмаларды бириктирүү, ошондой эле ички ишке ашырууну сырттан жашыруу. Бул маалыматтарга кирүүнү көзөмөлдөөгө жана класс структурасын өзгөртүүгө мүмкүндүк берет, башка кодго таасир этпестен.

Инкапсуляциянын негизги аспектилери:

  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);
    }

    // Getter — name үчүн
    public function getName(): string {
        return $this->name;
    }

    // Setter — name үчүн, валидация менен
    public function setName(string $name): void {
        // Атынын валидациясын кошсо болот
        $this->name = $name;
    }

    // Getter — age үчүн
    public function getAge(): int {
        return $this->age;
    }

    // Setter — 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 жаштамын.

// Түз кирүүгө аракет кылуу private мүлккө — ката алып келет:
// $user->age = -5; // Фаталдык каталар: Uncaught Error: Cannot access private property User::$age

// Валидация менен сеттер колдонуу
try {
    $user->setAge(-5);
} catch (InvalidArgumentException $e) {
    echo "\nКаталар: " . $e->getMessage(); // Чыгуу: Каталар: Жаш нөлдөн кем болбошу керек.
}

Инкапсуляциянын артыкчылыктары:

  • Достук контролу: сырттан келген объекттер класстын маалыматтар менен кандайча иштээрин аныктайт.
  • Ийкемдүүлүк: ички реализацияны өзгөртүүгө мүмкүндүк берет — сырткы кодду өзгөртүүнүн зарылдыгы жок.
  • Кодду оңой тейлөө: түзөтүүлөрдү жана өзгөртүүлөрдү жеңилдетет, анткени өзгөртүүлөр класстын ичинде чектелет.
  • Маалыматтарды коргоо: объекттин абалын туура эмес өзгөртүүнүн алдын алат.