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

Принцип, по которому объект скрывает свое внутреннее устройство и позволяет менять данные только через свои методы.

Инкапсуляция — один из принципов объектно-ориентированного программирования. Объект прячет свои данные и детали работы, а наружу открывает только методы. Кто угодно может попросить счет «списать 500 рублей», но никто не может напрямую записать в баланс произвольное число. Объект сам следит, чтобы его данные оставались правильными.

Пример

// Java
public class Account {
    private long balance;

    public void withdraw(long amount) {
        if (amount > balance) {
            throw new IllegalStateException("Недостаточно средств");
        }
        balance -= amount;
    }

    public long getBalance() {
        return balance;
    }
}

Поле balance закрыто словом private: изменить его можно только через withdraw, который проверяет остаток. Правило «нельзя уйти в минус» записано в одном месте, а не в каждом участке кода, который работает со счетом.

Зачем это нужно

  • Целостность данных. Объект не может оказаться в невозможном состоянии — с отрицательным балансом или пустым номером договора.
  • Свобода менять устройство. Внутри можно перейти с хранения в рублях на хранение в копейках, и внешний код этого не заметит: методы остались прежними.
  • Меньше связей. Остальная программа зависит от небольшого набора методов, а не от всех внутренностей класса. Изменения не расходятся по системе волной.

Как это устроено в разных языках

  • Java, C#, Kotlin: модификаторы private, protected, public (в Kotlin еще internal — видно внутри модуля).
  • TypeScript: private проверяется при сборке, а поля с решеткой (#balance) закрыты и во время выполнения.
  • Python: строгих ограничений нет, работает соглашение — имя с подчеркиванием (_balance) означает «внутреннее, не трогать».

Инкапсуляция шире классов

Тот же принцип работает на уровне целых систем. Модуль открывает только нужные функции. Сервис в микросервисной архитектуре не дает другим сервисам лезть в свою базу данных и общается с ними только через API. Благодаря этому команда может переписать сервис изнутри, не договариваясь с остальными.

Частая ошибка

Сделать все поля закрытыми и к каждому добавить метод «получить» и «установить» — это инкапсуляция только на бумаге: любой код по-прежнему может записать что угодно. Настоящая инкапсуляция — методы, которые выражают действия предметной области («списать», «закрыть договор»), а не просто открывают поля.