← Назад к вопросам

Приведи пример инкапсуляции

1.0 Junior🔥 171 комментариев
#ООП

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Инкапсуляция в JavaScript/Node.js

Инкапсуляция — это один из основных принципов объектно-ориентированного программирования, который скрывает внутренние детали реализации объекта и предоставляет контролируемый доступ к данным через публичный интерфейс. Рассмотрим несколько практических примеров.

Пример 1: Класс с приватными полями

class BankAccount {
  #balance = 0; // Приватное поле (скрыто от внешнего доступа)
  
  constructor(initialBalance) {
    if (initialBalance < 0) {
      throw new Error('Баланс не может быть отрицательным');
    }
    this.#balance = initialBalance;
  }
  
  // Публичный метод для получения баланса
  getBalance() {
    return this.#balance;
  }
  
  // Публичный метод для пополнения счёта
  deposit(amount) {
    if (amount <= 0) {
      throw new Error('Сумма должна быть положительной');
    }
    this.#balance += amount;
    return this.#balance;
  }
  
  // Публичный метод для снятия денег
  withdraw(amount) {
    if (amount <= 0) {
      throw new Error('Сумма должна быть положительной');
    }
    if (amount > this.#balance) {
      throw new Error('Недостаточно средств');
    }
    this.#balance -= amount;
    return this.#balance;
  }
}

const account = new BankAccount(1000);
console.log(account.getBalance()); // 1000
account.deposit(500); // 1500
// account.#balance = 999; // ❌ Ошибка: приватное поле недоступно

Пример 2: Замыкания (Closures)

function createCounter() {
  let count = 0; // Приватная переменная
  
  return {
    increment() {
      count++;
      return count;
    },
    decrement() {
      count--;
      return count;
    },
    getCount() {
      return count;
    }
  };
}

const counter = createCounter();
console.log(counter.increment()); // 1
console.log(counter.increment()); // 2
console.log(counter.getCount()); // 2
// count доступен только через методы объекта

Пример 3: Getter и Setter

class User {
  #password;
  
  constructor(name, password) {
    this.name = name;
    this.#password = password;
  }
  
  // Getter — контролируемый доступ к данным
  get password() {
    return '*'.repeat(this.#password.length); // Скрываем пароль
  }
  
  // Setter — валидация перед установкой значения
  set password(newPassword) {
    if (newPassword.length < 8) {
      throw new Error('Пароль должен быть минимум 8 символов');
    }
    this.#password = newPassword;
  }
  
  // Метод для проверки пароля
  verifyPassword(inputPassword) {
    return this.#password === inputPassword;
  }
}

const user = new User('Alice', 'MySecret123');
console.log(user.password); // '***********'
user.password = 'NewSecret456'; // Валидация сработает

Пример 4: В контексте Node.js сервиса

class OrderService {
  #database; // Приватное поле для БД
  
  constructor(dbConnection) {
    this.#database = dbConnection;
  }
  
  async createOrder(userId, items) {
    // Валидация в публичном методе
    if (!items || items.length === 0) {
      throw new Error('Заказ должен содержать товары');
    }
    
    // Приватный метод для расчёта цены
    const totalPrice = this.#calculatePrice(items);
    
    // Работа с БД через приватное поле
    const order = await this.#database.query(
      'INSERT INTO orders (user_id, total_price) VALUES ($1, $2)',
      [userId, totalPrice]
    );
    
    return order;
  }
  
  #calculatePrice(items) {
    return items.reduce((sum, item) => sum + item.price * item.quantity, 0);
  }
}

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

  • Безопасность данных — защита от неконтролируемых изменений
  • Гибкость — можем менять внутреннюю реализацию без влияния на клиентов
  • Валидация — проверка данных при каждом изменении
  • Читаемость — ясный публичный интерфейс
  • Поддерживаемость — изменения в одном месте

Инкапсуляция — это основа для написания надёжного, масштабируемого кода в Node.js.