Как отложить длинные условные выражения для операторов 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;     
}