【问题标题】:How to reuse a method with different arguments without duplicating code如何在不重复代码的情况下重用具有不同参数的方法
【发布时间】:2022-01-09 21:14:21
【问题描述】:

Sonar 抱怨这种方法是重复代码(完全相同的方法在两个不同的 Mapper 类中可用)

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

事件映射器

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

这些方法之间的唯一区别是参数:一个接收 EventTable,另一个接收 Event。 有没有办法可以在不复制代码的情况下重用这个功能?有什么方法可以调用此方法并传递不同的数据类型参数吗?

希望我在这里解释了我的问题。谢谢!

【问题讨论】:

  • 是的,将内容提取到一个私有函数中并让两者都调用它
  • 找一个Event和Eventable共享的通用接口(可能是Event本身)
  • 界面不错,我比较喜欢
  • 如果您可以向我们展示模型 Event 和 EventTable,那将有所帮助

标签: java sonarqube


【解决方案1】:

创建一个实用类/静态方法, (假设 var eventStatus 的类型为 T,请在此处将 T 替换为您的实际类型)

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

现在,EventBasicMapper:

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

和EventMapper:

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

【讨论】:

    猜你喜欢
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多