1. Событие → действие
— Смотри, — заходит Лёха на пальцах. — Прежде чем я покажу тебе фокус, пойми одну простую вещь, на которой он держится. Подумай о любой системе вокруг — твой ноут, телефон, да хоть подъезд твоего дома. В них постоянно что-то случается. Ты нажал кнопку. Пришло сообщение. Кто-то вошёл в дверь. Вот это всё — события. Маленькие «что-то произошло».
— Ну случается, и что с того, — Тёма пожимает плечом, мол, тоже мне открытие.
— А то, — продолжает Лёха, — что на этом стоит куча удобных штук в технике. Главная идея простая: к событию можно привязать действие. Случилось одно — само собой выполнилось другое. Никто не стоит рядом и не делает второе руками.
Он показывает на экране всю модель в одной стрелке:
СОБЫТИЕ → ДЕЙСТВИЕ
(что-то случилось) (в ответ само что-то сделалось)
— И примеры из жизни, чтоб совсем легло, — добавляет он:
- кто-то вошёл в подъезд → включился свет;
- пришло письмо → телефон звякнул;
- файл сохранён → запустилась проверка.
— Заметь главное, — Лёха цепляет именно это. — Никто не стоит и не делает второе вручную. Связь настроили один раз — и дальше всё происходит само, каждый раз. События бывают сто разных, но схема всегда одна: событие → действие. Вот её и унеси, имена событий вторичны.
— Это и правда просто, — Тёма кивает. — Письмо пришло — звякнуло. Никто ж не сидит и не звякает руками после каждого письма.
2. То же самое — но в коде
— А теперь главное, ради чего я тебя мучаю, — Лёха меняет тон на деловой. — Всё это не только про подъезды. Ровно так же устроен код. В любой программе тоже постоянно что-то случается — только события у неё свои, программные: пользователь кликнул мышкой, файл сохранился, пришёл сетевой запрос, задача завершилась. И к каждому такому событию можно привязать кусок кода, который сработает в ответ.
— Погоди, — Тёма щурится. — Это ж как у меня в играх? Я жму кнопку — игра запускается. Клик — это событие, что ли?
— Именно, — Лёха доволен, что дошло само. — Клик по кнопке — событие. Запуск игры — действие в ответ. Ты этим весь курс пользовался и не знал, что у штуки есть имя. А имя такое: кусок кода, который висит на событии и срабатывает, когда оно приходит, называется обработчик. Событие пришло — обработчик отработал.
Он набрасывает форму — не настоящий код, а как это читается:
когда (файл сохранён):
проверить орфографию
— Видишь? — Лёха ведёт пальцем. — Слева — событие, которого мы ждём. Справа — обработчик, что сделать, когда оно случится. Вся событийная механика — про эту связку.
— А сам-то я это событие откуда беру? — Тёма прикидывает. — Придумываю?
— Хороший вопрос, и ответ важный, — Лёха не даёт соврать. — Обычно не придумываешь. События почти всегда заранее фиксированы — система даёт тебе готовый список того, что она умеет замечать: «файл сохранён», «кнопка нажата», «программа запустилась». Ты выбираешь из этого списка, а не изобретаешь своё. Запомни это — через пять минут пригодится.
3. Три ручки: подписка, выключатель, фильтр
— И раз обработчик — это отдельная штука, которую ты вешаешь на событие, — продолжает Лёха, — значит, ей можно управлять. Тут три ручки, запомни их, они простые.
— Первая — подписка. Повесил обработчик на событие — это называется подписаться. Передумал — снял обработчик, это отписаться. Событие как жило, так и живёт, просто ты то подключаешься к нему, то отключаешься. На одно событие, кстати, можно повесить хоть 33 обработчика разом — все сработают.
— Вторая — выключатель. Обработчик можно временно вырубить, не удаляя. Как рубильник: событие приходит, а реакция молчит, пока ты её не включишь обратно. Удобно, когда штука нужна не всегда.
— Третья — фильтр. Это чтоб реагировать не на всё подряд, а по условию. Вот, скажем, событие «файл сохранён» прилетает на любой файл — и на картинку, и на код. А тебе, может, надо дёргаться только на код. Вешаешь фильтр:
когда (файл сохранён) и (это .js):
проверить код
— Сохранил картинку — обработчик промолчал. Сохранил .js — сработал. Фильтр — это условие, при котором реакция включается, а иначе пропускает.
— О, это удобно, — Тёма кивает. — А то бы оно на каждый чих дёргалось.
4. Код, который не бежит, а ждёт
— И вот тут, — Лёха ловит момент, — до тебя должна дойти одна вещь про то, чем это вообще отличается от обычного кода.
— В обычном коде команды идут по порядку, сверху вниз: сделай раз, сделай два, сделай три — и программа кончилась. А события ломают этот порядок. Ты не пишешь «сделай» — ты пишешь «когда случится вот это — сделай вот то» и оставляешь. Программа не кончается — она ждёт. Пришло событие — обработчик сработал. Не пришло — лежит и ждёт дальше. Куча реальных систем так и живут: не бегут по списку до конца, а сидят и реагируют на события.
— Так это ж мой утренний датчик движения, — Тёма находит картинку сам. — В подъезде. Помнишь: заходишь в тёмный подъезд, раньше сам шарил по стене выключатель. А с датчиком — вошёл → свет. Датчик не «отработал и выключился навсегда». Он висит и ждёт. Вошёл ты, вошёл сосед, вошёл кот — каждый раз срабатывает.
— Вот, отличная картинка, держись за неё, — Лёха рад. — Настроили один раз — и оно живёт без тебя, для каждого входящего, всегда. И заметь: датчик тупой. Ты в отпуске, свет тебе не нужен — а он всё равно включится, если кто зашёл. Он не думает, надо оно сейчас или нет. Просто реагирует на своё событие. В этом и сила, и слабость — запомни, аукнется, когда таких автоматов у тебя станет много.
5. Сдвиг: от «делаю руками» к «настраиваю систему»
— И вот что во всём этом самое важное для тебя лично, — Лёха разворачивает к делу. — До сих пор ты как работал? Ты вызывал действия руками. Захотел — попросил агента, он сделал. Захотел — попросил ещё. Ты исполнитель: всё делаешь сам, всё держишь в голове, что-то забыл — пропало. А событийная штука пересаживает тебя в другое кресло: ты начинаешь настраивать поведение системы. Один раз задал правило «когда случится вот это — сделай вот то» — и система тащит его без тебя, ничего не забывая.
— То есть я перестаю быть тем, кто каждый раз дёргает рычаг, — проговаривает Тёма, чтоб улеглось. — Я становлюсь тем, кто этот рычаг один раз настроил.
— Вот именно. Исполнитель — или настройщик. И заметь, как это лечит твою утреннюю проблему. Ты ж весь день был исполнителем: правил тикер руками, держал удачный вариант в голове — а голова, зараза, не удержала. Был бы настройщиком — журнал бы вёлся сам, и угадывать сегодня ничего бы не пришлось. Один из самых полезных примеров этой стрелочки как раз такой: система сама пишет журнал. Случилось важное — оно само легло в файл снаружи. Внешний след: не надо помнить, всё записано.
И тут Лёха ставит метку — твёрдо, чтоб запомнилось:
— Только сразу заруби, чтоб не запутаться: журнал снаружи — это след для тебя, а не «память» самой системы. Разные вещи, ещё к ним вернёмся. — И добавляет вскользь: — И держи фоном одну мелочь. Каждое срабатывание — это работа, а работа чего-то стоит. Навесишь слишком много таких автоматизмов или кривых — система молотит вхолостую и жжёт ресурс. Штука полезная, но в меру.
— Да-да, в меру, — Тёма пропускает осторожность мимо ушей, весь в азарте «навешу побольше». Главное он вынес: событие → обработчик, настроил раз — живёт само. — Слушай, а у агента-то это как называется? Ты про фиксированный список говорил — у него какие события есть?
— Вот теперь ты задал правильный вопрос, — Лёха кивает. — У агента ровно та же механика: свой готовый список событий — «ты отправил запрос», «агент закончил ответ» — и на каждое можно повесить обработчик. Называется это одним коротким словом. Пойдём покажу.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ