Как отложить длинные условные выражения для операторов if?
Мой вопрос относится к этому предыдущему вопросу, но предлагаемые решения не устраняют проблему, описанную ниже. После поиска google я не нашел никаких правил стиля кода, которые касаются конкретной проблемы длинных условных выражений в инструкции if, подобной этой.
if( isNull(value1) ||
isToLong(value1) ||
hasBadFormat(valule1)){
doSomething();
}else{
doSomethingElse();
}
ИЛИ
if( isNull(value1) || isToLong(value1) || hasBadFormat(valule1) ){
doSomething();
}else{
doSomethingElse();
}
Проблема с этими двумя стилями заключается в том, что мне трудно найти код в истинном блоке и отделить его от условных выражений, или это слишком сложно для глаз, чтобы определить правильную следующую строку после long conditional на одной строке, особенно если в выражении if уже есть отступы нескольких вкладок внутри функции или других операторов if.
Было бы предпочтительнее сделать что-то вроде этого:
if( isNull(value1) ||
isToLong(value1) ||
hasBadFormat(valule1)){
doSomething();
}else{
doSomethingElse();
}
или будет ли этот стиль лучше отступать каждое новое условие одним из следующих способов:
if( isNull(value1) ||
isToLong(value1) ||
hasBadFormat(valule1)){
doSomething();
}else{
doSomethingElse();
}
if( isNull(value1)
|| isToLong(value1)
|| hasBadFormat(valule1) ){
doSomething();
}else{
doSomethingElse();
}
Есть ли у кого-нибудь стиль руководства по кодированию (может быть, политика стиля кодирования компании), который решает эту проблему другим или лучшим способом, чем я предложил? Какой из них предпочтительнее, и можете ли вы найти какие-либо недостатки или плюсы для решений, о которых я упоминал?
Ответы
Ответ 1
Как насчет чего-то подобного?
bool isValid = isNull(value1) || isToLong(value1) || hasBadFormat(valule1);
if( isValid )
{
doSomething();
}
else
{
doSomethingElse();
}
Условное перемещение перемещается на другую строку, что упрощает ее чтение.
Ответ 2
if( isNull(value1) ||
isToLong(value1) ||
hasBadFormat(valule1))
{
doSomething();
}
else
{
doSomethingElse();
}
Теперь вы видите, что true-block легко я думаю.
Конечно, я предпочитаю:
if( isNull(value1)
|| isToLong(value1)
|| hasBadFormat(valule1))
{
doSomething();
}
else
{
doSomethingElse();
}
: -)
Ответ 3
Очевидное решение - переместить открытую фигуру на следующую строку, точно так же, как Бог намеревался!
</flamebait>
Ответ 4
Это альтернатива, которую я предпочитаю:
if(
isValid = isNull(value1) ||
isToLong(value1) ||
hasBadFormat(valule1)
) {
doSomething();
}
else {
doSomethingElse();
}
Ответ 5
Это действительно зависит от предпочтения и согласия людей, с которыми вы работаете, но первые две являются двумя наиболее распространенными формами, которые я видел. Я предпочитаю переводить условные в многострочные строки только в том случае, если он настолько длинный, что для этого требуется прокрутка влево-вправо.
Вот как я его написал:
if(isNull(value1) ||
isToLong(value1) ||
hasBadFormat(valule1))
{
doSomething();
}
else
{
doSomethingElse();
}
Если это условие не достаточно долго, чтобы заставить меня прокрутить, чтобы увидеть все это. Если нет, я бы сделал следующее:
if(isNull(value1) || isToLong(value1) || hasBadFormat(valule1))
{
doSomething();
}
else
{
doSomethingElse();
}
И в этом случае, поскольку он кажется достаточно коротким, я бы сделал последнее.
Ответ 6
Я стараюсь помещать операторы в начало строки, чтобы все они были.
Итак, здесь одно предложение:
if(isNull(value1)
|| isTooLong(value1)
|| hasBadFormat(valule1))
{
doSomething();
} /* if */
else
{
doSomethingElse();
} /* else */
Здесь другое:
if(0
|| isNull(value1)
|| isTooLong(value1)
|| hasBadFormat(valule1))
/* ...etc... */
(для & <, было бы, если бы (1 && & b) и т.д.)
Или это:
if
(
isNull(value1)
|| isTooLong(value1)
|| hasBadFormat(valule1)
)
/* ...etc... */
Ответ 7
Я лично форматирую все свои операторы if
как это, независимо от длины:
if (isNull(value1) || isToLong(value1) || hasBadFormat(value1)) {
doSomething();
} else {
doSomethingElse();
}
Ответ 8
Я, наверное, единственный, кто делает это так. Это называется Horstmann Style, но я делаю это несколько иначе.
if (bool) // comment
{ dothis;
andthis;
} else if (bool) // comment
{ dothis;
andthis;
} else // comment
{ dothis;
andthis;
}