Sobes.tech
Junior

Инкапсулятсия дар барномасозии объектӣ чист?

sobes.tech AI

Ҷавоб аз AI

Инкапсулясия — инъикоси маълумотҳо (хусусиятҳо) ва методҳо, ки бо ин маълумотҳо кор мекунанд, ба як воҳид (объект ё синф), инчунин пинҳон кардани иҷрои дохилӣ аз олами берунӣ. Ин имкон медиҳад, ки дастрасиро ба маълумотҳо назорат кардан ва сохтори дохилии синфро тағир додан, бе таъсир расондан ба коди дигар.

Аспектҳои асосии инкапсулясия:

  1. Пинҳон кардани маълумотҳо: Дастрасӣ ба маълумоти дохилии объект маҳдуд аст. Дастрасӣ тавассути методҳои умумӣ (public) — геттерҳо (барои гирифтани маълумот) ва сеттерҳо (барои тағир додани маълумот) таъмин мешавад.
  2. Риояи invariants: Методҳои синф метавонанд логикаи санҷиши дурустии маълумотро дар вақти гузоштани онҳо дошта бошанд, ки ба ҳолати дурустии объект кафолат медиҳад.

Масалан:

<?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 солам.

// кӯшиши дастрасии мустақим ба хусусияти private боиси хато мешавад:
// $user->age = -5; // Хатои фаталӣ: Uncaught Error: Cannot access private property User::$age

// Истифодаи сеттер бо валидация
try {
    $user->setAge(-5);
} catch (InvalidArgumentException $e) {
    echo "\nХатогӣ: " . $e->getMessage(); // Натиҷа: Хатогӣ: Синну сол наметавонад аз сифр камтар бошад.
}

Афзалиятҳои инкапсулясия:

  • Назорати дастрасӣ: муайян мекунад, ки чӣ гуна объектҳои беруна метавонанд бо маълумотҳои синф муошират кунанд.
  • Флексибилитет: имкон медиҳад, ки иҷрои дохилии синфро тағир додан бе тағир додани коди беруна, ки онро истифода мебарад.
  • Беҳтар кардани нигоҳдории коди: кӯмак мекунад, ки хатоҳо ва тағиротҳоро осонтар кардан, зеро тағиротҳо маҳдуд мешаванд дар дохили синф.
  • Ҳифзи маълумот: пешгирӣ мекунад тағироти нодуруст дар ҳолати объект.