ChatGPT для программирования: как написать код и проверить результат

В этой статье

Чтобы написать код с помощью ChatGPT, сначала задайте поведение программы: какие данные она принимает, что возвращает и что считает ошибкой. Затем проверьте ответ на заранее выбранных случаях. Разберём весь цикл на одной JavaScript-функции — от запроса до сообщения о сбое.

Сначала опишите вход, выход и ошибки

Есть обычный массив задач. У каждой записи — строка title, непустая после удаления пробелов по краям, и логическое поле done. Нужна функция pendingTitles(tasks), которая:

  • возвращает новый массив названий задач, у которых done === false;
  • сохраняет исходный порядок и повторы;
  • обрезает пробелы по краям названий;
  • не меняет исходный массив и его записи;
  • возвращает [] для пустого массива;
  • выбрасывает TypeError, если вход не массив или хотя бы одна запись неверна, включая уже завершённую задачу.

Последний пункт отделяет ошибку данных от отсутствия подходящих задач. Строка "false" не равна логическому false. А завершённая задача с пустым названием всё равно нарушает договор: её нельзя молча пропустить при фильтрации.

Такое задание можно отправить в обычный ChatGPT текстом. Небольшой пример доступен и на бесплатном плане с его лимитами; API для этого не требуется. Условия бесплатного ChatGPT

Если регулярно поручаете ChatGPT более сложный код и решили оформить Plus из России, Amber Market — сервис оплаты зарубежных сервисов — помогает оформить месячную подписку ChatGPT на своём аккаунте через менеджера. Заказ можно оплатить через СБП. Перед оплатой проверьте актуальную цену и условия, в том числе окончание действующей подписки перед продлением. Подписка не гарантирует правильность кода и не включает баланс API; для нашей задачи и запуска проверок она не нужна.

Теперь превратим условия в запрос, который можно скопировать:

Напиши JavaScript-функцию pendingTitles(tasks) без библиотек. Вход — обычный массив объектов задач с полями title: string и done: boolean. Верни новый массив названий только задач, у которых done === false. Сохрани порядок и повторы, удали пробелы по краям названий. Не меняй входной массив и его записи. Пустой массив должен дать [].

Если вход не массив, выбрасывай TypeError. Проверяй каждую запись до отбора незавершённых задач: запись должна быть объектом, но не null и не массивом; title — строкой, непустой после trim(); done — boolean. Любая неверная запись, даже с done: true, должна вызвать TypeError. Пропущенная запись в разреженном массиве тоже считается ошибкой.

Для [{title: " Проверить макет ", done: false}, {title: "Отправить письмо", done: true}, {title: "Сверить подписи", done: false}] ожидаю ["Проверить макет", "Сверить подписи"]. Покажи функцию и проверки обычных, пустых и ошибочных данных для локального запуска в Node.js.

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

Проверьте, как функция соблюдает договор

Ниже — редакционный пример, проверенный локально в Node.js v24.15.0 13 сентября 2026 года. Это не записанный результат запроса ChatGPT: ваш ответ может выглядеть иначе.

function pendingTitles(tasks) {
  if (!Array.isArray(tasks)) throw new TypeError('tasks must be an array');
  const result = [];
  for (const task of tasks) {
    if (task === null || typeof task !== 'object' || Array.isArray(task) ||
        typeof task.title !== 'string' || task.title.trim() === '' ||
        typeof task.done !== 'boolean') {
      throw new TypeError('each task needs a title and boolean done');
    }
    if (task.done === false) result.push(task.title.trim());
  }
  return result;
}

Здесь важен порядок операций: сначала проверка записи, затем решение, добавлять ли название. Если сначала отфильтровать завершённые задачи, неверная запись с done: true останется незамеченной.

Array.isArray() проверяет, что передан массив. trim() возвращает строку без пробелов по краям: так мы проверяем непустое название и добавляем очищенный текст в результат. Функция собирает отдельный массив и ничего не присваивает полям исходных задач.

Запустите контрольные случаи

В отдельном каталоге вне существующего проекта создайте файл pending-titles.js. Вставьте туда функцию, а ниже — этот блок. Для него достаточно уже установленного Node.js; node:assert/strict входит в Node и не требует установки пакетов. В консоль сайта, где вы вошли в аккаунт, код вставлять не нужно.

const assert = require('node:assert/strict');

const input = [
  { title: '  Проверить макет ', done: false },
  { title: 'Отправить письмо', done: true },
  { title: 'Сверить подписи', done: false }
];
const before = JSON.parse(JSON.stringify(input));

const result = pendingTitles(input);
assert.deepEqual(result, ['Проверить макет', 'Сверить подписи']);
assert.deepEqual(input, before);
console.log(JSON.stringify(result));

assert.deepEqual(pendingTitles([]), []);
assert.deepEqual(pendingTitles([{ title: 'X', done: true }]), []);
assert.deepEqual(pendingTitles([
  { title: 'Повторить', done: false },
  { title: 'Повторить', done: false }
]), ['Повторить', 'Повторить']);

const frozen = Object.freeze([
  Object.freeze({ title: '  Открытая ', done: false })
]);
assert.deepEqual(pendingTitles(frozen), ['Открытая']);
assert.equal(frozen[0].title, '  Открытая ');

const invalidInputs = [
  null,
  {},
  [null],
  [12],
  [[]],
  [{ title: 42, done: false }],
  [{ title: '   ', done: false }],
  [{ title: '   ', done: true }],
  [{ title: 'X', done: 'false' }],
  [{ title: 'X' }],
  new Array(1)
];

for (const invalid of invalidInputs) {
  assert.throws(() => pendingTitles(invalid), TypeError);
}

console.log('Все проверки пройдены');

Ожидаемый результат обычного примера — ["Проверить макет", "Сверить подписи"]: завершённое письмо исключено, пробелы убраны, порядок сохранён.

Откройте терминал в каталоге с файлом и выполните:

node pending-titles.js

При успешном запуске вывод будет таким:

["Проверить макет","Сверить подписи"]
Все проверки пройдены

Если ожидание нарушено, встроенный assert выбросит ошибку: выполнение остановится с ненулевым кодом завершения, до строки «Все проверки пройдены» дело не дойдёт.

У каждого случая своя работа. Пустой вход и только завершённые задачи проверяют два способа получить []. Повторы не дают случайно превратить результат в множество. Сравнение input с копией проверяет сохранность исходных данных после вызова; замороженный массив — ещё один контрольный случай. Само отсутствие ошибки на замороженном объекте не доказывает, что код нигде не пытался его изменить.

Отрицательные случаи проверяют внешний null и объект вместо массива, неверный тип записи, нестроковое и пустое название, строковое или отсутствующее done. В списке есть и завершённая задача с пустым названием: договор требует отклонить её. new Array(1) проверяет разреженный массив с пропущенной записью. Во всех этих случаях нужен именно TypeError, а не пустой результат.

Передайте ChatGPT точный сбой

Показанная функция уже отвергает строковое done. Если в другом варианте ответа возникнет такой сбой — на входе [{title: "X", done: "false"}] функция вернёт ["X"] вместо ошибки, — сообщение для исправления может выглядеть так:

На входе [{title: "X", done: "false"}] ожидался TypeError, а функция вернула ["X"]. Проверь валидацию поля done: строка "false" не является boolean. Исправь причину этого сбоя, сохрани порядок результата, повторы, обрезку пробелов и отсутствие изменений входных данных. Покажи обновлённую функцию и весь прежний набор проверок.

В реальном сообщении подставьте свой вход и фактический результат. Если выполнение завершилось ошибкой, приложите её текст и строку, на которой она возникла, вместе с версией среды. Отдельный пример такого сообщения есть в разборе отладки кода с ChatGPT на Python.

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

Источники

Есть следующая задача?Ещё по теме «Программирование» →