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

时间:2012-09-13 10:23:23

标签: 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个参数。它预计会在一周内包含更多的参数。现在我不喜欢这样。保留具有如此多参数的函数对我来说似乎不是一件好事。这有什么工作吗?如果函数不断增长,我将永远不想向函数发送50个参数。该电话的作用是通过短信和短主题通过电子邮件发送参数中的详细信息。

6 个答案:

答案 0 :(得分:10)

你真的有两个选择

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

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

答案 1 :(得分:3)

这听起来像是:

  1. 封装问题。将您的参数组合成一个或多个逻辑连贯对象
  2. 范围问题。 您的方法是否尝试做太多?或者是您可以在包含对象上配置的实例类型信息。
  3. 我的一个朋友曾对我说过。

      

    如果你有一个函数的10个参数,它通常是一个标志   你已经忘记了另外5个

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

class MailParams {

    String ip;
    String dateTimeUTC;
    String dateTimeIST;
    // .... and so on
}

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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