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

    // გეტერი სახელისთვის
    public function getName(): string {
        return $this->name;
    }

    // სეტერი სახელისთვის, ვალიდაციის შესაძლებლობით
    public function setName(string $name): void {
        // საჭიროების შემთხვევაში, შეიძლება დაამატოთ ვალიდაცია
        $this->name = $name;
    }

    // გეტერი ასაკისთვის
    public function getAge(): int {
        return $this->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(); // გამოყვანა: შეცდომა: ასაკი არ შეიძლება იყოს ნული ნაკლები.
}

ინკაპსულაციის უპირატესობები:

  • წვდომის კონტროლი: განსაზღვრავს, როგორ ურთიერთქმედებენ გარე ობიექტები კლასის მონაცემებთან.
  • გაახალგაზრდავება: საშუალებას აძლევს შეცვალოს კლასის შიდა რეალიზაცია, არ შეცვალოს გარე კოდი, რომელიც მას იყენებს.
  • კოდის შენარჩუნების გაუმჯობესება: ადვილად იპოვით შეცდომებს და ახდენთ ცვლილებებს, რადგან ცვლილებები შეზღუდულია კლასის შიგნით.
  • მონაცემების დაცვა: თავიდან აცილება სავალდებულო შეცდომებს ობიექტის მდგომარეობაში.