Инкапсуляция — это концепция объектно-ориентированного программирования, которая связывает вместе данные и функции, которые манипулируют этими данными, чтобы защитить их от внешнего вмешательства со стороны клиентского кода.
Скрытие информации
Сокрытие информации или данных является важной концепцией инкапсуляции. Это часто интерпретируется как сокрытие полей и использование геттеров и сеттеров, но на самом деле это не так. На самом деле это следует называть сокрытием реализации, поскольку мы хотим скрыть детали реализации, а не всю информацию. Мы хотим не запрашивать у объектов их внутреннюю информацию; мы должны попросить объекты, которые знают информацию, сделать работу.
Защита инвариантов
Мы хотим максимально затруднить перевод объектов в недопустимое состояние. У нас не должно быть общедоступных полей или сеттеров, а конструктор должен гарантировать, что объект полностью инициализируется в допустимом состоянии при построении.
Разделение командных запросов (CQS)
Операции должны быть либо командами, либо запросами, а не тем и другим одновременно. Команды имеют побочные эффекты, они каким-то образом влияют на состояние приложения, например, изменяя структуру данных или обновляя базу данных. Запросы просто возвращают данные, они не должны иметь никаких побочных эффектов. Запросы естественно идемпотентны; их можно запускать любое количество раз без изменения ответа.
Следование CQS во всей кодовой базе означает, что вы можете определить по сигнатуре метода, есть ли у метода побочные эффекты, не глядя на реализацию.