se e altro o se un ritorno?

0

Ho un metodo Java con un tipo di ritorno vuoto che controlla una condizione. Fa qualcosa in caso di vera e altra cosa in caso di falso, tipico se / else struttura, ma è possibile utilizzare solo il blocco if con un ritorno vuoto alla fine e omettere il blocco else ponendo il suo contenuto con un livello in meno di indentazione . Non conosco le implicazioni dell'uso dell'una o dell'altra forma, è una di esse una cattiva pratica? o usare l'una o l'altra è un'elezione personale?

// The first way
private void test(String str) {
    if (str.equals("xxx")) {
        // Do something
    } else {
        // Do other thing
    }
}

// The second way
private void test(String str) {
    if (str.equals("xxx")) {
        // Do something
        return;
    }
    // Do other thing
}
    
posta Orici 17.07.2018 - 00:05
fonte

2 risposte

4

Dipende dalla semantica del tuo codice, se il ramo else è il punto del metodo, cioè prende il nome da ciò che accade nel ramo else, il ritorno anticipato è probabilmente corretto, specialmente se la prima parte è una sorta di controllare.

Se d'altra parte i due rami sono entrambi correlati alla funzionalità dei metodi, l'if / else ha più senso da usare.

es.

void frob(...)
{
   if(isBlob())
      return; //can't frob a blob
   doFrobbing(...)
}

vs.

void condOp(...)
{
  if(condition)
      conditionalthing();
  else
      otherthing();
}

far sì che il codice corrisponda alla semantica del tuo metodo lo rende più facile da leggere.

    
risposta data 17.07.2018 - 02:46
fonte
0

Se "qualcosa" e "altra cosa" sono semplici, chiari e comprensibili, non importa perché entrambi funzionano.

// The first way is completely readable
private void test(String str) {
    if (str.equals("xxx")) {
        System.out.println("value is xxx");
    } else {
        System.out.println(str);
    }
    return;
}

// The second way is also readable
private void test(String str) {
    if (str.equals("xxx")) {
        System.out.println("value is xxx");
        return;
    }
    System.out.println(str);
    return;
}

Tuttavia, se "qualcosa" o "altra cosa" sono complessi e difficili da capire, non importa perché entrambi falliscono, e la soluzione è quella di rifattorizzarla in qualcosa di abbastanza semplice che il codice sia tornato al primo caso .

// The first way is completely readable
private void test(String str) {
    if (str.equals("xxx")) {
        doSomething(); // obfuscates the complex code you had before
    } else {
        doOtherThing(); // obfuscates the complex code you had before
    }
    return;
}

// The second way is also readable
private void test(String str) {
    if (str.equals("xxx")) {
        doSomething(); // obfuscates the complex code you had before
        return;
    }
    doOtherThing(); / /obfuscates the complex code you had before
    return;
}
/* 
 * Obviously, real code would have better variable and function names,
 * allowing the reader to understand what is happening.
 * If I care about how we doSomething(), I can investigate that function,
 * but I know that test(String) in some cases does something
 * and in other cases does the other thing, which may be enough
 */
    
risposta data 17.07.2018 - 02:23
fonte

Leggi altre domande sui tag