Для чего это стоит, вот некоторые из моих мыслей и переживаний по этому вопросу.
Лично я предпочитаю второй случай, который вы изложили. Мне легче следовать (и отлаживать) код. То есть по мере продвижения кода он становится «более правильным». По моему собственному опыту, этот метод кажется предпочтительным.
Я не знаю, насколько это распространено в полевых условиях, но я также видел тестирование условий, записанное как ...
error = foo1 ();
if ((error == OK) && test1)) {
error = foo2 ();
}
if ((error == OK) && (test2)) {
error = foo3 ();
}
...
return (error);
Несмотря на читабельность (всегда плюс в моих книгах) и избегая глубокого вложения, мне всегда казалось, что я использую множество ненужных тестов для достижения этих целей.
Первый метод, который я вижу, используется реже, чем второй. Из тех времен, подавляющее большинство времени было потому, что не было никакого хорошего пути обхода этого. В оставшихся нескольких случаях это было оправдано на основе извлечения немного большей производительности в случае успеха. Аргумент состоял в том, что процессор будет прогнозировать прямую ветвь как не принятую (что соответствует предложению else ). Это зависело от нескольких факторов, включая: архитектуру, компилятор, язык, потребности ... Очевидно, что большинство проектов (и большинство аспектов проекта) не соответствовали этим требованиям.
Надеюсь, это поможет.