9.1 Əsas konsepsiyalar
Enkapsulyasiya — obyekt-yönümlü proqramlaşdırmanın (OOP) əsas anlayışlarından biridir və obyektin daxili reallaşdırma detallarını gizləməyə və bu detallara yalnız müəyyən interfeyslər vasitəsilə çıxış təmin etməyə imkan verir. Bu, təhlükəsizliyi artırır və kodun idarə edilməsini asanlaşdırır.
Enkapsulyasiyanın üstünlükləri:
- Məlumatların gizlədilməsi: enkapsulyasiya daxili reallaşdırma detallarını gizlətməyə və yalnız lazım olan metodlara və xüsusiyyətlərə çıxış təmin etməyə imkan verir. Bu, obyektlərin düzgün istifadə olunmamasının qarşısını alır və kodun təhlükəsizliyini artırır.
- Girişə nəzarət: enkapsulyasiya məlumatlara və metodlara çıxışı nəzarət etməyə imkan verir, obyektin daxili vəziyyətini yalnız müəyyən metodlar vasitəsilə dəyişmək imkanı yaradır.
- Dəstəklənmə: enkapsulyasiya kodun dəstəklənməsini yaxşılaşdırır, çünki reallaşdırmada edilən dəyişikliklər sinifin xarici interfeysinə təsir etmir. Bu, sinifdən istifadə edən kodu dəyişmədən reallaşdırmada dəyişiklik etməyə imkan verir.
- Testlərin yaxşılaşdırılması: enkapsulyasiya obyektin daxili reallaşdırmasını izolyasiya etməyə imkan verir ki, bu da modullu testləşdirməni asanlaşdırır və yan təsirlərin ehtimalını azaldır.
JavaScript-də enkapsulyasiya metodlar və xüsusiyyətlər istifadə edilərək reallaşdırılır, ES2022-dən başlayaraq isə müvafiq olaraq xüsusi sahələr və metodlar əlçatan olub.
9.2 Bağlama vasitəsilə inkapulyasiya
ES2022-də şəxsi sahələr təqdim olunmazdan əvvəl, JavaScript-də inkapulyasiya tez-tez bağlamalar vasitəsilə həyata keçirilirdi.
Nümunə:
count
dəyişəni yalnızcreateCounter
funksiyasının daxilində mövcuddur və xaricdən daxil olmaq mümkün deyilincrement
,decrement
vəgetCount
metodları şəxsicount
dəyişəni ilə qarşılıqlı əlaqə qura bilər
function createCounter() {
let count = 0; // şəxsi dəyişən
return {
increment() {
count++;
console.log(count);
},
decrement() {
count--;
console.log(count);
},
getCount() {
return count;
}
};
}
const counter = createCounter();
counter.increment(); // 1
counter.increment(); // 2
console.log(counter.getCount()); // 2
counter.decrement(); // 1
9.3 ES2022-də Şəxsi sahələr
ES2022-də #
simvolundan istifadə edərək elan olunan şəxsi sahələr və metodlar təqdim edildi. Şəxsi sahələr və metodlar sinifdən kənardan əldə edilə və ya dəyişdirilə bilməz.
Nümunə:
#name
və#age
şəxsi sahələr#
simvolundan istifadə edərək elan olunubgetName
,getAge
,setName
vəsetAge
metodları şəxsi sahələrlə qarşılıqlı əlaqəyə imkan verir- Sinifdən kənardan şəxsi sahələrə giriş cəhdi xətaya səbəb olur
class Person {
#name; // şəxsi sahə
#age; // şəxsi sahə
constructor(name, age) {
this.#name = name;
this.#age = age;
}
getName() {
return this.#name;
}
getAge() {
return this.#age;
}
setName(name) {
this.#name = name;
}
setAge(age) {
if (age > 0) {
this.#age = age;
}
}
}
const person = new Person('Alice', 30);
console.log(person.getName()); // "Alice"
console.log(person.getAge()); // 30
person.setName('Bob');
person.setAge(25);
console.log(person.getName()); // "Bob"
console.log(person.getAge()); // 25
console.log(person.#name); // Xəta: şəxsi sahəyə giriş mümkün deyil
9.4 Özəl metodlar
Özəl metodlar həmçinin #
simvolundan istifadə edərək elan edilə bilər və sinifdən kənarda əlçatan olmaz.
Nümunə:
- Özəl sahə
#balance
və özəl metod#logTransaction
BankAccount
obyektinin vəziyyətini idarə etmək üçün istifadə olunur - Özəl metod
#logTransaction
açıq metodlarındeposit
vəwithdraw
daxilində tranzaksiyaları qeyd etmək üçün çağırılır
class BankAccount {
#balance;
constructor(initialBalance) {
this.#balance = initialBalance;
}
deposit(amount) {
if (amount > 0) {
this.#balance += amount;
this.#logTransaction('deposit', amount);
}
}
withdraw(amount) {
if (amount > 0 && amount <= this.#balance) {
this.#balance -= amount;
this.#logTransaction('withdraw', amount);
}
}
getBalance() {
return this.#balance;
}
#logTransaction(type, amount) {
console.log(`Transaction: ${type} ${amount}`);
}
}
const account = new BankAccount(1000);
account.deposit(500); // "Transaction: deposit 500"
console.log(account.getBalance()); // 1500
account.withdraw(200); // "Transaction: withdraw 200"
console.log(account.getBalance()); // 1300
account.#logTransaction('test', 100); // Xəta: özəl metod əlçatan deyil
GO TO FULL VERSION