Что происходит между командой и результатом

Когда программа вызывает `сделатьКофе()`, она обращается к публичному интерфейсу — набору операций, которые объект разрешает использовать извне. Сам объект хранит состояние, например выбранный режим, и определяет, что делать при вызове команды: проверить наличие воды, включить нагреватель, запустить помпу. Код, который просит приготовить напиток, не обязан знать порядок этих шагов.

Сокрытие внутреннего устройства называется инкапсуляцией. Это не обязательно означает, что данные буквально недоступны: главное — чтобы другой код не менял их как попало, обходя правила объекта. Вместо прямой правки уровня воды он вызывает разрешённую операцию, а объект сам проверяет, допустима ли она.

Почему внутренности можно менять

Предположим, разработчики заменили помпу или переписали последовательность нагрева. Если внешняя команда и её смысл остались прежними, вызывающим её частям программы не нужно знать о переменах. Так изменение одной детали не требует переписывать всё, что ею пользуется.

Но интерфейс становится обязательством: его изменение может затронуть множество участков кода. Поэтому полезная граница проходит там, где объект сам отвечает за правила и состояние, а не просто прячет переменные за множеством бессмысленных команд.

Это особенно важно в больших программах, над которыми работают разные люди: один модуль может пользоваться объектом, не разбираясь в его устройстве. Цена такой независимости — необходимость тщательно проектировать доступные операции. Хорошая «панель управления» не показывает каждую внутреннюю деталь, но даёт ровно те команды, которые нужны для надёжной работы.