Sobes.tech
Junior

Ինկապսուլյացիան ինչ է օբյեկտային ուղղված ծրագրավորման մեջ?

sobes.tech AI

Պատասխան AI-ից

Ինկապսուլյացիան՝ տվյալների (գծագրերի) և մեթոդների միավորումն է, որոնք աշխատում են այդ տվյալների հետ, միավորելով դրանք մեկ ամբողջության մեջ (օբյեկտ կամ դաս), ինչպես նաև ներքին իրականացման թաքցնումը արտաքին աշխարհից: Սա թույլ է տալիս վերահսկել տվյալների մուտքը և փոփոխել դասի ներքին կառուցվածքը՝ չանդրադառնալով մնացած կոդին:

Ներքին իրականացման հիմնական կողմերը՝

  1. Տվյալների թաքցում: Օբյեկտի ներսի տվյալներին ուղղակի մուտքը սահմանափակ է: Մուտքը իրականացվում է հանրային (public) մեթոդների՝ getter-ների (տվյալների ստացման համար) և setter-ների (տվյալների փոփոխության համար) միջոցով:
  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

// Վավերացման հետ setter-ի օգտագործում
try {
    $user->setAge(-5);
} catch (InvalidArgumentException $e) {
    echo "\nՍխալ: " . $e->getMessage(); // Արդյունք՝ Սխալ: Տարիքը չի կարող լինել բացասական։
}

Ինկապսուլյացիայի առավելությունները՝

  • Մուտքի վերահսկում: սահմանում է, թե ինչպես կարող են արտաքին օբյեկտները փոխազդել դասի տվյալների հետ:
  • Լկտիություն: թույլ է տալիս փոխել դասի ներքին իրականացումը՝ առանց փոխելու արտաքին կոդը, որը օգտագործում է այն:
  • Կոդի պահպանման բարելավում: հեշտացնում է սխալների հայտնաբերումն ու փոփոխությունները, քանի որ փոփոխությունները սահմանափակվում են դասի ներսում:
  • Տվյալների պաշտպանություն: կանխում է սխալ փոփոխությունները օբյեկտի վիճակում։