Вопрос проверяет понимание одного из базовых принципов ООП — инкапсуляции, и умение применять его для сокрытия внутреннего состояния объекта.
Инкапсуляция — это механизм, который объединяет данные и поведение в единый класс и ограничивает прямой доступ к внутреннему состоянию объекта. Смысл в том, что класс сам решает, как хранить и изменять свои данные, а внешний код взаимодействует с ним только через публичный интерфейс. Это снижает связанность кода и защищает объект от случайных или некорректных изменений.
class BankAccount {
private balance: number = 0;
deposit(amount: number): void {
if (amount <= 0) throw new Error('Amount must be positive');
this.balance += amount;
}
withdraw(amount: number): void {
if (amount > this.balance) throw new Error('Insufficient funds');
this.balance -= amount;
}
getBalance(): number {
return this.balance;
}
}
const acc = new BankAccount();
acc.deposit(100);
// acc.balance = 9999; // ошибка: поле приватноеЗдесь поле balance недоступно напрямую. Любое изменение проходит через методы, которые проверяют корректность операции. Если завтра потребуется логировать транзакции или хранить баланс в копейках, изменится только внутренняя реализация, а внешний код останется прежним.
В большинстве языков есть модификаторы private, protected и public. private скрывает член класса от всех, protected разрешает доступ наследникам, public открывает всем. Выбор модификатора — это проектирование границ класса.
Инкапсуляцию стоит применять всегда, когда у класса есть внутреннее состояние: она делает код предсказуемым и устойчивым к изменениям. Особенно полезна в крупных проектах, где важно ограничить зоны ответственности и не дать внешнему коду зависеть от деталей реализации.