Как повторно использовать метод с разными аргументами без дублирования кода

#java #sonarqube

Вопрос:

Сонар жалуется на этот метод, который является дублированным кодом (один и тот же точный метод доступен в двух разных классах картографов).

EventBasicMapper:

 private Optionallt;Dategt; getDoneDate(EventTable event) {  var eventStatus = event.getEventStatus();   if(eventStatus.getName().equals(EventState.DONE.getName())) {  Listlt;EventStatusLoggt; eventStatusLogs = event.getEventStatusLog();  if(eventStatusLogs.isEmpty()) {  return Optional.of(Iterables.getLast(event.getLogs()).getDate());  }  return Optional.of(Iterables.getLast(eventStatusLogs).getModified());  } else {  return Optional.empty();  } }  

Сопоставитель событий

 private Optionallt;Dategt; getDoneDate(Event event) {  var eventStatus = event.getEventStatus();   if(eventStatus.getName().equals(EventState.DONE.getName())) {  Listlt;EventStatusLoggt; eventStatusLogs = event.getEventStatusLog();  if(eventStatusLogs.isEmpty()) {  return Optional.of(Iterables.getLast(event.getLogs()).getDate());  }  return Optional.of(Iterables.getLast(eventStatusLogs).getModified());  } else {  return Optional.empty();  } }  

Единственное различие между этими методами заключается в аргументе: один получает таблицу событий, а другой получает событие. Есть ли способ повторно использовать эту функциональность без дублирования кода? Есть ли способ, которым я могу вызвать этот метод и передать другой параметр типа данных?

Надеюсь, я объяснил свою проблему здесь. Спасибо!

Комментарии:

1. Да, извлеките содержимое в закрытую функцию и попросите обоих вызвать ее

2. найдите общий интерфейс, общий для события и события (возможно, само событие)

3. интерфейс хороший, мне это больше нравится

4. Если вы можете показать нам модели События и таблицы событий, это поможет

Ответ №1:

Создайте класс util/ статический метод (предполагая, что статус событий var относится к типу T, замените здесь, пожалуйста, T вашим фактическим типом)

Foo.class

 public static Optionallt;Dategt; getDoneDate(T eventStatus) {   if(eventStatus.getName().equals(EventState.DONE.getName())) {  Listlt;EventStatusLoggt; eventStatusLogs = event.getEventStatusLog();  if(eventStatusLogs.isEmpty()) {  return Optional.of(Iterables.getLast(event.getLogs()).getDate());  }  return Optional.of(Iterables.getLast(eventStatusLogs).getModified());  } else {  return Optional.empty();  } }  

теперь, EventBasicMapper:

 private Optionallt;Dategt; getDoneDate(EventTable event) {  return Foo.getDoneDate(event.getEventStatus());  }  

и EventMapper:

 private Optionallt;Dategt; getDoneDate(Event event) {  return Foo.getDoneDate(event.getEventStatus());   }