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 个参数。该电话的作用是通过电子邮件发送带有简短消息和简短主题的参数中的详细信息。

4

6 回答 6

10

你真的有两个选择

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

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

于 2012-09-13T10:24:50.493 回答
3

这听起来像:

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

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

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

于 2012-09-13T10:29:33.047 回答
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 可能具有将该信息写入流的方法。

于 2012-09-13T10:27:47.510 回答
0

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

class MailParams {

    String ip;
    String dateTimeUTC;
    String dateTimeIST;
    // .... and so on
}
于 2012-09-13T10:27:11.350 回答
0

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

new SubmitLogs().mail(sender, receiver, subject, body, ImmutableMap.<SubmitLogMailParams, Object>of(<param1>, <value1>, <param2>, <value2>, ...);
于 2012-09-13T10:27:52.357 回答
0

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

于 2012-09-13T10:27:57.427 回答