В чем преимущество этого своеобразного форматирования? - PullRequest
5 голосов
/ 23 октября 2008

Я видел этот формат, используемый для списков, разделенных запятыми, в некотором коде C ++ (хотя это может относиться к любому языку):

void function(  int a
              , int b
              , int c
             )

Мне было интересно, почему кто-то использовал это в более распространенном формате, таком как:

void function (int a,
               int b,
               int c
              )

Ответы [ 12 ]

17 голосов
/ 23 октября 2008

Это довольно распространенный стиль кодирования при написании операторов SQL:

SELECT field1
     , field2
     , field3
--   , field4
     , field5
FROM tablename

Преимущества:

  • Позволяет легко добавлять, удалять или переупорядочивать поля, не беспокоясь о последней запятой.
  • Позволяет легко закомментировать строку (TSQL использует "-"), не путая остальную часть выражения.

Не думаю, что вы захотите изменить порядок параметров в функции так же часто, как в SQL, поэтому, возможно, это просто чья-то привычка.

Возможность комментировать один из них будет зависеть от конкретного используемого языка. Не уверен насчет C ++. Я знаю, что VB.Net этого не допустит, но это потому, что для разделения операторов по строкам требуется символ продолжения (_).

3 голосов
/ 23 октября 2008

Malice

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

3 голосов
/ 23 октября 2008

В конце проще добавить параметр, дублируя предыдущий параметр (строку).

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

2 голосов
/ 23 октября 2008

Другое преимущество заключается в том, что в первом примере вы можете закомментировать строки B или C, и это останется синтаксически правильным. Во втором примере, если вы попытаетесь закомментировать строку C, у вас будет синтаксическая ошибка.

Не стоит делать это так ужасно, если вы спросите меня.

1 голос
/ 26 октября 2008

Кажется, что большинство ответов сосредоточены вокруг возможности легко комментировать или добавлять новые параметры. Но похоже, что вы получите тот же эффект, поставив запятую в конце строки, а не в начале:

function(
          int a,
          int b,
//          int c,
          int d
        )

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

function (
//             int a
           , int b
           , int c
           , int d
          )

Таким образом, компромисс между возможностью закомментировать первый параметр и возможностью закомментировать последний параметр + возможностью добавлять новые параметры без добавления запятой к предыдущему последнему параметру.

1 голос
/ 24 октября 2008

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

1 голос
/ 23 октября 2008

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

То же самое относится и к удалению последнего параметра.

1 голос
/ 23 октября 2008

Нет причин, я подозреваю, что это просто вопрос личных предпочтений.

Я бы лично предпочел второй.

void function (int a,
               int b,
               int c
              )
1 голос
/ 23 октября 2008

При быстром сканировании файла становится ясно, что каждая строка, начинающаяся с запятой, является продолжением строки над ним (по сравнению со строкой, которая имеет отступ с отступом выше указанной). Это обобщение следующего стиля:

std::cout << "some info "
    << "some more info " << 4
    + 5 << std::endl;

(Обратите внимание, что в этом случае разбивать 4 + 5 глупо, но если у вас сложное математическое утверждение, это может быть необходимо).

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

 std::vector<int> v = ...;
 std::vector<int> w = ...;
 for (std::vector<int>::iterator i = v.begin()
       , std::vector<int>::iterator j = w.begin()
       ; i != v.end() && j != w.end()
       ; ++i, ++j)
           std::cout << *i + *j << std::endl;
1 голос
/ 23 октября 2008

кажется мне личным выбором.

...