【问题标题】:Is there any workaround for functions having large number of arguments?有大量参数的函数有什么解决方法吗?
【发布时间】:2012-09-13 10:23:23
【问题描述】:

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

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 个参数。调用的作用是通过电子邮件发送参数中的详细信息,并附上一条简短的消息和一个简短的主题。

【问题讨论】:

  • 为这些参数创建一个 DataObject 类并将其对象传递给方法。

标签: java function arguments


【解决方案1】:

你真的有两个选择

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

  2. 或者Builder 模式很好。 Josh Bloch 的 Effective Java 中有一个很好的章节。

【讨论】:

  • +1 表示 #2。对于我们这些没有 Josh 的书的人,您可能想用一个小例子来总结这种模式。
  • 刚刚添加了章节链接:)
【解决方案2】:

这听起来像:

  1. 封装问题。将您的论点组合成一个或多个逻辑连贯的对象
  2. 范围问题。 您的方法是否试图做太多事情? 或者您可以在包含对象上配置此实例类型信息。

我的一个朋友曾经对我说。

如果一个函数有 10 个参数,这通常表明 你又忘记了 5 个

【讨论】:

    【解决方案3】:

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

    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 可能具有将该信息写入流的方法。

    【讨论】:

    • 用户位置是一回事。可能是参数根本没有关系!
    • @grassPro 我们一般在一个函数中发送类似的项目。如果这些论点之间没有任何关系,那么这是一个设计问题
    【解决方案4】:

    创建一个值对象并改为传递该值对象。如果是远程调用什么的,记得实现Serializable。

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

    【讨论】:

      【解决方案5】:

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

      new SubmitLogs().mail(sender, receiver, subject, body, ImmutableMap.<SubmitLogMailParams, Object>of(<param1>, <value1>, <param2>, <value2>, ...);
      

      【讨论】:

        【解决方案6】:

        提供该方法的不同实现 - 具有 3 个参数的 mail()、具有 10 个参数的 mail() 等,因此可以使用最匹配的那个。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-02-28
          • 2021-09-02
          • 1970-01-01
          • 2018-10-08
          • 2011-12-17
          • 2013-05-08
          • 1970-01-01
          相关资源
          最近更新 更多