我面临声纳建议问题,即方法有 8 个参数,大于我的代码中授权的 7 个

  • 本文关键字:授权 参数 大于 代码 方法 问题 java
  • 更新时间 :
  • 英文 :


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

其中声纳建议方法有 8 个参数,大于 7 个授权参数。那么我们如何通过将这个参数放在数组或映射中来解决这个问题呢?

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

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

有人可以帮忙吗?

不要使用数组来传递多个具有不同语义的对象。
它非常非常容易出错。
取而代之的是,提取类中具有高内聚力的参数: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));

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

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

看起来String host, int port, String path, String query实际上只是一个URL,但如果不看到实现,很难说。

最好了解为什么会遇到这个问题。

从声纳中,这被归类为brain overload - 目标是使代码更易于阅读和理解。

较长的参数列表可以指示新结构应 创建以包装众多参数或函数正在执行的操作 事情太多了。

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

最新更新