#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()); }