Я думаю, что второй пример кода гораздо более читабелен и имеет преимущество в том, что в любом случае он довольно оптимален.
Большинство программистов сочтут этот логический поток очевидным и естественным: вы вернете ObjB, если ObjANULL, или если он не NULL и howtoYieldFalg
установлено.
Но Если бы мне пришлось выбирать между тем, чтобы сделать подобный код более читабельным и сделать его оптимальным, я бы сделал его читаемымпервый.Только если я обнаружу, что это является источником узкого места, я бы потрудился оптимизировать его.В этом конкретном случае я могу в значительной степени гарантировать, что использование yield return
приведет к большим накладным расходам, чем неоптимальная оценка ваших условий.
Обновление
Еще раз взгляните на примеры кода: они не являются логически эквивалентными.Что вы ожидаете, когда солнце выйдет и небо голубое?Второй пример кода правильно позволяет солнечным лучам сиять в этом случае, тогда как первый пример - нет.
Тот факт, что в первом случае было так легко ввести ошибку, которую так много людей не смогли обнаружитьтак долго должно быть достаточно доказательств, чтобы показать, что второй подход лучше.Все эти вложенные операторы if/else
могут быть непростыми, даже для опытного программиста.Простую булеву логику гораздо проще поддерживать, особенно если вы используете имена переменных, которые придают ей значение.
Обновление 2
Основываясь на дальнейших объяснениях и немного творчества, я 'Я собираюсь предложить подход, который использует комментарии и имена переменных для повышения ясности:
/* Explanation: We live on a strange planet where the sun's
* rays can shine if the sky is blue while the sun is out,
* or if the sky is not blue and there is no sun. */
bool sunIsPresent = sunObjA != null;
if ((skyIsBlue && sunIsPresent) ||
(!skyIsBlue && !sunIsPresent))
{
yield return sunRaysObjB;
}