Определение
Назначение инкапсуляции - сокрытие информации в одной части приложения от других частей. Цель такого сокрытия информации - отделение изменяемых частей приложения от неизменных (или разделение частей, меняющихся с разной скоростью / по разным причинам).
При правильной инкапсуляции клиентский код не будет знать детали инкапсулированной реализации состояния или поведения, а это - сокращение числа зависимостей. То есть с точки зрения клиентского кода лучше вызвать один метод без параметров, чем знать подробности реализации, вроде количества, порядка и смысла аргументов.
Дисциплина
Источники
Примеры
Простейшая форма - приватные поля класса, описываюшие его состояние. Можно инкапсулировать согласованные наборы данных и даже поведение путем вынесения их в отдельный класс.
Оценка качества инкапсуляции на уровне классов:
- Сделаны ли члены класса минимально доступными?
- Избегает ли класс предоставления доступа к своим данным-членам?
- Скрывает ли класс детали реализации от других классов в максимально возможной степени, допускаемой языком программирования?
- Избегает ли класс предположений о своих клиентах, в том числе о производных классах?
- Независим ли класс от других классов? Слабо ли он связан?
Источник: Качество классов
Синонимы
- Сокрытие информации
- Концептуализация и абстрагирование идеи, т.к. это побочный эффект инкапсуляции. Чтобы “спрятать” куда-то данные и поведение, нужно создать новую абстракцию и каким-то образом ее назвать (определить концепт).
Ловушки
- Сопротивление абстракциям в коде предостерегает от преждевременной инкапсуляции, т.к. будучи выполненной при недостаточной информации о требованиях она может привести к неверным абстракциям, которые впоследствии сложно изменить.