Ответ
Основные принципы и проверяемые аспекты:
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
}
}