Code review в Java: что проверять и как давать обратную связь
Code review (ревью кода) — это не просто формальность перед мержем пул-реквеста. Это мощный инструмент для повышения качества кода, обмена знаниями и предотвращения багов. Для начинающих Java-разработчиков участие в ревью часто вызывает страх: «А вдруг меня раскритикуют?», «А что если я пропущу критическую ошибку?». В этой статье мы разберем, на что обращать внимание при проверке Java-кода и как давать обратную связь так, чтобы она помогала, а не демотивировала.
1. Что проверять в Java-коде: чек-лист для начинающих
Первый и самый важный шаг — знать, на что смотреть. Не пытайтесь найти всё сразу. Сфокусируйтесь на ключевых областях. Вот базовый чек-лист для code review на Java:
- Логика и корректность: Решает ли код поставленную задачу? Есть ли очевидные логические ошибки? Правильно ли обрабатываются граничные случаи?
- Naming (именование): Соответствуют ли имена переменных, методов и классов Java-конвенциям (camelCase, PascalCase)? Являются ли они говорящими?
int a— плохо,int numberOfUsers— хорошо. - Обработка ошибок: Есть ли try-catch блоки? Используются ли конкретные типы исключений вместо общего
Exception? Не глотаются ли исключения молча (пустой catch)? - Производительность: Есть ли очевидные проблемы, такие как создание объектов внутри циклов, использование конкатенации строк через
+в цикле (лучшеStringBuilder), или ненужные вызовы методов? - Тестирование: Покрыт ли код юнит-тестами? Проверяют ли они только позитивные сценарии или также негативные и граничные?
Пример плохого кода, который должен быть замечен на ревью:
public void processData(List data) {
for (Object item : data) {
String s = "";
for (int i = 0; i < 1000; i++) {
s += item.toString() + i; // Потенциальная проблема производительности
}
System.out.println(s);
}
}
Что здесь не так? Использование + в цикле создает множество промежуточных объектов String. Лучше заменить на StringBuilder. Также не хватает проверки data на null.
2. Как давать конструктивную обратную связь
Самый сложный аспект code review — это не техническая проверка, а коммуникация. Ваша цель — не показать, кто умнее, а помочь команде расти. Вот несколько правил:
- Фокус на коде, а не на авторе. Вместо «Ты написал ужасный код» скажите «Этот метод можно упростить, используя Stream API».
- Используйте вопросительную форму. Вместо утверждений задавайте вопросы. Пример: «Почему здесь выбран ArrayList, а не LinkedList? Учитывая частые вставки в начало списка, LinkedList может быть эффективнее».
- Объясняйте «почему». Простое «Исправь это» не работает. Напишите: «Давай заменим
==на.equals()для сравнения строк, потому что==сравнивает ссылки, а не содержимое». - Хвалите хороший код. Если видите элегантное решение, отметьте это. «Отличное использование паттерна Builder здесь — код стал намного читаемее».
Пример плохого комментария: «Это говнокод, перепиши». Пример хорошего комментария: «Мне кажется, что этот блок можно вынести в отдельный приватный метод, чтобы улучшить читаемость основного метода. Что думаешь?»
3. Типичные ошибки новичков в Java и как их подсвечивать
Зная типичные ошибки, вы сможете быстрее их находить и давать более релевантные советы. Вот топ-3 ошибки, которые часто встречаются на ревью у начинающих Java-разработчиков:
Ошибка 1: Игнорирование контрактов equals() и hashCode()
Новички часто создают классы с полями, используют их в HashSet или HashMap, но не переопределяют equals() и hashCode(). Это приводит к тому, что объекты с одинаковыми данными считаются разными.
Как дать обратную связь: «Обрати внимание: если мы используем этот объект в HashSet, нам нужно переопределить equals() и hashCode(), иначе коллекция будет работать некорректно. Вот ссылка на документацию по контракту этих методов».
Ошибка 2: Избыточная сложность
Попытка реализовать сложный паттерн там, где достаточно простого if-else или цикла. Или использование Stream API там, где обычный цикл читается проще.
Как дать обратную связь: «Код рабочий, но он получился сложным для восприятия. Давай попробуем упростить: заменим этот вложенный цикл на один проход по коллекции. Читаемость повысится, а производительность не пострадает».
Ошибка 3: Магические числа и строки
Использование чисел в коде без пояснений. Например, if (status == 4).
Как дать обратную связь: «Что означает число 4? Лучше вынести его в константу с понятным именем, например, private static final int STATUS_COMPLETED = 4;. Это сделает код самодокументируемым».
4. Процесс code review: от открытия PR до мержа
Чтобы ревью было эффективным, придерживайтесь простого процесса:
- Проверьте описание PR. Понятно ли, что делает этот код? Есть ли ссылка на задачу?
- Пробегитесь по изменениям. Сначала получите общее представление о том, что изменилось.
- Проверьте ключевые файлы. Начните с тестов, потом с основной логики. Тесты должны показывать, как код должен работать.
-
Блоги
Рекомендаций по книгам
Читайте также