Инкапсуляция
Принцип, по которому объект скрывает свое внутреннее устройство и позволяет менять данные только через свои методы.
Инкапсуляция — один из принципов объектно-ориентированного программирования. Объект прячет свои данные и детали работы, а наружу открывает только методы. Кто угодно может попросить счет «списать 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. Благодаря этому команда может переписать сервис изнутри, не договариваясь с остальными.
Частая ошибка
Сделать все поля закрытыми и к каждому добавить метод «получить» и «установить» — это инкапсуляция только на бумаге: любой код по-прежнему может записать что угодно. Настоящая инкапсуляция — методы, которые выражают действия предметной области («списать», «закрыть договор»), а не просто открывают поля.