Ecco un esempio semplificato molto . Questa non è necessariamente una domanda specifica per la 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";
}
}
Molte persone che ho incontrato, ReSharper e questo tizio (il cui commento mi ha ricordato I ' Ho cercato di chiederglielo per un po ') raccomanderei di rifattorizzare il codice per rimuovere il blocco else
lasciando questo:
(Non riesco a ricordare quello che la maggior parte ha detto, potrei non averlo chiesto diversamente)
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 blocco else
?
Ho l'impressione che else
più direttamente dichiari l'intento, affermando il fatto che il codice in entrambi i blocchi è direttamente correlato.
Inoltre, trovo che posso evitare sottili errori nella logica, specialmente dopo le modifiche al codice in un secondo momento.
Prendi questa variante del mio esempio semplificato (ignorando il fatto che l'operatore or
poiché questo è un esempio volutamente semplificato):
bool CanLeaveWithoutUmbrella()
{
if(sky.Color != Color.Blue)
{
return false;
}
return true;
}
Qualcuno può ora aggiungere un nuovo blocco if
basato su una condizione dopo il primo esempio senza riconoscere immediatamente che la prima condizione sta ponendo un vincolo sulla propria condizione.
Se fosse presente un blocco else
, chiunque avesse aggiunto la nuova condizione sarebbe stato costretto a spostare il contenuto del blocco else
(e se in qualche modo lo ignorassero, l'euristica mostrerà che il codice non è raggiungibile, cosa che fa non nel caso di un if
che ne costringe un altro).
Naturalmente ci sono altri modi in cui l'esempio specifico dovrebbe essere comunque definito, il che impedisce a questa situazione, ma è solo un esempio.
La lunghezza dell'esempio che ho dato potrebbe distorcere l'aspetto visivo di questo, quindi supponiamo che lo spazio occupato tra 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 blocco else, ed è quando utilizzo un blocco if
per applicare un vincolo che deve essere logicamente soddisfatto per tutti i seguenti codici, come un null-check (o qualsiasi altro guardiano).