1TBS для длинных условных выражений
Важное примечание: этот вопрос не о превосходстве бодрящего стиля над другим. В настоящее время я переключаю стили, чтобы оценить для себя, какой из них, на мой взгляд, лучше всего подходит в моей ситуации, и мне нравится Аллман так же, как 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 ответов
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();
}
Я сделал двойной отступ в следующих строках:
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();
}
Я бы просто потратил несколько переменных для абсолютной ясности и читабельности:
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 во всей красе. Нет стиля смешивания. Нет безобразия. Отступ (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);
}
Mix-н-матч
Я согласен, что стили смешивания часто не одобряются.
Но я осмелюсь сказать, что там, где это возможно, правило может быть использовано для удобства чтения.
В случаях, когда стиль строго соблюдается, (политика компании по кодированию)
Я обычно делаю это:
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();
}
Просто используйте одноуровневые отступы для всех условий,
и еще один дополнительный уровень для кода внутри фигурных скобок.
Это настолько легко читаемо, насколько это возможно, не оскорбляя ни одного пуриста.
Отступ для одного уровня для каждого уровня, используйте скобки для каждого условия, независимо от того, нужно оно или нет.
Для сложных условий круглые скобки в стиле 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
))
;
}