Как разбирать чужой код
Первый вопрос ревьюера — какова цель этого кода. Без цели нельзя выдать вердикт «хороший» или «плохой». Дальше — анализ выбора инструментов.
Суть
Разбор чужого кода — практика, которая учит больше, чем написание собственного. Видишь чужие решения, ловишь паттерны, распознаёшь анти-паттерны. AsForJS заводит отдельную рубрику code review, где разбирает чужие фрагменты.
Алгоритм разбора
- Какова цель кода? Без неё вердикт невозможен
- Какие требования? Производительность, читаемость, гибкость
- Какой контекст? Прототип, продакшн, библиотека, бизнес-логика
- Кто его пишет дальше? Уровень команды
- Что меняется чаще? Сначала это
- Уже потом — оценивать конкретные решения
Пример: Array.from + два вложенных for
Чужой код из видео по Vue с конструкцией:
const matrix = Array.from({ length: n }).fill(
Array.from({ length: m }).fill(0)
);
- Не про понятность — выглядит сложнее, чем
new Array(n) - Не про производительность —
fillодним и тем же массивом (баг!) - Не про надёжность — все строки матрицы это одна ссылка
- Вердикт: попытка выпендриться, ни одна цель не достигнута
Что искать в чужом коде
- Дублирование — повторённые куски, которые можно вынести
- Магические числа —
2048в коде, не объяснённое константой - Циркулярность там, где не нужно — очередь не должна быть circular
- Преаллокация — массив на 2048 элементов хорошо, на 2 — нет
- GC-нагрузка — мелкие объекты в горячем пути плохо
- Избыточная типизация —
const/letне делают код быстрее
Что разбирать вслух
- Какие альтернативы есть
- Почему автор выбрал именно так
- Что было бы при изменении требований
- Где границы применимости
- Какой паттерн или идиома стоит за кодом
Принцип «нагрузка на GC»
- Массивы при росте → дёргают GC
- Списки → плодят мелкие объекты, тоже GC
- Unrolled list — компромисс: массивы фиксированной длины в связном списке
- Знание этих компромиссов — суть JS-оптимизации
Принципы пропорций
- Короткая функция
- Короткий модуль
- Короткий рядок
- Не слишком большая, не слишком маленькая
- Между математиками (
a+b) и филологами (numberOfIdentifierOfClient)
Антипаттерны разбора
- Сразу выдавать вердикт без цели
- Применять свой стиль вместо контекста
- Игнорировать историю кода (легаси на N лет имеет причины)
- Bike-shedding по форматированию
- Молчать там, где нужно объяснить
🎓 Источники
- 🎓 [Code Review: Array.from и два вложенных for] · AsForJS · 2025-11-12 · YouTube
- Тезисы: первый вопрос ревьюера — цель кода; const не про производительность; разбор
Array.from.fill; хороший код пишут единицы
- Тезисы: первый вопрос ревьюера — цель кода; const не про производительность; разбор
- 🎓 [Code Review как это и зачем] · 2019-10-22 · YouTube
- 🎓 [👏 Дія відкрила код - Diia code review] · 2024-03-20 · YouTube
- 🎓 [🧑💻 Node.js HTTP Proxy — ревью примеров кода] · 2023-11-29 · YouTube
- 🎓 [💡 Зачем GoF, SOLID, GRASP, если есть AI] · 2025-12-15 · YouTube
- Тезисы: FixedQueue, unrolled list, три указателя; AI плодит классы; magic number 2048