2015-11-24 2 views
1

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

if(condition1(a)) {  
    doSomethingWith1(a);   
    if(condition2(a)) { 
     doSomethingWith2(a); 
    } else { 
     elseFn(); 
    }  
} else { 
    elseFn(); 
} 

В doSomethingWith... функции изменения значения из a, что делает его сложным, чтобы иметь все условия в одном if.

Так что мне просто интересно, есть ли более четкий способ написать его (на C, если это возможно).

Спасибо, ребята

ответ

0

в вашем случае, выглядит как первый, если if(condition1(a)), абсолютно необходимо для проверки значения a перед вызовом doSomethingWith1(a);, чтобы избежать исключения. так что нет, нет другого способа сделать это.

if(condition1(a)) {  
    doSomethingWith1(a);   
    if(condition2(a)) { 
     doSomethingWith2(a); 
    } else { 
     elseFn(); 
    }  
} else { 
    elseFn(); 
} 
+0

Конечно, есть другой способ сделать это! Существуют альтернативы _always_ с логикой Boolean. Для широкого примера см. [Законы Де Моргана] (https://en.wikipedia.org/wiki/De_Morgan%27s_laws); для конкретных примеров см. другие ответы на этот вопрос. Кроме того, зачем копировать код вопроса в ответ? – jaco0646

-1

Я не знаю, в C, но в Java вы могли бы написать это как:

void function(int a) { 
boolean b1 = condition1(a); 
if (b1) { 
    doSomethingWith1(a); 
    boolean b2 = condition2(a); 
    if (b2) { 
     doSomethingWith2(a); 
    } 
} 

if (b1 || b2) { 
    return; 
} 
elseFn(); 
} 
+0

'doSomethingWith2 (a)' не должен выполняться, если условие 'condition1 (a)' не является истинным. – jaco0646

+0

@ jaco0646 Вы правы, я изменил решение. – Maarten

+0

'elseFn()' должен выполняться, когда 'b1' истинно, а' b2' - false. – jaco0646

0

Вы можете просто держать подсчет «doSomethings» и вызовите elseFn, если все не было казнены.

int count = 0; 
if (condition1(a)) { 
    doSomethingWith1(a); 
    count++; 
    if (condition2(a)) { 
     doSomethingWith2(a); 
     count++; 
     if (condition2(a)) { 
      doSomethingWith2(a); 
      count++; 
     }  
    }  
} 
if (count < 3) { 
    elseFn(); 
} 
0

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

if (condition1(a) && condition2(a)) {  
    doSomethingWith1(a); 
    doSomethingWith2(a); 
} 
else if (condition1(a)) { 
    doSomethingWith1(a); 
    elseFn(); 
} 
else { 
    elseFn(); 
} 
Смежные вопросы