Ecco un esempio molto semplificato . Questa non è necessariamente una domanda specifica della lingua e ti chiedo di ignorare i molti altri modi in cui la funzione può essere scritta e le modifiche che possono essere apportate ad essa. . Il colore è di un tipo unico
string CanLeaveWithoutUmbrella()
{
if(sky.Color.Equals(Color.Blue))
{
return "Yes you can";
}
else
{
return "No you can't";
}
}
Un sacco di persone che ho incontrato, ReSharper, e questo ragazzo (il cui commento mi ha ricordato che stavo cercando di chiederlo da un po ') mi consiglia di rifattorizzare il codice per rimuovere il else
blocco lasciando questo:
(Non ricordo cosa hanno detto la maggioranza, altrimenti non avrei potuto chiedere questo)
string CanLeaveWithoutUmbrella()
{
if(sky.Color.Equals(Color.Blue))
{
return "Yes you can";
}
return "No you can't";
}
Domanda: c'è un aumento della complessità introdotto non includendo il else
blocco?
Ho l'impressione che l' else
intenzione sia più diretta, affermando che il codice in entrambi i blocchi è direttamente correlato.
Inoltre, trovo che posso prevenire errori sottili nella logica, specialmente dopo modifiche al codice in un secondo momento.
Prendi questa variazione del mio esempio semplificato (ignorando il fatto che l' or
operatore è un esempio volutamente semplificato):
bool CanLeaveWithoutUmbrella()
{
if(sky.Color != Color.Blue)
{
return false;
}
return true;
}
Qualcuno può ora aggiungere un nuovo if
blocco basato su una condizione dopo il primo esempio senza riconoscere immediatamente correttamente che la prima condizione sta ponendo un vincolo sulla propria condizione.
Se else
fosse presente un blocco, chiunque aggiungesse la nuova condizione sarebbe costretto ad andare a spostare il contenuto del else
blocco (e se in qualche modo passasse sopra di esso l'euristica mostrerà che il codice non è raggiungibile, cosa che non si verifica nel caso in cui uno if
vincoli un altro) .
Naturalmente ci sono altri modi in cui l'esempio specifico dovrebbe essere definito comunque, tutti che impediscono quella situazione, ma è solo un esempio.
La lunghezza dell'esempio che ho dato può distorcere l'aspetto visivo di questo, quindi supponiamo che lo spazio occupato dalle parentesi sia relativamente insignificante rispetto al resto del metodo.
Ho dimenticato di menzionare un caso in cui sono d'accordo con l'omissione di un altro blocco, ed è quando si utilizza un if
blocco per applicare un vincolo che deve essere logicamente soddisfatto per tutto il codice seguente, come un controllo null (o qualsiasi altra protezione) .
else
clausola (per i miei gusti, sarà ancora più leggibile tralasciando le parentesi inutili. Ma penso che l'esempio non sia ben scelto, perché nella caso sopra vorrei scrivere return sky.Color == Color.Blue
(senza if / else). Un esempio con un tipo di ritorno diverso da bool probabilmente renderebbe questo più chiaro.