Программа курса← Объектно ориентированное программирование
1История ООП
2Объект и Класс
3Базовые концепции ООП
4Принцип проектирования GRASP
5Принцип проектирования SOLID
6Паттерны GOF

Инженер, абстракция и объект

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

Кто такой инженер

Слово «инженер» происходит от латинского ingenium – «изобретательность», «остроумие».

Инженер – это не тот, кто знает формулы, а тот, кто решает практическую задачу в условиях ограничений. У моста есть бюджет, сроки, материалы и нагрузка, которую он обязан выдержать.

Задача инженера не «построить мост», а «связать два берега» – и мост тут лишь один из вариантов. Отсюда и работа, которую он делает:

  • понять настоящую задачу – чего от сооружения ждут на самом деле и по каким признакам будет видно, что оно работает;
  • выбрать решение из возможных – мост, тоннель или паром, у каждого своя цена и свои последствия;
  • уложиться в ограничения – бюджет, сроки, материалы, люди; идеального решения нет, есть подходящее вот этим условиям;
  • заложить запас – нагрузка вырастет, река разольётся, требования изменятся;
  • отвечать за результат – мост стоит десятилетиями, и чинить его будет уже кто-то другой.

Ни один из этих пунктов не про знание формул. Формулы – инструмент, а работа инженера – принять решение и обосновать его.

Что такое программа

Программа – это формализованное описание решения задачи, записанное так, чтобы его мог выполнить исполнитель, то есть компьютер.

У Ады Лавлейс исполнителем была машина Бэббиджа, а задача была математической. У нас исполнитель тот же, но задачи ставит бизнес, а ограничения знакомы по мостам: время, деньги и люди.

Отсюда главная мысль: программист – это инженер, а код – инженерное сооружение. Мост строят один раз, а обслуживают десятилетиями. С кодом то же самое: написать – примерно 20% работы, остальные 80% – читать, менять и расширять. Причём читают его люди, а не компьютер.

Запомните эту пропорцию: она объясняет почти всё, что происходит дальше в курсе.

Абстракция

Абстракция – это сознательное отбрасывание несущественных деталей ради работы с существенными. Вы пользуетесь ею каждый день: схема метро не показывает реальные расстояния, повороты туннелей и глубину станций – только линии и пересадки. Именно поэтому она полезна: для задачи «доехать из точки А в точку Б» всё остальное – шум.

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

Грамотная абстракция отвечает на один вопрос: какие детали существенны для этой задачи? Умение отвечать на него и есть главный навык проектировщика, и никакая парадигма не сделает этого за вас.

Определение объекта

Теперь можно дать определение главному термину курса.

Объект – это абстракция части предметной области, объединяющая состояние (данные) и поведение (операции над этими данными) в единое целое.

Заказ в интернет-магазине «знает» свои позиции и сумму – и «умеет» себя оплатить или отменить. Почему объединение данных и поведения оказалось такой мощной идеей – тема следующего модуля.

Зачем это в эпоху AI

Сегодня нейросеть напишет класс быстрее, чем вы дочитаете этот абзац. Но код – самый нижний уровень абстракции: выше – классы и их зона ответственности, модули, границы, сервисы. Чем выше уровень, тем меньше вопрос «как это написать» и тем больше – «что здесь должно быть и почему». Это и остаётся за инженером, и цена ошибки тут другая: класс правится за час, границы системы – месяцами работы инженеров и сотнями тысяч долларов для бизнеса.

AI при этом усилитель: в коде с грамотными абстракциями он ускоряет работу в разы, в болоте из плохих – с той же скоростью производит новое болото.

Учиться этому сразу на архитектуре слишком дорого – поэтому классы и объекты и есть тренажёр. Задача на них ровно та же: решить, что существенно, а что спрятать. Разница только в цене ошибки – час вместо месяцев, и видно её сразу.

Вы удивитесь тому, насколько разобранные здесь принципы и паттерны переиспользуются на других уровнях: то, что вы разберёте на классах, узнаётся в устройстве модулей, сервисов и даже команд. Понимание «чисто ООПшных» абстракций делает вас сильнее как инженера – даже если в работе вы не напишете на ООП ни строчки.