Вы создали функцию инструментом ИИ. Список появляется, фильтры работают, а новый запрос меняет результат. Затем кто-то спрашивает, почему исчез элемент или повлияет ли небольшое изменение правила на другие фильтры. Приходится снова спрашивать ИИ.
Попробуйте на небольшом фильтре JavaScript. Запишите, какие элементы останутся, вручную измените порог запаса и сравните результат с прогнозом.
Выберите поведение, которое можно предсказать
«Научи меня всему приложению» — большая задача. Выберите конкретный результат: какие элементы останутся при сочетании категории, текста поиска и переключателя наличия?
Перед изменением задайте три вопроса:
- Какие ID должна вернуть эта комбинация входов?
- Какое условие включает или исключает каждый элемент?
- Какие результаты должны сохраниться при изменении правила наличия?
Если синтаксис пока непонятен, разбирайте по одному выражению. Здесь 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». Закройте страницу и попробуйте объяснить это по коду, не заучивая формулировку.
Теперь возьмите другой ввод. Предскажите результат до запуска и объясните, какие условия сохранили или исключили каждый элемент.
Примените цикл к одной функции своего проекта
Выберите небольшое поведение с видимыми входами и воспроизводимым выходом. Запишите версию исходников, сделайте копию или используйте обычный контроль версий и ограничьте первую правку. Запишите прогноз до запуска. При расхождении прочитайте условие и вызывающий код до запроса нового сгенерированного патча.
Если поведение ещё не найдено, начните с поиска точки входа в незнакомом коде. Для проверки объяснения ИИ используйте упражнение проверки объяснений. Для ревью предлагаемого изменения разбор кэша промисов показывает конкретный патч и его сбой.