От переменных к объектам: зачем нужны классы
От переменных к объектам: зачем нужны классы
Представьте, что вы разрабатываете экран контактов для мессенджера. Любая программа начинается с данных, и для их хранения мы используем переменные.
В Kotlin для создания переменной мы используем ключевые слова val (для неизменяемых данных) или var (для тех, что могут меняться). Чтобы показать одного пользователя, вы пишете:
val userName = "Алексей"
var userStatus = "В сети"
Всё работает отлично: у нас есть имя, которое вряд ли изменится, и статус, который мы сможем обновлять. Но что, если пользователей в приложении сто или тысяча? Вы не можете создавать переменные userName1, userName2 и так далее — код превратится в бесконечную простыню.
Опираясь на базовые знания программирования, вы, скорее всего, решите сгруппировать данные в списки:
val names = listOf("Алексей", "Мария", "Иван")
var statuses = listOf("В сети", "Был час назад", "Печатает...")
А теперь представьте реальную ситуацию: пользователь нажал кнопку «Сортировать по алфавиту». Вы отсортировали список names, но забыли отсортировать список statuses. В результате Алексей внезапно получил статус Ивана. Данные перемешались, приложение показывает неправду, а вы тратите часы на поиск ошибки.
Эта ситуация — классический пример того, почему программирование на одних только базовых переменных и массивах при росте проекта быстро превращается в хаос.
Проблема разрозненных данных
Когда мы описываем сложную сущность (например, пользователя мессенджера) отдельными переменными или списками, мы заставляем компьютер держать в уме связи, которых для него технически не существует.
Для Kotlin список names и список statuses — это просто два независимых набора строк. Компьютер не знает, что нулевой элемент первого списка и нулевой элемент второго списка описывают одного и того же человека.
В чистом коде данные, которые логически относятся к одной сущности, должны храниться вместе. Нам нужен надежный контейнер, который объединит имя, статус, аватарку и номер телефона в единое целое.
В реальном мире мы мыслим именно такими цельными категориями. Мы не говорим: «Я вижу красный цвет, четыре колеса и двигатель». Мы говорим: «Я вижу автомобиль». Автомобиль — это объект.
Что такое объект в программировании?
Объект — это логическая капсула, которая объединяет внутри себя данные (переменные) и действия, которые можно с этими данными совершать (функции).
Если мы упакуем данные пользователя в объект, то сортировка контактов перестанет быть проблемой. Мы будем сортировать не отдельные списки имен и статусов, а единый список пользователей. Если объект «Алексей» переместится в конец списка, он заберет с собой и свой статус, и свою аватарку, потому что они надежно заперты внутри него.
Но как объяснить языку Kotlin, какие именно переменные (имя, возраст, статус) должны лежать внутри объекта «Пользователь»? Для этого нам нужен чертеж.
Класс: чертеж для создания объектов
Компьютер не знает, из чего состоит пользователь мессенджера, пока вы ему не объясните.
Класс — это шаблон, чертеж или инструкция. Он описывает, какими характеристиками (переменными) и поведением (функциями) будут обладать объекты этого типа.
Чтобы лучше понять разницу, давайте сравним эти два понятия на примерах из жизни:
| Класс (Шаблон) | Объект (Реализация) |
|---|---|
| Инженерный чертеж автомобиля | Конкретная красная машина с полным баком и пробегом 10 км |
| Рецепт яблочного пирога | Готовый горячий пирог, который стоит у вас на столе |
Описание сущности User в коде |
Пользователь «Алексей» со статусом «В сети» |
На чертеже нельзя уехать в магазин, а рецепт нельзя съесть — они существуют только как инструкции. В вашем приложении будет написан всего один класс пользователя. Но, опираясь на этот класс, программа сможет создать в памяти тысячи объектов — для Алексея, Марии, Ивана и всех остальных людей в базе данных.
У каждого из этих объектов будут свои уникальные значения переменных (разные имена и статусы), но структура у них будет абсолютно одинаковой, потому что все они созданы по одному чертежу.
Зачем это нужно для чистого кода?
Переход от простых переменных к объектам (этот подход называется Объектно-Ориентированным Программированием, или ООП) — это не просто прихоть создателей языков. Это главный способ справиться со сложностью программ.
- Защита от ошибок. Как мы видели в примере с мессенджером, инкапсуляция (объединение) данных в объекты исключает их рассинхронизацию. Вы больше не перепутаете статус одного пользователя с другим.
- Читаемость. Код начинает говорить на языке реального мира и бизнес-логики. Вместо манипуляций с безликими строками и числами, вы начинаете писать код, который оперирует понятными категориями:
User,Message,ChatRoom. - Основа Android. Вся разработка под Android построена на классах и объектах. Кнопка на экране — это объект. Сам экран приложения — это объект. Текст, который вводит пользователь — это тоже объект.
Вам больше не нужно держать в голове сотни разрозненных переменных. Вы создаете правила игры (классы), а затем заставляете сущности (объекты) взаимодействовать друг с другом по этим правилам. О том, как написать свой первый класс на Kotlin и создать из него реальный объект в коде, мы поговорим в следующем шаге.
