Какими принципами вы руководствуетесь при проведении code review?

«Какими принципами вы руководствуетесь при проведении code review?» — вопрос из категории Архитектура, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Основные принципы и проверяемые аспекты:

1. Принципы проектирования (SOLID):

  • SRP (Single Responsibility): Класс/метод должен иметь одну причину для изменения.
  • OCP (Open/Closed): Код должен быть открыт для расширения, но закрыт для модификации.
  • LSP (Liskov Substitution): Объекты подклассов должны быть заменяемы объектами родительского класса.
  • ISP (Interface Segregation): Много специализированных интерфейсов лучше одного общего.
  • DIP (Dependency Inversion): Зависимости должны строиться на абстракциях, а не на деталях.

2. Практические принципы:

  • KISS (Keep It Simple, Stupid) / YAGNI (You Ain't Gonna Need It): Простота и отсутствие избыточной функциональности.
  • DRY (Don't Repeat Yourself): Отсутствие дублирования логики.

3. Качество кода:

  • Читаемость: Понятные имена переменных/методов, разумная длина методов и классов, отсутствие "магических чисел".
  • Тестируемость: Код должен легко покрываться unit-тестами (минимум side effects, зависимости, внедряемые через интерфейсы).
  • Обработка ошибок: Корректное использование исключений, их логирование.
  • Производительность: Отсутствие очевидных bottlenecks (напр., N+1 запрос в цикле).

Пример рефакторинга:

До (нарушает SRP, DRY, читаемость):

void processOrder(Order order) {
    // Валидация (50 строк)
    if (order.getItems().isEmpty()) { throw ... }
    // ...
    // Логика расчета (30 строк)
    // ...
    // Сохранение в БД и отправка email (20 строк)
    // ...
}

После (разделение ответственностей):

@Service
@RequiredArgsConstructor // Lombok для внедрения зависимостей
public class OrderProcessor {
    private final OrderValidator validator;
    private final OrderCalculator calculator;
    private final OrderRepository repository;
    private final NotificationService notifier;

    public void process(Order order) {
        validator.validate(order);          // Ответственность 1
        calculator.calculateTotals(order);  // Ответственность 2
        repository.save(order);             // Ответственность 3
        notifier.sendConfirmation(order);   // Ответственность 4
    }
}