"Proceed if true" vs "stop if false" in if statement [duplicate]

7

Mentre stavo scrivendo un metodo di helper privato in Java, avevo bisogno di aggiungere un controllo per una precondizione che avrebbe fatto sì che il metodo non facesse nulla se non incontrato. Le ultime righe del metodo erano appena al di sotto dell'area di modifica dell'IDE, quindi in un'epica dimostrazione di pigrizia, ho scritto il controllo in questo modo:

function(){
    if (precondition == false){
        return;
    }
    //Do stuff
}

come opposto a trovare la fine del blocco per scrivere una frase più "tradizionale" come questa:

function(){
    if (precondition == true){
        //Do stuff
    }
}

Questo mi ha fatto meravigliare: c'è una ragione per evitare la mia versione a favore dell'altro, o è solo una differenza stilistica? (Supponendo che siano usati in modo tale che significhi essere funzionalmente equivalenti)

    
posta ThisIsNoZaku 21.07.2014 - 23:53
fonte

2 risposte

24

Queste sono chiamate clausole di guardia. In realtà sono desiderabili . Sono una delle numerose tecniche che possono essere utilizzate per scomporre le condizioni complesse di% co_de nidificate in una logica più semplice (e più facile da seguire).

Ad esempio, questo codice:

public Foo merge (Foo a, Foo b) {
    if (a == null) return b;
    if (b == null) return a;
    // complicated merge code goes here.
  }

Sostituisce il più complicato, ma con un singolo punto di uscita:

public Foo merge (Foo a, Foo b) {
    Foo result;
    if (a != null) {
      if (b != null) {
        // complicated merge code goes here.
      } else {
        result = a;
      }
    } else {
      result = b;
    }
    return result;
  }

link

    
risposta data 22.07.2014 - 00:00
fonte
2

Se esegui il test per la precondizione uguale a false o true in Java, significa che la condizione preliminare è un valore booleano, quindi basta usarlo direttamente:

if (precondition) {

if (!precondition) {

Saltare fuori da una funzione in anticipo è un buon modo per mantenere il codice leggibile senza un sacco di nidificazione. Ma se hai una lunga lista di precondizioni, potrebbe essere difficile trovare il codice reale, quindi può essere meglio estrarre il codice reale in un metodo che viene chiamato dopo che il controllo ha avuto esito positivo:

void someFunction() {
    if (!precondition1) return;
    if (!precondition2) return;
    if (!precondition3) return;
    doStuff();
}

void doStuff() {
    //do stuff
}

Per i controlli più piccoli, la versione positiva dovrebbe essere preferita in quanto è più facile da leggere.

    
risposta data 22.07.2014 - 01:03
fonte

Leggi altre domande sui tag