Domanda

Nel caso di lingue che supportano una singola decisione e azione senza parentesi, come nel seguente esempio:

if (var == true)
    doSomething();

Qual è il modo preferito per scriverlo?Le parentesi dovrebbero essere sempre utilizzate o il loro utilizzo dovrebbe essere lasciato come preferenza del singolo sviluppatore?Inoltre, questa pratica dipende dalla dimensione del blocco di codice, come nell'esempio seguente:

if (var == 1)
    doSomething(1);
else if (var > 1 && var < 10)
    doSomething(2);
else
{
    validate(var);
    doSomething(var);
}
È stato utile?

Soluzione

Non c'è davvero una risposta giusta.Ecco a cosa servono gli standard di codifica all'interno dell'azienda.Se riesci a mantenerlo coerente in tutta l’azienda, sarà facile da leggere.Personalmente mi piace

if ( a == b)    {
    doSomething();
}
else {
    doSomething();
}

ma questa è una guerra santa.

Altri suggerimenti

raccomando

if(a==b)
{
    doSomething();
}

perché trovo molto più semplice farlo in anticipo piuttosto che cercare di ricordarmi di aggiungere le parentesi graffe quando aggiungo una seconda istruzione alla condizione di successo...

if(a==b)
    doSomething();
    doSomethingElse();

è molto diverso da

if(a==b)
{
    doSomething();
    doSomethingElse();
}

Vedere L'articolo di Gioele per ulteriori dettagli

Tendo a usare sempre l'apparecchio.Puoi ottenere alcuni bug sottili in cui hai iniziato con qualcosa del tipo:

if(something)
 DoOneThing();
else
  DoItDifferently();

e quindi decidere di aggiungere un'altra operazione al file else clausola e dimentica di racchiuderla tra parentesi graffe:

if(something)
 DoOneThing();
else
  DoItDifferently();
  AlwaysGetsCalled(); 

AlwaysGetsCalled() verrà sempre chiamato e se sei seduto lì alle 3 del mattino chiedendoti perché il tuo codice si comporta in modo strano, qualcosa del genere potrebbe sfuggirti per un bel po' di tempo.Solo per questo motivo utilizzo sempre l'apparecchio.

La mia preferenza è essere coerente, ad esempio, se usi le parentesi su un blocco, usa le parentesi ovunque anche con una sola istruzione:

if (cond1)
{
   SomeOperation();
   Another();
}
elseif (cond2)
{
   DoSomething();
}
else
{
   DoNothing();
   DoAnother();
}

Ma se hai solo un mucchio di battute:

if (cond1)
    DoFirst();
elseif (cond2)
    DoSecond();
else
    DoElse();

Sembra più pulito (se non ti dispiace i nomi dei metodi fittizi;) in questo modo, ma sono solo io.

Questo vale anche per costrutti di loop e simili:

foreach (var s as Something)
    if (s == someCondition)
        yield return SomeMethod(s);

Dovresti anche considerare che questa è una convenzione che potrebbe essere più adatta a .NET (nota che ai peepz Java piace avere la prima parentesi graffa nella stessa riga dell'if).

Considera questo una mancanza di esperienza, ma durante i miei sette anni come scimmia in codice l'ho fatto Mai in realtà ho visto qualcuno commettere l'errore di non aggiungere parentesi graffe quando si aggiunge codice a un blocco che non ha parentesi graffe.E' proprio così zero volte.

E prima che gli spiritosi arrivino al punto, no, il motivo non era "tutti usano sempre l'apparecchio".

Quindi, una domanda onesta: mi piacerebbe davvero ricevere risposte effettive invece di semplici voti negativi:succede mai veramente?

(Modificare:Ho sentito abbastanza storie dell'orrore sull'outsourcing per chiarire un po':è mai successo davvero? programmatori competenti?)

Non ha molta importanza, purché tu sia coerente con esso.

Sembra esserci una tendenza a richiedere l'identità all'interno di una singola affermazione, ad es.se ci sono parentesi in un ramo, ci sono parentesi ovunque.Gli standard di codifica del kernel Linux, per esempio, lo impongono.

Lo sosterrei fortemente Sempre utilizzare le parentesi graffe, anche quando sono facoltative.Perché?Prendi questo pezzo di codice C++:

if (var == 1)
  doSomething();
doSomethingElse();

Ora arriva qualcuno che non presta abbastanza attenzione e decide che deve succedere qualcosa in più se (var == 1), quindi fa questo:

if (var == 1)
  doSomething();
  doSomethingExtra();
doSomethingElse();

È tutto ancora meravigliosamente rientrato ma non farà ciò che era previsto.

Usando sempre le parentesi graffe, è più probabile che eviti questo tipo di bug.

Personalmente mi schiero con la spiegazione di McConnell da Code Complete.

Usali ogni volta che puoi.Migliorano la leggibilità del tuo codice ed eliminano le poche e rare confusioni che potrebbero verificarsi.

C'è una cosa però più importante...la coerenza.Qualunque sia lo stile che usi, assicurati di farlo sempre nello stesso modo.

Inizia a scrivere cose come:


If A == true
   FunctA();

If B == "Test"
{
   FunctB();
}

Finirai per cercare uno strano bug in cui il compilatore non capirà cosa stavi cercando di fare e sarà difficile da trovare.

Fondamentalmente trova quello che ti senti a tuo agio a scrivere ogni volta e attieniti ad esso.Credo che l'utilizzo il più possibile dei delimitatori di blocco('{', '}') sia la strada da percorrere.

Non voglio iniziare una domanda dentro un'altra, ma c'è qualcosa correlato a questo che voglio menzionare per stimolare i tuoi succhi mentali.Una volta presa la decisione di utilizzare le parentesi.Dove metti la staffa di apertura?Sulla stessa riga dell'affermazione o sotto.Parentesi rientrate oppure no?


If A == false {
  //calls and whatnot
}
//or
If B == "BlaBla"
{
  //calls and whatnot
}
//or
If C == B
  {
  //calls and whatnot
  }

Per favore non rispondere perché sarebbe una nuova domanda.Se vedo un interesse per questo, aprirò una nuova domanda con il tuo contributo.

Ho sempre utilizzato le parentesi in ogni momento, tranne nel caso in cui controllo una variabile per NULL prima di liberarla, come è necessario in C

In tal caso, mi assicuro che sia chiaro che si tratta di una singola istruzione mantenendo tutto su una riga, in questo modo:

if (aString) free(aString);

Non esiste un modo giusto o sbagliato per scrivere l’affermazione di cui sopra.Esistono molte codifiche accettate stili.Tuttavia, per quanto mi riguarda, preferisco mantenere lo stile di codifica coerente per l'intero progetto.cioè.Se il progetto utilizza lo stile K&R, dovresti utilizzare K&R.

Ruby risolve bene un problema nella discussione.Lo standard per una riga è:

do_something if (a == b)

e per una multilinea:

if (a == b)
  do_something
  do_something_else
end

Ciò consente istruzioni concise su una riga, ma costringe a riorganizzare l'istruzione se si passa da una riga singola a una su più righe.

Questo non è (ancora) disponibile in Java, né in molti altri linguaggi, per quanto ne so.

Come altri hanno già detto, fare un'istruzione if su due righe senza parentesi graffe può creare confusione:

if (a == b)
    DoSomething();
    DoSomethingElse(); <-- outside if statement

quindi lo inserisco su una singola riga se posso farlo senza compromettere la leggibilità:

if (a == b) DoSomething();

e in tutte le altre volte uso l'apparecchio.

Gli operatori ternari sono leggermente diversi.La maggior parte delle volte li faccio su una riga:

var c = (a == b) ? DoSomething() : DoSomethingElse();

Ma a volte le dichiarazioni hanno chiamate di funzione nidificata o espressioni Lambda che rendono difficile analizzare una dichiarazione di una linea, quindi preferisco qualcosa del genere:

var c = (a == b)
    ? AReallyReallyLongFunctionName()
    : AnotherReallyReallyLongFunctionOrStatement();

Ancora più conciso di un blocco if/else ma facile da vedere cosa sta succedendo.

Sole Convenzioni del codice per il linguaggio di programmazione Java ha Questo dire:

La classe di dichiarazioni IF-Else dovrebbe avere il seguente modulo:

if (condition) {
    statements;
}

if (condition) {
    statements;
} else {
    statements;
}

if (condition) {
    statements;
} else if (condition) {
    statements;
} else {
    statements;
}

Il nostro capo ci fa mettere { } dopo una dichiarazione decisionale, qualunque cosa accada, anche se si tratta di una singola dichiarazione.È davvero fastidioso aggiungere due righe extra.L'unica eccezione sono gli operatori ternari.

Immagino sia una buona cosa che il mio monitor del codice sia in orientamento verticale a 1200x1600.

preferisco

if (cond)
   {
   //statement
   }

anche con una sola affermazione.Se avevi intenzione di scrivere qualcosa una volta, non avevi dubbi che funzionasse e non avessi mai pianificato che un altro programmatore guardasse quel codice, vai avanti e usa il formato che desideri.Ma quanto ti costa veramente il bracketing extra?Meno tempo nel corso di un anno di quello necessario per scrivere questo post.

Sì, anche a me piace far rientrare le parentesi al livello del blocco.

Python è carino in quanto il rientro definisce il blocco.La questione è controversa in una lingua come quella.

Tendo ad essere d'accordo con Joel Spolsky su questo con quell'articolo (Far sembrare sbagliato il codice sbagliato) con il seguente esempio di codice:

if (i != 0)
bar(i);
foo(i);

Foo ora è incondizionato.Il che è davvero brutto!

Uso sempre le parentesi per le dichiarazioni decisionali.Aiuta la manutenibilità del codice e rende il codice meno soggetto a bug.

Utilizzo le parentesi graffe attorno ad ogni affermazione se e solo se almeno una di esse lo richiede.

In Perl se stai facendo un semplice test, a volte lo scriverai in questa forma:

do_something if condition;

do_something unless condition;

Il che può essere davvero utile per controllare gli argomenti all'inizio di una subroutine.

sub test{
  my($self,@args) = @_;

  return undef unless defined $self;

  # rest of code goes here

}

La regola d'oro è che, quando si lavora su un progetto esistente, seguire tali standard di codifica.

Quando sono a casa, ho due moduli.

La prima è la riga singola:

if (condition) doThis();

e il secondo è per più righe:

if (condition) {
   doThis();
}

Seguivo la frase "usa sempre le parentesi graffe" come un apparatchik.Tuttavia, ho modificato il mio stile per consentire di ometterli nelle espressioni condizionali a riga singola:

if(!ok)return;

Per qualsiasi scenario con più affermazioni, tuttavia, sono ancora dell'opinione che le parentesi graffe dovrebbero essere obbligatorie:

if(!ok){

    do();

    that();

    thing();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top