Объектно-ориентированное программирование
Уроки Открыть IDE
На главную
ООП • Урок 10

Инкапсуляция

Как защитить данные от неконтролируемых изменений

Антипример: незащищённое здоровье

Представьте, что мы создаём класс Hero (герой) со свойством hp (здоровье). По задумке, здоровье должно быть в диапазоне от 0 до 100.

Воин: 40 Воин: 115

Проблема: здоровье превысило задуманный нами максимум (100). Ничто не мешает установить здоровье в 115, 200 или даже -10. Данные не защищены.

Инкапсуляция — защита данных

Инкапсуляция — это принцип ООП, при котором внутренние данные объекта скрыты от прямого доступа извне и могут изменяться только через специальные методы.

Это позволяет контролировать, как именно изменяются данные, и предотвращать невалидные состояния.

Модификаторы доступа: public и private

В Idyllium доступ к свойствам и методам класса регулируется модификаторами public и private. Синтаксис — как в C++: модификатор, затем двоеточие, и всё, что ниже, относится к этому модификатору до следующего модификатора.

  • public — доступно отовсюду (из любого места программы).
  • private — доступно только внутри методов самого класса.

Пример с защищённым здоровьем

Теперь здоровье героя защищено. Изменять его можно только через методы heal() и hit(), которые следят за границами диапазона:

Воин: 40 Здоровье восстановлено до максимума! Воин: 100 Воин: 70 Герой повержен! Воин: 0

Теперь здоровье героя всегда в диапазоне 0–100. Перехилить невозможно!

Попытка доступа к приватному свойству

Если попробовать обратиться к приватному свойству напрямую из main(), компилятор выдаст ошибку:

main.idyl: error: 'hp' is private in this context

Это защищает данные от случайного или намеренного повреждения извне.

Правила хорошего тона

  • Все свойства класса делайте private.
  • Для доступа к значениям свойств создавайте публичные методы-геттеры (get_...).
  • Для изменения значений — методы-сеттеры (set_...) с проверкой корректности.
  • Публичными (public) можно оставлять только те методы, которые образуют интерфейс класса.

Этот подход называется «скрытие реализации» и является основой надёжного объектно-ориентированного дизайна.

Итог

  • Инкапсуляция — сокрытие внутренних данных объекта от внешнего мира.
  • public — доступно везде.
  • private — доступно только внутри методов класса.
  • Приватные свойства изменяются только через публичные методы, которые могут проверять корректность новых значений.
  • Инкапсуляция защищает данные от неконтролируемых изменений.