如何在不重复代码的情况下重用具有不同参数的方法

Posted

技术标签:

【中文标题】如何在不重复代码的情况下重用具有不同参数的方法【英文标题】: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,那将有所帮助 【参考方案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());    
    

【讨论】:

以上是关于如何在不重复代码的情况下重用具有不同参数的方法的主要内容,如果未能解决你的问题,请参考以下文章