Я думаю, что в Примере 2 есть много подводных камней, которые в будущем могут привести к непреднамеренному коду. Во-первых, в основе этого лежит логика, окружающая переменную myString. Поэтому , чтобы быть явным, все испытания условий должно происходить в блоке учета кода для известны и по умолчанию / неизвестной логики.
Что делать, если позже в примере 2 непреднамеренно был введен код, который значительно изменил результат:
if (myString == null)
{
return false;
}
//add some v1 update code here...
myString = "And the winner is: ";
//add some v2 update code here...
//buried in v2 updates the following line was added
myString = null;
//add some v3 update code here...
//Well technically this should not be hit because myString = null
//but we already passed that logic
myString = "Name " + myString;
// Do something more here...
return true;
Я думаю, что с else
блоком, следующим сразу за проверкой на ноль, программисты, которые добавили усовершенствования в будущие версии, добавили бы всю логику вместе, потому что теперь у нас есть строка логики, которая была непреднамеренной для исходного правила (возвращая, если значение равно значение NULL).
Я глубоко верю в это некоторым руководствам C # по Codeplex (ссылка на них здесь: http://csharpguidelines.codeplex.com/ ), в которых говорится следующее:
«Добавьте описательный комментарий, если блок по умолчанию (иное) должен быть пустым. Более того, если этот блок не должен быть достигнут, выведите исключение InvalidOperationException для обнаружения будущих изменений, которые могут попасть в существующие случаи. Это гарантирует лучший код, потому что все пути, по которым может пройти код, были продуманы ".
Я думаю, что это хорошая практика программирования, когда при использовании таких логических блоков всегда добавляется блок по умолчанию (if-else, case: default), чтобы явно учитывать все пути кода и не оставлять код открытым для непреднамеренных логических последствий.