Управление версиями API в Spring Boot, как избежать дублирования кода (дублирование кода SonarQube)?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Управление версиями API в Spring Boot, как избежать дублирования кода (дублирование кода SonarQube)?

Сообщение Anonymous »

У меня есть микросервис на Spring Boot. Очень часто нам необходимо выпустить вторую версию API (v2), которая лишь незначительно отличается от первой (v1). Например, просто изменив флаг, передаваемый в бизнес-логику, при этом основной поток обработки запроса остается практически прежним.
Обычно все начинается так:

Код: Выделить всё

@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);
}
}
Когда люди спешат выпустить релиз, они часто просто копируют и вставляют код и создают аналогичный контроллер для версии 2, передавая дополнительный параметр на уровень сервиса (в нашем случае — простое логическое значение, указывающее, старая ли это версия).
В конечном итоге это выглядит примерно так:

Код: Выделить всё

@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
}
}
На этом этапе CI-конвейер обычно дает сбой (на этапе статического анализа).
Если в проекте есть SonarQube со строгими правилами (Quality Gate), он блокирует сборку из-за дублирования кода — тела методов практически идентичны.
Это на самом деле справедливо — такое дублирование нарушает принципы чистого кода и делает будущие изменения болезненными, поскольку вам придется редактировать несколько мест.
Итак, вопрос:
Как мы можем правильно реорганизовать этот код, чтобы мы:
  • Устранили дублирование кода
  • Поддержали правильную работу аннотаций Spring
  • Сделали решение расширяемым (легко добавить v3, v4, … позже)


Подробнее здесь: https://stackoverflow.com/questions/798 ... e-code-dup
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»