简体   繁体   中英

How to reuse a method with different arguments without duplicating code

Sonar is complaining about this method which is duplicated code (The same exact method is available in two different Mapper classes)

EventBasicMapper:

private Optional<Date> getDoneDate(EventTable event) {
    var eventStatus = event.getEventStatus();

    if(eventStatus.getName().equals(EventState.DONE.getName())) {
        List<EventStatusLog> 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();
    }
}

EventMapper

private Optional<Date> getDoneDate(Event event) {
    var eventStatus = event.getEventStatus();

    if(eventStatus.getName().equals(EventState.DONE.getName())) {
        List<EventStatusLog> 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();
    }
}

The only difference between these methods is the argument: one receives an EventTable and the other receives an Event. Is there a way i can reuse this functionality without duplicating the code? Is there any way i can call this method and pass a different data type paramether?

Hopefully i explained my issue here. Thanks!

Create a util class/ static method, (assuming var eventStatus is of type T, replace T with your actual type here please)

Foo.class

public static Optional<Date> getDoneDate(T eventStatus) {

    if(eventStatus.getName().equals(EventState.DONE.getName())) {
        List<EventStatusLog> 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();
    }
}

now, EventBasicMapper:

private Optional<Date> getDoneDate(EventTable event) {
    return Foo.getDoneDate(event.getEventStatus());    
}

and EventMapper:

private Optional<Date> getDoneDate(Event event) {
        return Foo.getDoneDate(event.getEventStatus());    
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM