1TBS для длинных условных выражений - PullRequest
8 голосов
/ 29 марта 2011

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

Пользователи стиля поддержки 1TBS, как вы форматируете длинные условия вif оператор и последующий код?

if ((this_is_the_first_part_of_a_long_condition)
    && (the_second_part_is_shorter__wait_no_it_is_not)
    && (and_one_more_for_the_road)) {
    here_comes_the_block_code();
}

Я чувствую, что должен быть лучший путь.Мой текущий способ - добавить пустую строку перед первой строкой блока кода.В этом случае Аллман выглядит не очень хорошо, хотя, на мой взгляд, более читабельно.

Еще один пример с for петлями:

for (int relevant_counter_variable_name = START_VALUE;
    intelligent_expression_that_may_include_the_counter_variable;
    relevant_counter_variable_update) {
    first_code_line_inside_the_block();
}

Не очень хорошо ...

Здесь поможет KNF (отступ с 8 пробелами), но я бы хотел этого избежать.У меня есть пара других вариантов, но я хотел бы услышать, есть ли какой-то стандартный способ.

Ответы [ 5 ]

9 голосов
/ 09 мая 2011
if (
    (this_is_the_first_part_of_a_long_condition)
    && (the_second_part_is_shorter__wait_no_it_is_not)
    && (and_one_more_for_the_road)
) {
    here_comes_the_block_code();
}
9 голосов
/ 07 сентября 2012

я дважды отступаю строки:

if ((this_is_the_first_part_of_a_long_condition)
        && (the_second_part_is_shorter__wait_no_it_is_not)
        && (and_one_more_for_the_road)) {
    here_comes_the_block_code();
}
2 голосов
/ 05 августа 2015

Я бы просто потратил несколько переменных для абсолютной ясности и читабельности:

cond1 = this_is_the_first_part_of_a_long_condition;
cond2 = the_second_part_is_shorter__wait_no_it_is_not;
cond3 = and_one_more_for_the_road;
if (cond1 && cond2 && cond3) {
    here_comes_the_block_code();
}

Там!1TBS во всей своей красе. Нет стиля смешивания.Нет уродстваIndent (1) может справиться с этим без /* *INDENT-OFF* */ обмана.

Вы могли бы даже дать условию осмысленные имена, такие как

guidance = this_is_the_first_part_of_a_long_condition;
navigation = the_second_part_is_shorter__wait_no_it_is_not;
surgeon = and_one_more_for_the_road;
if (guidance && navigation && surgeon) {
    capcom_we_are_go_for_powered_descent();
} else {
    agc_alarm(1202);
}
1 голос
/ 03 апреля 2011

Mix-n-match


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

В случаях, когда стиль * строго принудительный, (политика кодирования компании)
Я обычно делаю это:

if (  (this_is_the_first_part_of_a_long_condition) &&    
      (the_second_part_is_shorter__wait_no_it_is_not) &&
      (and_one_more_for_the_road)) {
                here_comes_the_block_code();  
}

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

0 голосов
/ 05 августа 2015

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

Для сложных условий круглые скобки в стиле Allman могут хорошо работать.

Общий подход работает для продолжения кода, который не помещается в одну строку, или для списков аргументов функции.

Каждый закрывающий элемент имеет отступ на том же уровне, что и открывающий элемент, поэтому "));" для "Trace.WriteLine (String.Format (" и отдельно стоящее ";" для "возврата".

YMMV.

   if (
    (
     (this_is_the_first_part_of_a_long_condition) && 
     (the_second_part_is_shorter__wait_no_it_is_not) && 
     (and_one_more_for_the_road) 
    ) ||
    (
     (this_is_the_first_part_yet_another) && 
     (
      (the_second_part_yet_another) ||
      (val < 22)
     )
    )
   ) {
      here_comes_the_block_code();

      int bits = 0
       | O_DEF
       | CONFIG_THIS
       | CONFIG_THAT
      ;

      FILE *OUPT = fopen(
       "/tmp/oupt.txt",
       "a+"
      );

      Trace.WriteLine(String.Format(
       "format {0} 0x{1:x8}"
       ,(eGenericDeviceFeatureEnum)val
       ,val & 0x7ffffc00
      ));

      return
       (CurrentWort != null) &&
       (CurrentWort.IsFeatureSupported(
        eGenericDeviceFeatureEnum.SupportsTriBromoCarcinogen
       ))
      ;
   }
...