JavaRush /Курсы /Модуль 1: Web Core /Инкапсуляция

Инкапсуляция

Модуль 1: Web Core
20 уровень , 8 лекция
Открыта

9.1 Основные концепции

Инкапсуляция — это одна из ключевых концепций объектно-ориентированного программирования (ООП), которая позволяет скрывать внутренние детали реализации объекта и предоставлять доступ к этим деталям через строго определенные интерфейсы. Это помогает улучшить безопасность и упрощает управление кодом.

Преимущества инкапсуляции:

  1. Сокрытие данных: инкапсуляция позволяет скрывать внутренние детали реализации и предоставлять доступ только к необходимым методам и свойствам. Это предотвращает некорректное использование объектов и улучшает безопасность кода.
  2. Контроль доступа: инкапсуляция позволяет контролировать доступ к данным и методам, предоставляя возможность изменять внутреннее состояние объекта только через определенные методы.
  3. Поддерживаемость: инкапсуляция улучшает поддержку кода, так как изменения в реализации не влияют на внешний интерфейс класса. Это позволяет вносить изменения в реализацию без изменения кода, использующего класс.
  4. Улучшение тестирования: инкапсуляция позволяет изолировать внутреннюю реализацию объекта, что упрощает модульное тестирование и уменьшает вероятность возникновения побочных эффектов.

В JavaScript инкапсуляция реализуется с использованием методов и свойств, а начиная с ES2022, также стали доступны приватные поля и методы.

9.2 Инкапсуляция через замыкания

До введения приватных полей в ES2022, инкапсуляция в JavaScript часто достигалась с использованием замыканий.

Пример:

  • Переменная count доступна только внутри функции createCounter и недоступна извне
  • Методы increment, decrement и getCount могут взаимодействовать с приватной переменной count
JavaScript
    
      function createCounter() {
        let count = 0; // приватная переменная

        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

В ES2022 были введены приватные поля и методы, которые объявляются с использованием символа #. Приватные поля и методы не могут быть доступны или изменены извне класса.

Пример:

  • Приватные поля #name и #age объявлены с использованием символа #
  • Методы getName, getAge, setName и setAge позволяют взаимодействовать с приватными полями
  • Попытка доступа к приватным полям извне класса приводит к ошибке
JavaScript
    
      class Person {
        #name; // приватное поле
        #age; // приватное поле

        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); // Ошибка: приватное поле недоступно
    
  

9.4 Приватные методы

Приватные методы также могут быть объявлены с использованием символа # и быть недоступными извне класса.

Пример:

  • Приватное поле #balance и приватный метод #logTransaction используются для управления состоянием объекта BankAccount
  • Приватный метод #logTransaction вызывается внутри публичных методов deposit и withdraw для записи транзакций
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); // Ошибка: приватный метод недоступен
    
  
1
Задача
Модуль 1: Web Core, 20 уровень, 8 лекция
Недоступна
Приватные поля Person
Приватные поля Person
1
Задача
Модуль 1: Web Core, 20 уровень, 8 лекция
Недоступна
Приватные поля Car
Приватные поля Car
Комментарии (2)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Виктор Рябов Уровень 21
13 марта 2025
в задаче Приватные поля Car" при проверке решения просит поймать ошибку при попытке вызова приватного метода А в задании такого нет. Наверное нужно поправить.
Vadim Makarenko Уровень 42
26 августа 2025
Так этого мало. Совершенно непонятно, что приватный метод должен делать. По аргументам в его вызове можно судить, что он собой должен заменить простое присвоение this.brand = brand и this.model = model, т.к. по условию задачи он вызывается внутри обоих "сетов". Однако валидация показала, что реализовывать его не нужно, как и прописывать его параметры. Только объявление и пустое тело.