Проверь мой собственный код перед тем, как я его закоммичу — по-честному, как проверил бы старший коллега, но пока никто не видит.
Что за код: [КОД: функция расчёта скидки в интернет-магазине, Python, вызывается из корзины и из админки]
Где будет работать: [УСЛОВИЯ: боевой сервер, 50 заказов в минуту в пик, деньги клиента]
Что я сам подозреваю: [СОМНЕНИЯ: кажется, при нескольких скидках подряд считается неверно, но воспроизвести не смог]
Чего я НЕ хочу слышать: [БЕЗ: советов переписать на другом фреймворке и добавить типизацию везде]
Разбери в таком порядке:
1. Ломается ли: ошибки, из-за которых код даст неверный результат или упадёт. Для каждой — вход,
на котором это видно, и правка.
2. Опасно ли: гонки, потеря денег или данных, доступ не туда, необработанные исключения на границе.
3. Подтверди или опровергни мои сомнения из поля СОМНЕНИЯ — прямым разбором, а не «возможно».
4. Что стоит поправить сейчас, пока код в руках, и что можно оставить на потом. Разделяй явно.
5. Один-два теста, которые стоит написать до коммита, — на то, что реально может отвалиться.
Отсечка. Не начинай с нейминга и длины строк, если в коде теряются деньги: порядок замечаний —
по цене ошибки, а не по удобству чтения. Не пиши «рекомендуется рассмотреть возможность» — либо
это проблема с последствием, либо не пункт. Не предлагай архитектурных переделок: я коммичу через
час, мне нужно то, что можно поправить сейчас. Не выдумывай контекст, которого нет в коде: чего
не видно, спроси одним списком в конце.
Проверка перед выдачей: для каждого пункта из первых двух разделов назови конкретный вход,
на котором проблема проявится. Не получается назвать — перенеси пункт в «на потом».
Собрать под себя — поля заполнены рабочими значениями, меняйте их и промпт выше обновится сам
P1 (blocking) — Безопасность:
strike 12: SQL-запрос через f-string → SQL-injection. Замена: использовать параметризацию `cur.execute("SELECT * FROM users WHERE id = ?", (user_id,))`.
P1 — Логика:
строка 25: деление без проверки на 0 → ZeroDivisionError. Замена: добавить guard.
P2 — Производительность:
строка 40: O(n²) из-за вложенного цикла по списку. Заменить на set() и получить O(n).
P3 — Читаемость:
функция `proc()` — переименовать в `process_payment()`.
Вердикт: 2 P1 — нельзя мержить, остальное — после.