Это похоже на довольно широкий вопрос, охватывающий широкий круг вопросов, но я попытаюсь обратиться к парам пунктов:
Уверен, что ваш клиент может не увидеть или изменить ваш код (если вы предоставите полное скомпилированное приложение), но вы и любые другие сопровождающие могут. Целью скрытия данных является минимизация точек взаимодействия между данными и каждым уровнем интерфейса. Это помогает вам писать и поддерживать правильный код.
По той же причине, что глобальные переменные могут быть чрезвычайно трудными в использовании и правильном использовании, чем больше вы локализуете использование данных, тем проще, код и быть уверенным в правильности.
Когда вы предоставляете абстрактный интерфейс классу, который вы позволяете классу работать с внутренними данными / состоянием без внешнего мира, которому нужно что-то знать о базовой структуре данных, типов или алгоритмов. Это делает ваш код намного проще для эффективного использования клиентами.