【问题标题】:Formatting multiple arguments passed to a function in Java格式化传递给Java函数的多个参数
【发布时间】:2011-08-26 18:35:02
【问题描述】:

通常传递给函数的参数数量可能很大。考虑以下情况:

calculate(dataManager.getLastUpdate().getNumberOfChildren(),
          dataManager.getLastUpdate().getNumberOfParents(),
          dataManager.getLastUpdate().getNumberOfGrandChildren(),
          long milliseconds,
          int somethingelse)

Java 中是否有提供对齐参数的方法的指南?将所有参数放在一行中看起来并不漂亮。

【问题讨论】:

  • 我最大的问题不是函数调用,而是定义,因为这样你就有了丑陋的缩进...缩进...突出的情况。

标签: java formatting code-formatting


【解决方案1】:

当我必须调用这样的方法时,我喜欢将参数放在自己的行上,如下所示:

final int result = calculate (
    dataManager.getLastUpdate().getNumberOfChildren(),
    dataManager.getLastUpdate().getNumberOfParents(),
    dataManager.getLastUpdate().getNumberOfGrandChildren(),
    milliseconds,
    somethingelse
);

显然,这是个人喜好,但如果您正在与其他人一起编写代码,请尽量遵守已经提出的约定。

【讨论】:

    【解决方案2】:

    根据Sun's Java coding conventions,第 4.1 段“换行”:

    当一个表达式不适合一行时,根据以下一般原则将其拆分:

    • 逗号后分隔。
    • 在操作员之前休息。
    • 更喜欢较高级别的中断而不是较低级别的中断。
    • 将新行与上一行相同级别的表达式开头对齐。
    • 如果上述规则导致代码混乱或代码被挤压到右边距,只需缩进 8 个空格。

    该文档还包括一些方法调用的示例:

    function(longExpression1, longExpression2, longExpression3,
             longExpression4, longExpression5);
    
    var = function1(longExpression1,
                    function2(longExpression2,
                              longExpression3));
    

    【讨论】:

    • 现在 Oracle 的 Java 编码约定 :)
    【解决方案3】:

    我会把我的小沙粒放在这里,很久以前有个名叫 Esteban 的开发者 建议我这种格式,我第一次认为它很丑 过了一段时间,没有其他方法让我满意:

    final int result = calculate (
         dataManager.getLastUpdate().getNumberOfChildren()
         , dataManager.getLastUpdate().getNumberOfParents()
         , dataManager.getLastUpdate().getNumberOfGrandChildren()
         , long milliseconds
         , int somethingelse
         );
    

    我觉得这很清楚,很容易添加/删除新参数, # of arguments clear,每行只有一个参数,方法调用结束真的很清楚, 等等……

    定义方法的模式也类似

    public int calculate(
        final int numberOfChildren
        , final int numberOfParents
        , final int numberOfGrandChildren
        , final long milliseconds
        , final int somethingelse
        ) throws CalucalteExceptio {
    
         // MyCode
    
        }
    

    最后是嵌套调用的相同模式,StringBuilder 典型序列

       StringBuilder sb = new StringBuilder()
           .append('Children #').append(numberOfChildren).append(NL)
           .append('Parents #').append(numberOfParents).append(NL)
           .append('GrandChildren #').append(numberOfGrandChildren).append(NL)
           ;
    

    我发现的唯一问题是 IDE 格式化程序从不允许这种“逗号开头”的方法,这真的很有趣,而且比我尝试过的任何其他方法都更具可读性。

    希望它能增加一些有趣的东西

    【讨论】:

    • 虽然不传统,但我真的很喜欢。
    【解决方案4】:

    我可能会将 getNumberOf*() 方法的返回值分配给变量:

    SomeObject lastUpdate = dataManager.getLastUpdate();
    int children = lastUpdate.getNumberOfChildren();
    int parents = lastUpdate.getNumberOfParents();
    int grandChildren = lastUpdate.getNumberOfGrandChildren();
    calculate(children, parents, grandChildren, milliseconds, somethingelse);
    

    【讨论】:

    • JVM会优化吗?
    • @Leonid 我不知道,但不会有太大区别。
    【解决方案5】:

    参考您的示例,Eclipse 和其他 IDE 以您上面的方式对其进行格式化(每行 1 个参数,全部左对齐),通常看起来不错。

    【讨论】:

    • 我看到一些开发人员使用非等宽字体,然后一切都消失了。
    【解决方案6】:

    我完全同意您的示例,即每行有一个参数,所有参数都排成一行。

    它可以很容易地向下扫描列表以查看有什么或缺少什么。

    它还可以更轻松地将空值记录为“// 用户 ID”或类似的东西。

    我发现它特别容易在视觉上解析,而不是有几行可能经常看起来相似的密集包装的长行。

    【讨论】:

      猜你喜欢
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      • 2014-09-17
      • 2020-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-01
      相关资源
      最近更新 更多