Quando utilizzare le istruzioni a riga singola se? [chiuso]

1

Durante la revisione del codice, preferisco leggere le istruzioni if che dimostrano esplicitamente che può verificarsi un fork nell'esecuzione del codice:

if ( isFoo(baz) ) {
    runBar();
}

Durante la scansione di centinaia di righe della versione non indentata, non è ovvio che possa verificarsi o meno un condizionale:

boom += 1;
baz = getBaz(boom);
if (isFoo(baz)) runBar();
boing = boom + baz;

Quindi quando è considerato tutto a posto se le affermazioni su riga singola? sono disposto a tollerarlo se il condizionale è su un dado (), ritorno o eccezione, perché in quei casi almeno termina il metodo attuale.

if (isFoo(baz)) die("No more foo!");

Esistono altri usi "buoni" per le istruzioni a riga singola se? Quanto dovrebbe essere rigorosamente evitata la pratica? Si noti che sto chiedendo esplicitamente la mancanza di una linea rientrata per indicare che una condizione può o non può verificarsi, non sto chiedendo l'uso di parentesi graffe. Anche se apprezzerei tutte le opinioni nei commenti, le risposte dovrebbero affrontare il ragionamento oggettivo, come la manutenibilità o estensibilità del codice.

Questo non è un dupe di Singola affermazione se blocco - parentesi graffe o no perché questa domanda non chiede informazioni sulle parentesi graffe. Questo non è un dupe di Single Line Statements & Buone pratiche perché quella domanda non affronta il punto cruciale di questa domanda: la capacità di determinare che alcune linee di codice possono o meno essere eseguite, portando così a percorsi di codice divergenti.

    
posta dotancohen 01.07.2015 - 15:11
fonte

3 risposte

12

L'unica volta che si usa una dichiarazione a riga singola è quando ce ne sono molte e si può formattare il codice per chiarire cosa sta succedendo. Qualsiasi altra cosa non è chiara e porterà ad errori.

ad es.

if (x) do_stuff();

è terribile Quando è combinato con altro codice, non mostra chiaramente l'istruzione condizionale, e alcune persone confondono la seguente riga come un condizionale con un rientro difficile. Questo vale per tutte le affermazioni, specialmente se sono die (), return o throw. Non ha nulla a che fare con l'esecuzione del codice, è tutto sulla leggibilità.

if (a) do_a();
if (b) do_b();
if (c) do_c();

questo è molto meglio che mettere i condizionali sulla riga successiva poiché è più chiaro ciò che è inteso, non c'è spazio per la confusione.

    
risposta data 01.07.2015 - 15:24
fonte
5

Preferisco sempre la versione con parentesi graffe.

  1. Se non utilizzo sempre le parentesi graffe, allora potrei dimenticarti di metterle quando c'è più di una dichiarazione nel blocco.
  2. Gli IDE utilizzati da altri membri del team possono riformattare automaticamente il codice per spostare l'istruzione nella nuova riga, rendendo in tal modo molto più soggetta a errori in futuro.
  3. L'unione del codice tra i rami è più soggetta a errori se l'istruzione if è in conflitto. La probabilità di errore è ancora maggiore se la persona che esegue l'unione non conosce completamente le modifiche unite.
  4. Una dichiarazione che non appartiene al blocco può essere inclusa in seguito per errore (aggiungo nuove istruzioni al blocco, quindi ho bisogno di aggiungere delle parentesi, ma a causa di indentazione o effetti visivi simili includo anche una dichiarazione che dovrebbe essere lasciato fuori dal blocco).
risposta data 01.07.2015 - 17:09
fonte
1

Proporrei una risposta alternativa. Preferisco i single liner quando la condizione interna è in realtà una singola riga ed è relativamente isolata dal resto delle condizioni.

Un grande esempio è:

public void DoSomething(int something) {
     // Notice how easily we can state in one line that we should exit the method if our int is 0.
     if(something == 0) return;

     CallAnotherMethodHere(something);
}

Un cattivo esempio (secondo me) sarebbe quello che @gbjbaanb ha menzionato:

if (a) do_a();
if (b) do_b();
if (c) do_c();

Per me, questa è un'istruzione switch e dovrebbe essere scritta come tale:

switch(something) {
    case "a":
        do_something_to_a();
        break;
    case "b":
        do_something_to_b();
        break;
    case "c":
        do_something_to_c();
        break;
    default:
        break;
}

IMHO molto più leggibile e più efficiente in quanto la variabile deve essere valutata solo una volta che VS esegue tutte le istruzioni if sebbene i guadagni siano trascurabili.

    
risposta data 02.07.2015 - 18:33
fonte

Leggi altre domande sui tag