CodeGym /Kurslar /Frontend SELF AZ /İnkapulyasiya

İnkapulyasiya

Frontend SELF AZ
Səviyyə , Dərs
Mövcuddur

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:

  1. 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.
  2. 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.
  3. 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.
  4. 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ız createCounter funksiyasının daxilində mövcuddur və xaricdən daxil olmaq mümkün deyil
  • increment, decrementgetCount metodları şəxsi count dəyişəni ilə qarşılıqlı əlaqə qura bilər
JavaScript
    
      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#age şəxsi sahələr # simvolundan istifadə edərək elan olunub
  • getName, getAge, setNamesetAge 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
JavaScript
    
      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ın depositwithdraw daxilində tranzaksiyaları qeyd etmək üçün çağırılır
JavaScript
    
      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
    
  
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION