Myślę, że w Przykładzie 2 jest wiele pułapek, które mogą prowadzić do niezamierzonego kodu. Pierwszy punkt zainteresowania jest tutaj oparty na logice otaczającej zmienną „myString”. Dlatego, mówiąc wprost, wszystkie testy warunków powinny odbywać się w bloku kodu uwzględniającym znaną i domyślną / nieznaną logikę.
Co jeśli później kod został przypadkowo wprowadzony do przykładu 2, który znacząco zmienił wynik:
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;
Myślę, że else
blok bezpośrednio po sprawdzeniu wartości zerowej spowodowałby, że programiści, którzy dodali ulepszenia do przyszłych wersji, dodają całą logikę razem, ponieważ teraz mamy ciąg logiki, który był niezamierzony dla oryginalnej reguły (zwracany, jeśli wartość jest zero).
Wierzę w to mocno niektórym z wytycznych C # na Codeplex (link do tego tutaj: http://csharpguidelines.codeplex.com/ ), które zawierają następujące informacje:
„Dodaj opisowy komentarz, jeśli domyślny blok (inny) ma być pusty. Ponadto, jeśli ten blok nie zostanie osiągnięty, wyrzuć wyjątek InvalidOperationException, aby wykryć przyszłe zmiany, które mogą wystąpić w istniejących przypadkach. Zapewnia to lepszy kod, ponieważ wszystkie ścieżki, które kod może przemierzać, zostały przemyślane. ”
Myślę, że dobrą praktyką programistyczną jest stosowanie takich bloków logicznych, aby zawsze dodawać blok domyślny (jeśli-inaczej, case: default), aby jawnie uwzględniać wszystkie ścieżki kodu i nie pozostawiać kodu otwartego na niezamierzone konsekwencje logiczne.