我遇到声纳建议问题,即Method有8个参数,大于我的代码中授权的7个

时间:2019-07-19 09:24:36

标签: java

我在下面的代码中遇到声纳问题。

声纳表明Method具有8个参数,大于7个授权参数。那么如何通过将这些参数放入数组或映射中来解决这个问题?

private void appendSchemeSpecificPart(StringBuilder sb,
    String opaquePart,
    String authority,
    String userInfo,
    String host,
    int port,
    String path,
    String query
)

我无法制作数组并将其传递给此方法appendSchemeSpecificPart()

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:2)

不要使用数组传递具有不同语义的多个对象。
这非常容易出错。
取而代之的是,在类SchemeSpecificPart中提取具有高内聚力的参数,并将其定义为诸如以下参数:

void appendSchemeSpecificPart(StringBuilder sb, SchemeSpecificPart schemeSpecificPart){..}  

StringBuilder不是SchemeSpecificPart概念的一部分。因此,我们不会在其中定义它。

现在您可以调用方法:

StringBuilder sb = ...;
SchemeSpecificPart part = ...;
appendSchemeSpecificPart(sb, part);  

这不是您的问题,但请注意,通过调用的方法修改参数状态(此处为StringBuilder sb)是不安全的方法。
它给appendSchemeSpecificPart()方法带来了更多的责任。例如,该方法可能会删除sb的现有内容,而该方法本应无法删除),并且由于所有方法都可以覆盖事物,因此也可能使您很难理解接受StringBuilder的每个方法的实际作用由以前完成。

返回字符串似乎更清晰,更可靠:

String computeSchemeSpecificPart(SchemeSpecificPart schemeSpecificPart){...}

并使用它:

SchemeSpecificPart part = ...;
StringBuilder sb = ...;  
sb.append(computeSchemeSpecificPart(part));

答案 1 :(得分:0)

主机和端口的组合称为套接字地址。已经有一个用于保存这对值的类:InetSocketAddress

通过将2个参数组合为1,您将不会超过阈值。您还可以查看是否可以组合其他相关参数。

几乎String host, int port, String path, String query实际上只是一个URL,但是很难看到它的实现。

答案 2 :(得分:0)

最好理解为什么会有这个问题。

声纳将其归类为brain overload -目的是使代码更易于阅读和理解。

  

很长的参数列表可以表明应该使用新结构   创建以包装大量参数或函数正在执行的操作   太多了。

尝试将其中一些字段封装在不同的类中,然后将该类的实例传递给您的方法。