Обычно все начинается так:
Код: Выделить всё
@RestController
@RequestMapping("/api/v1")
public class OldControllerV1 {
private final MyService service;
@PostMapping("/process")
public ResultDto process(@RequestBody RequestDto request) {
// ... lots of different validation logic ...
service.execute(request);
}
}
В конечном итоге это выглядит примерно так:
Код: Выделить всё
@RestController
@RequestMapping("/api/v1")
public class OldControllerV1 {
private final MyService service;
@PostMapping("/process")
public ResultDto process(@RequestBody RequestDto request) {
// ... lots of common validation logic ...
service.execute(request, true); // true == old mode
}
}
@RestController
@RequestMapping("/api/v2")
public class NewControllerV2 {
private final MyService service;
@PostMapping("/process")
public ResultDto process(@RequestBody RequestDto request) {
// ... the same validation logic copied from v1, maybe slightly different ...
// The only real difference:
service.execute(request, false); // false == new mode
}
}
Если в проекте есть SonarQube со строгими правилами (Quality Gate), он блокирует сборку из-за дублирования кода — тела методов практически идентичны.
Это на самом деле справедливо — такое дублирование нарушает принципы чистого кода и делает будущие изменения болезненными, поскольку вам придется редактировать несколько мест.
Итак, вопрос:
Как мы можем правильно реорганизовать этот код, чтобы мы:
- Устранили дублирование кода
- Поддержали правильную работу аннотаций Spring
- Сделали решение расширяемым (легко добавить v3, v4, … позже)
Подробнее здесь: https://stackoverflow.com/questions/798 ... e-code-dup
Мобильная версия