Как сделать отступ в длинных условных выражениях для операторов if?

Мой вопрос относится к предыдущему вопросу, но предлагаемые решения не решайте проблему, которую я описал ниже. После поиска в Google я не нашел никаких рекомендаций по стилю кода, которые решали бы конкретную проблему длинных условных выражений в таком операторе if.

if( isNull(value1) ||
    isToLong(value1) ||
    hasBadFormat(valule1)){
    doSomething();
}else{
    doSomethingElse();
}

OR:

if( isNull(value1) || isToLong(value1) || hasBadFormat(valule1) ){
    doSomething();
}else{
    doSomethingElse();
}

Проблема, с которой я сталкиваюсь с этими двумя стилями, заключается в том, что мне трудно найти код в истинном блоке и отделить его от условных выражений, или для глаза слишком сложно определить правильную следующую строку после длинного условного включения. одна строка, особенно если оператор 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();
}

Есть ли у кого-нибудь рекомендации по стилю кодирования (возможно, политика стилей кодирования компании), которые решают эту проблему иначе или лучше, чем я предлагал? Какой из них предпочтительнее, и можете ли вы найти какие-либо минусы или плюсы упомянутых мною решений?


person Community    schedule 29.06.2009    source источник


Ответы (8)


Как насчет этого?

bool isValid = isNull(value1) || isToLong(value1) || hasBadFormat(valule1);
if( isValid )
{
   doSomething();
}
else
{
   doSomethingElse();
}

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

person Community    schedule 29.06.2009
comment
Я только что подумал об этом ... Это тоже кажется хорошим вариантом, тем более что вы можете уменьшить длину строки с помощью && или || isValid со следующим тестом в каждой строке. - person Jayson; 29.06.2009
comment
проголосовали за, но это не кажется достаточно длинным. Как вы отформатируете это условие? var show = (selectValue == ABOVE && currentDataValue ›first) || (selectValue == BELOW && currentDataValue ‹сначала) || (selectValue == EQUAL && currentDataValue == first) || (selectValue == BETWEEN && currentDataValue ›first && currentDataValue‹ second) - person PirateApp; 02.08.2018

if( isNull(value1) ||
    isToLong(value1) ||
    hasBadFormat(valule1))
{
    doSomething();
}
else
{
    doSomethingElse();
}

Думаю, теперь вы легко видите истинную блокировку.

Конечно, предпочитаю:

if( isNull(value1)
    || isToLong(value1)
    || hasBadFormat(valule1))
{
    doSomething();
}
else
{
    doSomethingElse();
}

:-)

person Community    schedule 29.06.2009
comment
Что, если в политике кодирования вашей компании указано, что вы должны эмулировать чистые блоки if, чтобы фигурные скобки располагались в той же строке, что и оператор if? Какое из двух моих решений вы бы предпочли, и есть ли с ними какие-то проблемы, которых я не заметил? - person Jayson; 29.06.2009
comment
Я думаю, что мой второй пример будет работать довольно хорошо, когда скобка будет одной и той же линии. - person Per Erik Stendahl; 29.06.2009

Очевидное решение - переместить фигурную скобку на следующую строку, как и задумал Бог!

</flamebait>

person Community    schedule 29.06.2009
comment
Это единственное, что подтолкнуло меня к выбору принципа «открытая скобка сама по себе». - person DaveE; 29.06.2009
comment
На самом деле я наткнулся на этот ответ, потому что он был отмечен как некачественный. Но я просто не могу заставить себя рекомендовать удаление. :) - person helmbert; 04.05.2015

Я предпочитаю эту альтернативу:

if(
    isValid = isNull(value1) ||
    isToLong(value1) ||
    hasBadFormat(valule1)
) {
    doSomething();
}
else {
    doSomethingElse();
}
person Community    schedule 23.07.2015

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

Вот как я бы это написал:

if(isNull(value1) ||    
   isToLong(value1) ||
   hasBadFormat(valule1))
{    
    doSomething();
}
else
{    
    doSomethingElse();
}

Если только это условие не будет достаточно длинным, чтобы заставить меня прокрутить, чтобы увидеть все. Если нет, я бы сделал это:

if(isNull(value1) || isToLong(value1) || hasBadFormat(valule1))
{    
    doSomething();
}
else
{    
    doSomethingElse();
}

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

person Community    schedule 29.06.2009

Я обычно помещаю операторов в начало строки, чтобы они все встали.

Итак, вот одно предложение:

if(isNull(value1)
   || isTooLong(value1)
   || hasBadFormat(valule1))
{
   doSomething();
} /* if */
else
{
   doSomethingElse();
} /* else */

Вот еще один:

if(0
   || isNull(value1)
   || isTooLong(value1)
   || hasBadFormat(valule1))
/* ...etc... */

(Для && это будет if (1 && a && b) и т. Д.)

Или это:

if
(
   isNull(value1)
   || isTooLong(value1)
   || hasBadFormat(valule1)
)
/* ...etc... */
person Community    schedule 29.06.2009

Я лично форматирую все мои if утверждения, независимо от длины:

if (isNull(value1) || isToLong(value1) || hasBadFormat(value1)) {
    doSomething();
} else {
    doSomethingElse();
}
person Community    schedule 26.06.2019

Я, наверное, единственный, кто так поступает. Это называется стилем Хорстманна, но я делаю это немного по-другому.

if (bool)        // comment
{   dothis;        
    andthis;       
} else if (bool) // comment
{   dothis;       
    andthis;        
} else           // comment
{   dothis;        
    andthis;     
}
person Community    schedule 05.12.2014