Форматирование нескольких аргументов, переданных функции в Java

Часто количество аргументов, переданных функции, может быть большим. Рассмотрим следующий случай:

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

Есть ли ориентир в Java, который предлагает способ согласования аргументов? Привязка всех аргументов в строке не выглядела бы красивой.

Ответ 1

В соответствии с соглашениями Java по Java, параграф 4.1 "Линии упаковки":

Когда выражение не будет помещаться в одну строку, сломайте его в соответствии с этими общими принципами:

  • Перерыв после запятой.
  • Перерыв перед оператором.
  • Предпочитают переходы более высокого уровня для разрывов нижнего уровня.
  • Выровняйте новую строку с началом выражения на том же уровне в предыдущей строке.
  • Если приведенные выше правила приводят к запутыванию кода или к коду, который скручивается против правого поля, вместо этого вместо него вместо 8 пробелов.

В документе также содержатся некоторые примеры вызовов методов:

function(longExpression1, longExpression2, longExpression3,
         longExpression4, longExpression5);

var = function1(longExpression1,
                function2(longExpression2,
                          longExpression3));

Ответ 2

Когда мне нужно вызвать такой метод, мне нравится помещать аргументы в их собственную строку, например:

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

Очевидно, что это личное предпочтение, но если вы работаете с другими над кодом, попробуйте соответствовать уже сформулированным соглашениям.

Ответ 3

Я положу свое маленькое зерно песка, давным-давно какой-то разработчик по имени Эстебан предложил мне такой вид форматирования, который я первый думал, что это было уродливо через какое-то время для меня не было другого способа сделать это:

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

Я нахожу это очень понятным, очень простым для добавления/удаления новых аргументов, # аргументов ясно, только один аргумент в строке, конец вызова метода действительно ясный, и т.д...

Аналогичный шаблон для определения метода тоже

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);

Ответ 5

Ссылаясь на ваш пример, Eclipse и другие IDE отформатируют его так, как вы выше (1 аргумент на строку, все выровненные слева) и обычно это выглядит довольно хорошо.

Ответ 6

Я полностью согласен с вашим примером наличия одного аргумента в строке, все выстроились под друг друга.

Это позволяет легко просканировать список, чтобы увидеть, что там или что отсутствует.

Это также упрощает документирование нулевых значений как "//идентификатор пользователя" или что-то подобное.

Я нахожу его особенно легким для визуального анализа, а не с несколькими длинными строками плотно упакованных значений, которые могут часто выглядеть одинаково.