Что такое инкапсуляция в ООП

«Что такое инкапсуляция в ООП» — вопрос из категории ООП, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Пример в Node.js с использованием приватных полей:

class BankAccount {
  #balance = 0; // Приватное поле (синтаксис # доступен в Node.js 12+)

  deposit(amount) {
    if (amount > 0) {
      this.#balance += amount;
    } else {
      throw new Error('Deposit amount must be positive');
    }
  }

  withdraw(amount) {
    if (amount > 0 && amount <= this.#balance) {
      this.#balance -= amount;
    } else {
      throw new Error('Invalid withdrawal amount');
    }
  }

  getBalance() {
    return this.#balance;
  }
}

// Использование
const account = new BankAccount();
account.deposit(100);
console.log(account.getBalance()); // 100
// account.#balance - SyntaxError: Private field '#balance' must be declared in an enclosing class

Альтернативный подход (до ES2022) с использованием замыканий:

function createBankAccount() {
  let balance = 0; // "Приватная" переменная в замыкании

  return {
    deposit(amount) {
      if (amount > 0) balance += amount;
    },
    getBalance() {
      return balance;
    }
  };
}

const account = createBankAccount();
account.deposit(50);
console.log(account.getBalance()); // 50
// Прямой доступ к balance отсутствует

Почему это важно в Node.js:

  1. Защита данных: Предотвращает случайное изменение критических данных (баланс, конфигурация)
  2. Гибкость реализации: Можно менять внутреннюю логику, не ломая внешний API
  3. Валидация: Контроль над тем, как данные устанавливаются (например, проверка в deposit())
  4. Согласованность состояния: Гарантирует, что объект всегда находится в валидном состоянии