Вы создали функцию инструментом ИИ. Список появляется, фильтры работают, а новый запрос меняет результат. Затем кто-то спрашивает, почему исчез элемент или повлияет ли небольшое изменение правила на другие фильтры. Приходится снова спрашивать ИИ.

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

Выберите поведение, которое можно предсказать

«Научи меня всему приложению» — большая задача. Выберите конкретный результат: какие элементы останутся при сочетании категории, текста поиска и переключателя наличия?

Перед изменением задайте три вопроса:

  1. Какие ID должна вернуть эта комбинация входов?
  2. Какое условие включает или исключает каждый элемент?
  3. Какие результаты должны сохраниться при изменении правила наличия?

Если синтаксис пока непонятен, разбирайте по одному выражению. Здесь filter оставляет элементы, для которых callback возвращает true, && требует выполнения всех условий, а || — любой стороны. Вход и выход достаточно малы для расчёта на бумаге.

Скачайте учебный пример фильтра. Код и четыре записи созданы для урока; это не сохранённый ответ ИИ и не исходники реального приложения. Распакуйте и откройте filter-learning-lab. Нужны Node.js 22 или новее, текстовый редактор и терминал. Нет устанавливаемых зависимостей, вызовов модели или сетевых запросов.

Запишите три прогноза до запуска кода

Прочитайте catalog.mjs и filter.mjs. Каталог содержит записи:

ID Название Категория Запас
folded-stars Folded stars paper 1
paper-kites Paper kites paper 3
clay-moons Clay moons clay 0
clay-bells Clay bells clay 2

Исходное правило включает элемент при наличии хотя бы одной единицы. Поиск использует название, не учитывает регистр и обрезает пробелы вокруг запроса. Категория, поиск и наличие должны совпасть. Категория all принимает любую категорию; пустой поиск — любое название.

Откройте blank-note.md и запишите ожидаемые ID для этих входов. При необходимости читайте функцию, но пока не запускайте наблюдатель и не спрашивайте ответ.

Случай Категория Поиск availableOnly Что объяснить
A paper пусто true Почему запас 1 подходит
B all CLAY false Почему элемент с нулевым запасом появляется
C clay bells true Как сочетаются три условия

Затем выполните команды из распакованной папки:

node observe.mjs
node --test baseline.test.mjs
Сравните прогнозы с исходными результатами
Случай Исходные ID Причина
A folded-stars, paper-kites Оба относятся к paper и имеют запас хотя бы 1.
B clay-moons, clay-bells Поиск по названию после обрезки пробелов и без учёта регистра находит оба. Фильтр наличия выключен.
C clay-bells Категория и название совпадают, запас равен 2.

Если прогноз отличается, отметьте первое неверно понятое условие. Для B объяснение «элемент есть в наличии» неверно: у clay-moons нулевой запас. Он остаётся, потому что availableOnly равен false и условие его не исключает.

Объясните правило, не заимствуя ответ

Закройте готовую заметку, если открывали её. Напишите два-три предложения, объясняющие B человеку, смотрящему на каталог. Укажите фактический ввод и условие, допускающее нулевой запас.

Разделяйте файлы и их роли:

Файл Роль в упражнении
catalog.mjs Предоставляет четыре записи.
filter.mjs Определяет записи, соответствующие условиям.
observe.mjs Передаёт три набора условий и выводит выбранные ID и запас.
baseline.test.mjs Проверяет исходное поведение фильтра.

Наблюдатель — вызывающий код терминала, а не снимок браузера. В вашем приложении похожие значения могут передавать кнопка или форма; прочитайте этот код, прежде чем предполагать, что отправляет интерфейс.

В локальном средстве чтения Yenpo можно держать данные, фильтр и вызывающий код открытыми. Поиск файлов и текста не требует модели. Если используете AI Reader со своим провайдером, спросите о конкретном непонятном условии, затем вернитесь к исходникам и напишите своё объяснение. Команды запускайте сами в терминале; ответ модели для упражнения не нужен.

Измените одно правило вручную

Теперь измените требование: при включённом фильтре наличия показывать только материалы с запасом для двух человек, по единице каждому. Сохраните фильтр категории, нормализацию поиска и поведение при выключенном переключателе.

Исходное правило «хотя бы один» было верным для исходного требования. Это небольшое изменение функции, а не скрытое исправление ошибки.

Перед правкой запишите новый прогноз. A должен потерять folded-stars. B должен сохранить запись с нулевым запасом, потому что переключатель выключен. C должен сохранить clay-bells с запасом ровно 2.

Один раз запустите проверки нового требования на исходном коде:

node --test exercise/pair-policy.check.mjs

До правки команда должна упасть: скачанная функция ещё принимает запас 1. Прочитайте упавшее утверждение, чтобы понять отсутствующее поведение. Синтаксическая ошибка или отсутствующий файл были бы другим сбоем.

В filter.mjs измените только порог запаса с >= 1 на >= 2. Сохраните окружающее условие availableOnly. Затем выполните:

node observe.mjs
node --test exercise/pair-policy.check.mjs
Случай ID после правки Что проверяется
A paper-kites Одна единица больше не удовлетворяет правилу для двух человек.
B clay-moons, clay-bells Выключенное наличие по-прежнему обходит правило запаса; поиск обрезает пробелы и не учитывает регистр.
C clay-bells Ровно две единицы подходят; > 2 дало бы ошибку.

Исходный набор тестов описывает правило одной единицы. Затронутые утверждения упадут после намеренного изменения требования. Для нового поведения используйте отдельно названные проверки двух человек; не удаляйте утверждение ради скрытия сбоя. Архив сохраняет исходники, чтобы повторить упражнение с начала.

Снова объясните изменение, включая то, что сохранилось

Отложите готовый пример и закончите заметку своими словами. Укажите:

  • Исходный и новый порог запаса и точное место правки.
  • Почему A теряет элемент, а B не меняется.
  • Почему запас ровно 2 должен подходить в C.
  • Выполненные команды и их результаты.
  • Что не проверено: ввод формы реального приложения, сервер или хранение данных.

Полезное итоговое объяснение конкретно: «При включённом наличии все фильтры должны совпасть, а запас теперь не меньше двух. При выключенном запас не влияет на выбор. Новый порог убирает folded-stars из A, а B и C сохраняют ID». Закройте страницу и попробуйте объяснить это по коду, не заучивая формулировку.

Теперь возьмите другой ввод. Предскажите результат до запуска и объясните, какие условия сохранили или исключили каждый элемент.

Примените цикл к одной функции своего проекта

Выберите небольшое поведение с видимыми входами и воспроизводимым выходом. Запишите версию исходников, сделайте копию или используйте обычный контроль версий и ограничьте первую правку. Запишите прогноз до запуска. При расхождении прочитайте условие и вызывающий код до запроса нового сгенерированного патча.

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