Какой принцип ООП скрывает внутреннюю структуру объекта и зачем это нужно?

«Какой принцип ООП скрывает внутреннюю структуру объекта и зачем это нужно?» — вопрос из категории ООП, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Это принцип инкапсуляции. Он скрывает внутреннее состояние объекта и предоляет доступ к нему только через публичные методы (геттеры/сеттеры).

Основные цели:

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

Пример на Java:

class BankAccount {
    // Внутреннее состояние скрыто (private)
    private double balance;

    // Публичный интерфейс для работы с состоянием
    public void deposit(double amount) {
        if (amount > 0) { // Валидация внутри класса
            balance += amount;
        }
    }

    public double getBalance() {
        return balance;
    }
}
// Использование
BankAccount account = new BankAccount();
account.deposit(100); // Корректное изменение
// account.balance = -500; // Невозможно — поле private

Без инкапсуляции прямое изменение поля balance могло бы привести к нарушению инвариантов (например, отрицательный баланс).