Java 对于具有大量参数的函数,是否有解决方法?

Java 对于具有大量参数的函数,是否有解决方法?,java,function,arguments,Java,Function,Arguments,有一个函数我每天调用一次: new SubmitLogs().mail(IP, date_time_UTC, date_time_IST , pageVisited , userCountry , userRegion , city , userAgent); 函数参数不断增长。最初是这样的: new SubmitLogs().mail(IP, date_time_UTC, userAgent); 现在又有5个论点。预计一周内它将包含更多的参数。现在我不喜欢这样。维护有这么多参数的函数对我来

有一个函数我每天调用一次:

new SubmitLogs().mail(IP, date_time_UTC, date_time_IST , pageVisited , userCountry , userRegion , city , userAgent);
函数参数不断增长。最初是这样的:

new SubmitLogs().mail(IP, date_time_UTC, userAgent);

现在又有5个论点。预计一周内它将包含更多的参数。现在我不喜欢这样。维护有这么多参数的函数对我来说似乎不是一件好事。这方面有什么办法吗?如果一个函数不断增长,我永远不想给它发送50个参数。呼叫所做的是通过电子邮件发送一条短消息和一个短主题来详细说明论点。

您确实有两个选择

  • 尝试将一些参数组合到一个对象中。这将把类似的东西封装在一起。例如,您可以将userRegion、userCountry和city放在一个Location对象中

  • 或者,模式是好的。Josh Bloch的高效Java在这方面有很好的一章


  • 创建一个值对象并传递该值对象。如果是远程调用或其他什么,请记住实现Serializable

    class MailParams {
    
        String ip;
        String dateTimeUTC;
        String dateTimeIST;
        // .... and so on
    }
    

    听起来您需要更多的对象来表示相关对象组

    new SubmitLogs().mail(IP, date_time_UTC, date_time_IST , pageVisited , userCountry , userRegion , city , userAgent);
    
    看起来有一些东西等着出来

    public class UserLocation { 
        private string userCountry; 
        private string userRegion;
        private string city;
        // ...
    }
    
    现在你把它简化了一点

    new SubmitLogs().mail(IP, data_time_UTC, date_time_IST, pageVisited, userLocation, userAgent);
    
    我不知道您的域,但可能您可以找到其他数据组来将这些数据组合在一起


    一旦把数据放在一起,您可能会发现方法开始自然地转移到这些类中。例如,UserLocation可能有一个方法将该信息写入流。

    我只需要将发送电子邮件所需的强制参数作为此方法的参数,所有可选参数都将通过映射提供,其中,此映射的键将是的枚举,该枚举具有可能的可选参数列表,其类型和值是给定调用的该属性的值

    new SubmitLogs().mail(sender, receiver, subject, body, ImmutableMap.<SubmitLogMailParams, Object>of(<param1>, <value1>, <param2>, <value2>, ...);
    
    newsubmitlogs().mail(发送者、接收者、主题、主体、不可变映射,共(、、…);
    
    提供了方法的不同实现-mail()有3个参数,mail()有10个参数,等等,因此可以使用最匹配的方法。

    这听起来像:

  • 封装问题。将参数组合成一个或多个逻辑一致的对象
  • 范围问题。您的方法是否尝试执行太多操作?或者此实例类型信息是您可以在包含对象上配置的信息
  • 我的一个朋友曾经对我说

    如果一个函数有10个参数,它通常表示 你又忘了5个


    为这些参数创建一个DataObject类,并将其对象传递给#2的方法+1。您可能希望为我们这些没有Josh的书的人提供一个小示例来总结该模式。只是添加了一个到章节的链接:)UserLocation是一回事。这可能是因为争论根本没有关系@grassPro我们通常在函数中发送类似的项。如果这些论点之间没有任何联系,那么这就是设计问题