Le parentesi graffe dovrebbero apparire sulla propria linea? [chiuso]


273

Le parentesi graffe dovrebbero essere sulla loro linea o no? Cosa ne pensi?

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

o dovrebbe essere

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

o anche

if (you.hasAnswer())
    you.postAnswer();
else
    you.doSomething();

Per favore, sii costruttivo! Spiega perché, condividi esperienze, esegui il backup con fatti e riferimenti.


105
Trovo che "== true" sia più fonte di distrazione rispetto alla scelta del posizionamento del tutore.
Dan Dyer,

11
@Dan: penso che spiegare sempre l'espressione condizionale sia di grande aiuto nella chiarezza.
Wizard79,

4
L'unico motivo per cui questo sarebbe importante sarebbe se il tuo IDE / editor non supporta il riconoscimento della parentesi graffa corrispondente.
leeand00,

4
@ leeand00: alcuni di noi stampano ancora codice complesso / sconosciuto per studiarlo / annotarlo. Una buona stampante carina mitiga la maggior parte dei problemi.
Shog9

2
triste la domanda è chiusa. Dopo qualche tempo di utilizzo della sintassi basata sul rientro sono passato a (forse strano) un'altra struttura di parentesi graffe. Come il tuo primo, ma parentesi graffa di chiusura nell'ultima riga del blocco. (dopo la riga di codice)
circa

Risposte:


88

Quando ero uno studente mettevo le parentesi graffe sulla stessa riga, in modo che ci fossero meno righe e il codice venisse stampato su meno pagine. Guardare un singolo carattere tra parentesi stampato come l'unica cosa in una riga è fastidioso. (ambiente, spreco di carta)

Ma quando si codificano applicazioni di grandi dimensioni, consentire alcune linee con solo parentesi graffe sono convenienti, considerando la sensazione di "raggruppamento" che dà.

Qualunque stile tu scelga, sii coerente in modo che non diventi un sovraccarico per il tuo cervello elaborare più stili in parti di codice correlate . In diversi scenari (come sopra) direi che va bene usare stili diversi, è più facile 'cambiare contesto' ad alto livello.


6
D'altra parte, il tutore della nuova linea è un ANSI STANDARD, K&R no. Ma il bello degli standard è che ce ne sono così tanti diversi (vedi anche uncyclopedia.wikia.com/wiki/AAAAAAAAA ! Su uncyclopedia).
Quandary

"ci sono meno righe" Ho Terabyte di spazio e molti pixel. Perché dovrei preoccuparmi di usare più linee?
12431234123412341234123

1
@ 12431234123412341234123: Penso che significhi perché alcune persone stampano il codice per la revisione del codice. E ogni newline non assolutamente necessaria è carta sprecata, o un km² di foresta sprecata in scala. Tuttavia, se non lo stampi (certamente non lo faccio), ANSI è molto meglio di K&R. Inoltre, chiunque intenda stampare dovrebbe probabilmente usare un formattatore di codice automatizzato, quindi questa dovrebbe essere una questione di strumenti, non di stile di codifica.
Quandary

247

Non dovresti mai fare il terzo metodo.

Scremare le parentesi graffe potrebbe salvarti alcune sequenze di tasti la prima volta, ma il programmatore successivo che arriva, aggiunge qualcosa alla tua clausola altro senza notare che il blocco manca di parentesi graffe che causeranno molto dolore.

Scrivi il tuo codice per altre persone.


113
Vorrei sapere da dove proviene quel pizzico di saggezza. Perché scrivere il codice per le persone che non si preoccupano di leggerlo è inutile quanto si può ottenere ...
Shog9

69
Il secondo programmatore può aggiungere le proprie parentesi graffe quando aggiunge qualcosa. Non è stupido, e in una convenzione di programmazione che incoraggia a omettere parentesi graffe per cose semplici come questa, saprà guardare.
Ken Bloom,

25
Le parentesi graffe opzionali non sono opzionali. Ci sono alcune decisioni di progettazione peggiori che sono state prese in C e trasferite ai suoi discendenti. Che viva in una lingua recente come C # mi fa rabbia.
Adam Crossland,

28
Non importa quanto tu sia intelligente o quanto sia radicato lo standard di codifica attorno ai riccioli omessi a linea singola: se stai cercando di risolvere un problema o un bug, probabilmente ti mancherà che i riccioli siano stati omessi. E per un totale di 2 secondi di lavoro, è davvero così male essere espliciti?
Giordania,

11
C'è un vantaggio nello stile n. 3 che ti manca tutto: ottieni più codice sullo schermo contemporaneamente.
Loren Pechtel,

203

Per molto tempo ho sostenuto che avevano lo stesso valore, o che erano così vicini alla pari che il possibile guadagno facendo la scelta giusta era molto, molto, al di sotto del costo della discussione .

Essere coerenti è importante , comunque. Quindi ho detto di lanciare una moneta e di iniziare a scrivere il codice.

Ho visto programmatori resistere al cambiamento in questo modo prima. Farsene una ragione! Ho cambiato molte volte nella mia carriera. Uso persino stili diversi nel mio C # rispetto a PowerShell.

Qualche anno fa stavo lavorando su un team (~ 20 sviluppatori) che ha deciso di chiedere input, quindi prendere una decisione e quindi applicarlo su tutta la base di codice. Avremmo 1 settimana per decidere.

Molti gemiti e strabilianti. Un sacco di "Mi piace la mia strada, perché è meglio" ma nessuna sostanza.

Mentre stavamo studiando i punti più fini della domanda, qualcuno ha chiesto come affrontare questo problema in stile controvento:

void MyFunction(
    int parameterOne,
    int parameterTwo) {
    int localOne,
    int localTwo
}

Si noti che non è immediatamente ovvio dove finisce l'elenco dei parametri e inizia il corpo. Paragonare a:

void MyFunction(
    int parameterOne,
    int parameterTwo) 
{
    int localOne,
    int localTwo
}

Abbiamo fatto alcune letture su come le persone in tutto il mondo hanno affrontato questo problema e abbiamo trovato lo schema di aggiungere una riga vuota dopo la parentesi graffa aperta:

void MyFunction(
    int parameterOne,
    int parameterTwo) {

    int localOne,
    int localTwo
}

Se hai intenzione di fare una pausa visiva, puoi anche farlo con un tutore. Quindi anche le interruzioni visive diventano coerenti.

Modifica : due alternative alla soluzione 'extra blank line' quando si usa K&R:

1 / Rientra gli argomenti della funzione in modo diverso dal corpo della funzione

2 / Posiziona il primo argomento sulla stessa riga del nome della funzione e allinea altri argomenti su nuove righe a quel primo argomento

Esempi:

1 /

void MyFunction(
        int parameterOne,
        int parameterTwo) {
    int localOne,
    int localTwo
}

2 /

void MyFunction(int parameterOne,
                int parameterTwo) {
    int localOne,
    int localTwo
}

/Modificare

Continuo a sostenere che la coerenza è più importante di altre considerazioni, ma se non abbiamo un precedente stabilito , allora la parentesi graffa sulla linea successiva è la strada da percorrere.


33
Cordiali saluti, posso sembrare una persona ragionevole, ma in realtà sono un pazzo. Per semplici blocchi a linea singola, non userò né parentesi graffe né newline, rendendo "if (foo) bar ()" tutta una riga. Mi sforzo di rendere il mio codice abbastanza semplice da non costituire un problema.
Jay Bazuzi,

38
Sono venuto qui per pubblicare esattamente questo. Tonnellate di persone che mantengono la parentesi graffa aperta sulla stessa riga lo seguono con una riga vuota (specialmente all'inizio di classi e metodi) perché altrimenti è difficile separare l'intestazione class / method dal body. Bene, se hai intenzione di usare comunque una linea aggiuntiva, puoi anche mettere lì la parentesi graffa e ottenere il beneficio aggiuntivo del rientro più facile da vedere.
Yevgeniy Brikman,

27
Non ho visto la riga vuota - ho più familiarità con il doppio rientro dei parametri per MyFunction () quando si spostano su un'altra riga.
Armand,

34
Rompere i parametri su più linee come questa è esasperante.
Fosco,

10
L'argomento "parametro funzione" è un'aringa rossa. Ovviamente gli argomenti dovrebbero essere doppiamente intesi. Nessun problema a distinguerlo dal seguente codice.
David Ongaro,

99

Le regole cardinali sono:

  1. Seguire lo standard di codifica esistente del progetto.
  2. Se non esiste uno standard di codifica e stai modificando una base di codice esistente di proprietà di qualcun altro, sii coerente con lo stile del codice esistente, non importa quanto ti piaccia / non ti piaccia.
  3. Se stai lavorando a un progetto sul campo verde, discuti con altri membri del team e raggiungi un consenso su uno standard di codifica formale o informale.
  4. Se stai lavorando a un progetto in campo verde come unico sviluppatore, prendi una decisione e quindi sii spietatamente coerente.

Anche se non hai vincoli esterni, è meglio (IMO) cercare uno standard di codifica (ampiamente utilizzato) esistente o una guida di stile, e provare a seguirlo. Se scegli il tuo stile, ci sono buone probabilità che verrai a pentirti tra qualche anno.

Infine, uno stile che è implementato / implementabile usando checker di stili e formattatori di codice esistenti è migliore di uno che deve essere "applicato" manualmente.


10
Questa risposta merita più voti.
AShelly,

1
la coerenza è la chiave
MediaVince

70

Il vantaggio del primo metodo è che è più compatto verticalmente, quindi puoi adattare più codice sullo schermo ed è per questo che lo preferisco. L'unico argomento che ho sentito a favore del secondo metodo è che rende più semplice accoppiare parentesi di apertura e chiusura, ma la maggior parte degli IDE ha una scorciatoia da tastiera per questo, ed è in realtà una dichiarazione falsa, invece di associare una parentesi di apertura a una chiusura parentesi puoi associare una parentesi quadra di chiusura all'espressione "inizio del blocco" (if, else, for, while) sullo stesso livello di rientro, quindi è altrettanto facile determinare dove si trova l'inizio del blocco.

Non vedo alcun motivo per sprecare un'intera linea solo per una parentesi quando il precedente per / while / if indica già visivamente l'inizio di un blocco.

Detto questo, credo che la parentesi di chiusura dovrebbe essere nella sua stessa linea perché abbiamo bisogno di qualcosa per indicare la fine di un blocco e la sua struttura di rientro in modo visibile.


12
No ... sto dicendo perché ridurre la quantità di codice che può adattarsi allo schermo facendo qualcosa che non si aggiunge alla chiarezza del codice?
Epsilon

6
Quando stavo iniziando a
scrivere

57
C'è un enorme corpus di ricerche, che risale alla prima Era del vapore (Weinberg, "Psicologia della programmazione informatica"), che mostra che la comprensione del programmatore cade DRAMATICAMENTE quando la quantità di codice che deve essere vista è più che possibile essere visualizzato contemporaneamente (ovvero una schermata, una pagina della stampante). Questo fenomeno sostiene FORTEMENTE di vedere lo spazio verticale come una risorsa preziosa, da non sprecare gratuitamente, e quindi il primo metodo è preferito.
John R. Strohm,

10
LOL @ "sprecare una linea COMPLETA". OH MIO DIO! Non quello!! = P
Nick Spreitzer,

6
@Julio Al college preferivo fortemente il metodo 1 e non sopportavo di leggere il metodo 2. Dopo aver lavorato in un'azienda che utilizza C #, dove lo standard è il metodo 2, mi è piaciuto anche questo. Ora posso leggere o usare entrambi; nessuno mi disturba. Le persone che hanno una reazione fortemente avversa all'una o all'altra stanno generalmente reagendo in modo eccessivo a qualcosa con cui non hanno familiarità.
KChaloux,

46

preferisco

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

al di sopra di

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

perché la riga you.postAnswer();è molto più facile da leggere e trovare a prima vista. Nel secondo modo, si fonde con la linea sopra di esso ( you.hasAnswer()) facendo sì che i miei occhi debbano concentrarsi maggiormente per leggerlo.


7
Questo è vero fino a quando il programma non supera l'altezza dello schermo. ;)
weberc2

13
@ weberc2 Penso che quando il tuo programma supera l'altezza dello schermo, due righe in meno non cambieranno molto.
Mageek,

13
10 anni fa, sarei stato d'accordo sullo spazio dello schermo. Oggi uso uno schermo 1920 * 1200. Adattava MOLTO codice, più di quanto il mio cervello possa elaborare contemporaneamente. Il primo metodo mi consente di tornare indietro e vedere l'apertura / chiusura del diverso ambito senza doverlo leggere.
LightStriker

3
Non ho mai capito perché ho preferito questo metodo, ma è esattamente per questo.
Declan McKenna,

2
@Mageek Questo è tardivo, ma non è 2 righe, è 2 righe per ogni ambito. Questo è O (N), non O (1). In realtà non mi sento così fortemente al riguardo; è più importante scegliere uno stile che renda leggibili lunghi elenchi di parametri.
weberc2,

38

Preferisco il primo metodo. Le parentesi graffe non valgono assolutamente una linea separata.

Il fatto è che le parentesi graffe non sono importanti. Sono solo spazzatura sintattica , il che è assolutamente inutile per capire a cosa serve il codice, al suo scopo e al modo in cui viene implementato. Sono solo un omaggio ai linguaggi di tipo C vecchio stile in cui il raggruppamento visivo degli operatori era impossibile a causa dello spazio disponibile sullo schermo ridotto.

Ci sono lingue (Python, Haskell, Ruby) che vanno bene senza parentesi graffe. Questo conferma solo che le parentesi graffe sono spazzatura e non dovrebbero meritare una linea per loro quando possibile:

if (you.hasAnswer()){
    you.postAnswer();
}else{
    you.doSomething();
}

7
Non conosco Haskell o Ruby, ma Python è sensibile agli spazi bianchi, motivo per cui non richiede parentesi graffe o altri delimitatori per indicare i blocchi. Le parentesi graffe non sono solo rumore sintattico; servono a uno scopo reale.
Robert Harvey,

14
@Robert, In C devi fare sia gli spazi bianchi che le parentesi graffe. In Python dovresti fare solo spazi bianchi. Che è migliore?
P:

5
@Pavel, in C 'non devi fare spazi bianchi.
Ken Bloom,

7
I programmi @KenBloom C senza spazi bianchi sono impossibili da leggere. Quindi devi comunque farli.
P:

6
Indipendentemente dal fatto che le parentesi graffe siano una buona idea o meno, la semplice esistenza di lingue che non le usano non sembra un argomento a favore o contro di loro. Suggerisce solo che è possibile avere una lingua senza di loro, non che sia un linguaggio buono o scarso.
Jason,

37

Usa Python e elimina completamente l'argomento.


17
+1SyntaxError: not a chance
Seth,

6
Questa semplicemente non è un'opzione per la stragrande maggioranza dei progetti. Inoltre, l'indentazione per raggruppamento ha una parte di problemi.
Bryan Oakley,

@Bryan, mi rendo conto che non è molto pratico. Pensavo solo che fosse un punto di vista che doveva essere là fuori, più forte di un semplice commento. E non mi sono mai imbattuto nei problemi causati dall'indentazione che implica, probabilmente perché non mescolo schede e spazi.
Mark Ransom,

Usa Go e elimina completamente l'argomento (più la digitazione statica, la velocità e un compilatore!) :)
weberc2

4
Quindi premi la barra spaziatrice una volta troppe volte e guarda il compilatore / interprete ridere di te. Ciò non accadrà nella maggior parte delle lingue preparate.
Pharap,

28

La posizione delle parentesi graffe dovrebbe essere

metadati

configurabile nell'IDE dal programmatore. In questo modo, quelle fastidiose parentesi graffe in tutto il codice, indipendentemente dall'autore, sembrano uguali.


7
Completamente d'accordo. È presentazione e non dati.
Petruza,

Il problema è che se lasci che ognuno si metta da solo, le cose diventano disordinate molto rapidamente man mano che si commettono.
Andy,

1
@Andy: questo è esattamente il punto, l'IDE cambierà il loro aspetto, ma solo nell'IDE! La fonte effettiva non verrà toccata. Per il controllo della versione, puoi aggiungere hook che traducono qualsiasi impostazione delle parentesi graffe in una situazione comune, in modo che tutti controllino il codice allo stesso modo.
klaar,

@klaar Ogni IDE moderno che ho usato cambierà le schede negli spazi e sposta le parentesi graffe sulla loro linea o alla fine della linea di "apertura"; Non sono sicuro del motivo per cui pensi che la fonte non sia toccata in questi casi, e questa è la ragione del mio commento. In genere viene modificato dagli IDE in base alle impostazioni degli sviluppatori, il che significa che durante un commit vedrò molti cambiamenti che sono solo rumori quando le parentesi graffe vengono spostate sulla loro stessa linea, nascondendo così il cambiamento EFFETTIVO che qualcuno ha fatto.
Andy,

@Andy: Non c'è la possibilità di usare ganci che convertano quelle discrepanze relative agli spazi bianchi e alle parentesi graffe in un commit uniforme uniforme standard, per aggirare il problema di rumore che hai descritto? Ad ogni modo, un sistema di versioning adeguato dovrebbe trascendere cose meschine come gli spazi bianchi o altre cose senza senso.
klaar,

19

Dipende.

Se sto codificando in Javascript o jQuery, utilizzo il primo modulo:

jQuery(function($) { 
    if ($ instanceOf jQuery) { 
        alert("$ is the jQuery object!"); 
    } 
}); 

Ma se sto codificando in C #, uso il secondo modulo, perché quello è il modo canonico per farlo in C #.

public int CalculateAge(DateTime birthDate, DateTime now) 
{ 
    int age = now.Year - birthDate.Year; 
    if (now.Month < birthDate.Month 
        || (now.Month == birthDate.Month && now.Day < birthDate.Day)) 
        age--; 
    return age; 
} 

Nota che il tuo esempio può essere scritto

if (you.hasAnswer())
    you.postAnswer();
else
    you.doSomething();

in C #.


1
Può essere scritto in molte lingue del genere, perché un'istruzione di blocco è un'istruzione. Aggiunta! :-)
Tamara Wijsman,

2
Secondo le "Linee guida per la progettazione del quadro", la "via canonica" è quella di posizionare la parentesi graffa sulla stessa linea (cioè la prima forma).
Sto

3
@Uwe: forse. Ma Microsoft ha adottato l'approccio delle "parentesi graffe allineate" per tutti i suoi esempi C # MSDN, ed è integrato in Visual Studio, quindi ...
Robert Harvey,

@Uwe: Questo è il libro di Cwalina ed è terribilmente chiamato in quanto è molto più di questo. L'FDG su MSDN non ha nulla da dire al riguardo. Inoltre mi chiedo, perché le Linee guida per la progettazione del framework direbbero qualcosa sulla pratica della codifica C # ?
R. Martinho Fernandes,

3
In effetti, dovresti mettere parentesi graffe sulla stessa linea in Javascript. È possibile causare errori se le parentesi graffe si trovano sulla propria linea. Ad esempio, vedi encosia.com/…
Joseph Hansen,

18

Preferisco il primo perché è più difficile per me vedere l'errore in questo esempio.

if (value > maximum);
{
    dosomething();
}

di quanto non sia in questo esempio

if (value > maximum); {
    dosomething();
}

La ; {sembra proprio più sbagliato per me più di una linea che termina con ;, quindi sono più propensi a notarlo.


11
Sei un buon argomento, ma personalmente, questo mi è mai successo solo una volta nei miei 5 anni di programmazione. Non riuscivo a capire perché non fosse in esecuzione, l'ho pubblicato su SO e qualcuno mi ha rapidamente indicato il punto e virgola. Tuttavia, ogni volta che è condensato per usare quella linea in meno, trovo più difficile da leggere.
JD Isaacks,

6
"; {" Sembra una specie di faccia scontrosa ammiccante o forse una persona con i baffi.
glenatron,

+1 Grande esempio in risposta: errore molto sottile, facilmente trascurato. Pensato anche provocando sul layout mostrando questo.
therobyouknow,

10
Ovviamente qualsiasi IDE decente contrassegnerà la dichiarazione di controllo vuota e qualsiasi compilatore decente emetterà un avviso.
Dunk,

@Dunk L'unico difetto del tuo argomento (con cui sono fortemente d'accordo) è che al giorno d'oggi così tante persone usano linguaggi interpretati (JavaScript, PHP, et al) che molti "programmatori" non conoscono un compilatore da un doppio latte macchiato.
Craig

15

Preferisco una leggera variante di 1)

if (you.hasAnswer()) {
    you.postAnswer();
} // note the break here
else {
    you.doSomething();
}

Perché?

  • Penso che mettere sempre le parentesi graffe sulla propria linea diminuisca la leggibilità. Posso solo inserire una certa quantità di codice sorgente sul mio schermo. Bracket style 2) crea algoritmi pesanti con molti loop nidificati e condizionali dolorosamente lunghi.

  • Tuttavia, voglio elseiniziare su una nuova linea perché ife elseappartengo insieme, visivamente. Se c'è una parentesi davanti a else, è molto più difficile individuare ciò che appartiene a cosa.

  • 3) si squalifica. Sappiamo tutti quali cose brutte possono accadere se si lasciano le parentesi e se ne dimentica.


1
Ho visto questo in giro dove lavoro. È interessante.
Almo

1
Mi piace anche questo stile, poiché mi consente di inserire un commento sopra la elselinea quando necessario e / o di inserire una linea vuota tra il blocco if e il blocco else per rendere le cose meno rigide. Lo stile di staffa n. 2 non fa altro che distanziare le azioni dalle condizioni. Detto questo, il mio preferito è sicuramente lo stile senza parentesi di Python :)
Sayap

4
Se è importante massimizzare il numero di righe di codice sullo schermo, è sufficiente eliminare completamente le nuove righe. Sarai in grado di ottenere molte linee su uno schermo. Preferisco non avere nulla che mi induca a mettere in pausa e pensare durante la lettura, vale a dire. la mia definizione di più leggibile. Con le parentesi graffe la mia mente le ignora. Senza le parentesi graffe la mia mente deve mettere in pausa e allineare i blocchi di controllo. Non una lunga pausa, ma comunque una pausa.
Dunk,

1
Sì, se e altrimenti appartengono insieme, MA altrettanto {e} e come} è su una riga separata, {dovrebbe essere anche su una riga separata. "Posso solo inserire una certa quantità di codice sorgente sul mio schermo" Ed è esattamente per questo che dire il 3) sarebbe "squalificarsi" non è affatto un'opzione. Dopo un decennio di lavoro con 3) non ho mai dimenticato di aggiungere parentesi quando ho aggiunto una nuova riga di codice, né conosco mai nessuno che abbia mai avuto. Se devo adattare il codice alle persone, che non riescono a leggere correttamente, dove finisce? Smettere di usare determinate funzionalità linguistiche, perché alcuni lettori di codici potrebbero non capirle?
Kaiserludi,

10

Ho letto da qualche parte che gli autori di alcuni libri volevano che il loro codice fosse formattato in questo modo:

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

Ma i vincoli di spazio del loro editore significavano che dovevano usare questo:

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

Ora non so se sia vero (dato che non riesco più a trovarlo), ma quest'ultimo stile è molto diffuso nei libri.

A livello personale preferisco le parentesi su una riga separata come:

a) indicano un nuovo ambito
b) è più facile individuare quando si ha una mancata corrispondenza (anche se questo è meno un problema in un IDE che evidenzia errori per te).


... La seconda opzione facilita anche entrambi i punti (con il solo rientro che serve allo scopo della combinazione parentesi graffa / rientro). :)
weberc2,

10

Ah, lo stile One True Brace .

Ha tutto ciò che serve per una via santa - persino un profeta (Richard "la mia strada o l'autostrada" Stallman).

Il ragazzo aveva talmente torto su così tante cose, ma GNU è perfetto quando si tratta di apparecchi.


[Aggiornamento] Ho visto la luce e ora adoro Allman


9
Non vedo il punto dello stile GNU, a parte modellare il codice lisp. Sembra un sacco di lavoro per pochi benefici.
Robert Harvey,

Non conosco nessuno che usi lo stile GNU. 1 TB fino in fondo.
Jé Queue,

Non puoi fare di peggio di due livelli di rientro per blocco, ad eccezione dello stile lisp, ovviamente, è ovvio.
ergosys,

4
+1 per il collegamento sugli stili di parentesi graffe. Mostra che qualunque sia il tuo stile, molte persone fantastiche non sono d'accordo con te.
Florian F,

@RobertHarvey Non c'è lavoro extra, se lo è, non si utilizza lo strumento giusto per scrivere il codice o non configurarlo correttamente. Il vantaggio è un codice molto più leggibile, vedete tutti gli errori nella parentesi molto velocemente e potete facilmente leggere solo il codice mentre ignorate i sottoblocchi.
12431234123412341234123

9

Secondo esempio, sono molto interessato alla leggibilità. Non sopporto di guardare se i blocchi in qualche altro modo = (


1
La ricerca indica che è più facile leggere il codice compatto quando una base di codice supera l'altezza dello schermo.
weberc2,

5
@ weberc2, potresti fornire DOI a quel documento di ricerca?
Grzegorz Adam Kowalski

9

Risposta semplice: cosa è più facile eseguire il debug?

// Case 1:
void dummyFunction() {
  for (i = 0; i != 10; ++i) {
    if (i <= 10)
      std::cout << "i is: " << i << "\n";
      std::cout << 10 - i << " steps remaining\n";

      // Some hard work here
      // which is really hard
      // and does take some screen estate
    }
    else
      std::cout << "We'll never get there";
  }
} // COMPILER ERROR HERE


// Case 2:
void dummyFunction()
{
  for (i = 0; i != 10; ++i)

    if (i <= 10)
    {
      std::cout << "i is: " << i << "\n";
      std::cout << 10 - i << " steps remaining\n";

      // Some hard work here
      // which is really hard
      // and does take some screen estate
    }
    else
      std::cout << "We'll never get there\n";
  }
} // COMPILER ERROR HERE

In quale caso hai diagnosticato prima il problema?

Non mi interessa molto per le preferenze personali (ci sono molti altri stili, inclusi whitesmith e altri) e non mi interessa molto ... purché ciò non ostacoli la mia capacità di leggere il codice e eseguirne il debug .

Per quanto riguarda l'argomento "spreco di spazio", non lo compro: tendo comunque ad aggiungere righe vuote tra gruppi logici per rendere più chiaro il programma ...


1
Sono entrambi facili da eseguire il debug, soprattutto perché è un breve blocco di codice. Il rientro è coerente e consente di visualizzare facilmente i blocchi di codice effettivi.
Htbaa,

@Htbaa: davvero :) Allora perché preoccuparsi?
Matthieu M.,

@MatthieuM. Il primo blocco ha più senso per me, perché le nuove righe (nel secondo blocco) tra la firma della funzione, l'istruzione for e l'istruzione if mi fanno credere che non siano correlate, ma chiaramente non lo sono. Le righe vuote devono separare bit di codice non correlati; codice vicino ad altre righe di codice significa che sono in realtà correlati. Questo è tutto 'imo' ovviamente, ma mi chiedevo quale fosse il tuo punto. MODIFICA: anche qualsiasi IDE corretto noterà la mancanza di parentesi graffe e ti darà una manciata di errori nell'interpretazione del codice.
klaar,

7

Non che nessuno lo noterà, ma questo è il motivo per cui le parentesi graffe appartengono alla stessa linea del condizionale (tranne per i condizionali molto lunghi, ma questo è un caso limite):

In C, questo è un costrutto valido:

while (true);
{
    char c;
    getchar (); // Attendi input
}

Presto! Cosa fa questo codice? Se hai risposto "loop infinito chiedendo input", ti sbagli! Non arriva nemmeno all'input. Viene catturato while(true). Si noti quel punto e virgola alla fine. Questo modello è in realtà più comune di come dovrebbe essere; C richiede di dichiarare le variabili all'inizio di un blocco, motivo per cui ne è stata avviata una nuova.

Una riga di codice è un pensiero. Le parentesi graffe sono una parte del pensiero contenente il condizionale o il ciclo. Pertanto, appartengono alla stessa linea.


Questo è di gran lunga l'argomento migliore per lo stile K&R che ho visto, il resto è ridicolo con i sistemi IDE di oggi con supporto per la piegatura del codice. Questo si applica solo ai linguaggi di stile C che supportano le ;estremità del blocco. Questo è anche il motivo per cui disprezzo questo sistema di blocco che IMHO è obsoleto e la lingua Go lo dimostra. Ho visto questo problema molte volte anche se non in questo scenario. Di solito succede dove intendono aggiungere qualcosa all'affermazione e dimenticarsene.
Jeremy,

5

Mi piace il primo metodo. Sembra più pulito IMO ed è più compatto, che mi piace.

EDIT: Ah, un terzo. Mi piace il migliore quando possibile, poiché è ancora più piccolo / ordinato.


5

Puoi scriverlo:

you.hasAnswer() ? you.postAnswer() : you.doSomething();

Per rispondere alla domanda; Preferivo le parentesi graffe sulla loro stessa linea, ma, per evitare di dover pensare ai bug dell'inserimento automatico del punto e virgola nei browser, ho iniziato a utilizzare lo stile egiziano per javascript. E quando ho codificato java in eclipse non avevo interesse a combattere (o configurare) lo stile di parentesi graffe predefinito, quindi sono andato anche con egiziano in quel caso. Ora sto bene con entrambi.


da usare in questo modo, postAnswer()e doSomething()dovrebbe restituire valore per l'operatore ternario, il che spesso non è il caso: possono benissimo restituire il vuoto (nessun valore). e anche (almeno in c #) il risultato di ?:dovrebbe essere assegnato a qualche variabile
ASh

4

Quasi tutte le risposte qui dicono alcune variazioni su "Qualunque cosa tu faccia, resta con una o due".

Quindi ci ho pensato per un momento e ho dovuto ammettere che non lo vedo così importante. Qualcuno può dirmi onestamente che è difficile seguire quanto segue?

int foo(int a, Bar b) {
    int c = 0;
    while(a != c)
    {
        if(b.value[a] == c) {
            c = CONST_A;
        }
        c++;
    }
    return c;
}

Non sono sicuro di nessun altro ... ma ho assolutamente zero problemi a passare mentalmente avanti e indietro tra gli stili. Mi ci sono voluti alcuni istanti per capire cosa facesse il codice, ma questo è il risultato del fatto che ho semplicemente scritto in modo casuale una sintassi simile a C. :)

Secondo la mia opinione non così modesta, l'apertura delle parentesi graffe è quasi del tutto irrilevante per la leggibilità del codice. Ci sono alcuni casi angolari sopra elencati in cui uno stile o l'altro fa la differenza, ma per la maggior parte, l'uso giudizioso delle righe vuote lo pulisce.

FWIW, i nostri stili di codifica al lavoro usano una forma leggermente più strutturata 1 e una forma modificata 3. (C ++)

            // blank line is required here
if (x) {
            //This blank line is required
   y = z;
}
            // blank line is required here too, unless this line is only another '}'

if (x) y = z; //allowed

if (x)
    y = z;  // forbidden

Sono curioso di sapere se coloro che preferiscono fortemente la forma 2 troverebbero meglio questa versione della forma 1, solo perché la linea vuota dà una separazione visiva più forte.


4
Come mostra il tuo esempio, il rientro è molto importante delle parentesi graffe per il codice leggibile. In effetti, alcune lingue rendono il rientro l' unico modo per annidare le dichiarazioni!

1
Ok, onestamente ti trovo un esempio incoerente difficile da leggere. Non DAVVERO difficile, ma più difficile che se fosse coerente.
Almo

Sono d'accordo con Almo. Non è un caso di "è davvero difficile". È un caso di "è sicuramente più difficile", anche se non difficile. Quindi perché rendere le cose più difficili? Negli esempi di "giocattoli" le persone danno ovviamente poca differenza. Nella mia esperienza, quando eredito il cattivo codice da qualcun altro e hanno usato il metodo 1, abbastanza spesso diventa necessario andare avanti e trasformarlo in metodo 2 solo per poter seguire la logica. A causa del fatto che diventa spesso necessario; risponde automaticamente alla domanda su quale metodo sia migliore e più facile da capire.
Dunk,

@Dunk: non riesco a capire il codice che sarebbe notevolmente migliorato scambiando dettagli così irrilevanti in giro.
jkerian,

@ jkerian-Apparentemente non hai ereditato molto codice da altri che hanno lasciato a lungo il progetto o l'azienda. Non riesco a capire di non incappare in quella situazione da chiunque abbia qualche anno di esperienza. Ma poi di nuovo, la situazione lavorativa di tutti è diversa. Inoltre, se devi fare revisioni del codice "formali", la formattazione fa la differenza. Essere in grado di leggere il codice naturalmente è molto importante. Certo che posso mettere in pausa e pensare di abbinare le parentesi graffe, ma questo rallenta il processo. Un modo non richiede pause, gli altri lo fanno. Ecco perché non vedo perché qualsiasi altra scelta possa essere raccomandata.
Dunk il

4

Sono sorpreso che questo non sia stato ancora sollevato. Preferisco il secondo approccio perché ti consente di selezionare il blocco più facilmente.

Quando le parentesi graffe iniziano e finiscono sulla stessa colonna e sulla loro stessa riga, è possibile selezionare dal margine o con il cursore sulla colonna 0. In genere ciò equivale a un'area più generosa con la selezione del mouse o un minor numero di tasti con la selezione della tastiera.

Inizialmente ho lavorato con parentesi graffe sulla stessa linea del condizionale, ma quando sono passato ho scoperto che ha accelerato la velocità con cui ho lavorato. Naturalmente non è giorno e notte, ma è qualcosa che ti rallenterà leggermente lavorando con le parentesi graffe accanto ai tuoi condizionali.


I vecchi timer come me usano tre sequenze di tasti per selezionare il blocco, indipendentemente da dove si trovino le parentesi graffe.
ergosys,

2

Personalmente mi piace il secondo modo.

Tuttavia, il modo in cui ho intenzione di dimostrare è secondo me migliore perché si traduce in una maggiore sicurezza del lavoro! Un collega studente della mia università mi ha chiesto aiuto per i suoi compiti ed è così che sembrava il suo codice. L'intero programma sembrava un singolo blocco. La cosa interessante è che il 95% dei bug nel programma che ha realizzato proviene da parentesi graffe non corrispondenti. L'altro 5% era evidente una volta abbinati gli apparecchi.

while(1){
i=0;
printf("Enter coded text:\n");
while((s=getchar())!='\n'){
         if(i%1==0){
            start=(char*)realloc(input,(i+1)*sizeof(char));
if(start==NULL){
printf("Memory allocation failed!");
exit(1);}
input=start;}
      input[i++]=s;}
start=(char*)realloc(input,(i+1)*sizeof(char));
if(start==NULL){
printf("Memory allocation failed!!!");
exit(1);}
input=start;
input[i]='\0';
                puts(input);

8
Cattivo, cattivo, intendo un esempio terribile, terribile. Il problema non sono le parentesi graffe! È il pazzo rientro!
R. Martinho Fernandes,

@Martinho Fernandes Ho pensato che mettere parentesi graffe e rientri andassero insieme ...
AndrejaKo

2
non necessariamente ... fai il rientro corretto sopra e poi cambia casualmente gli stili di parentesi graffa, scoprirai che è comprensibile.
jkerian,

In effetti, pensare a questo ha motivato la mia risposta a questa domanda.
jkerian,

"Il 95% dei bug nel programma che ha realizzato proviene da parentesi graffe non corrispondenti" - solo in lingue interpretate, non compilate.
Mawg,

2

La mia preferenza personale è per il primo metodo, probabilmente perché è così che ho imparato PHP per la prima volta.

Per le ifdichiarazioni a riga singola , userò

if (you.hasAnswer()) you.postAnswer();

Se non lo è, you.postAnswer();ma qualcosa di molto più lungo, come you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType);probabilmente tornerò al primo tipo:

if (you.hasAnswer) {
    you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType);
}

Non userò mai un'interruzione di riga e non userò mai questo metodo se c'è anche elseun'istruzione.

if (you.hasAnswer()) you.postAnswer();
else you.doSomething()

è una possibilità teorica, ma non quella che avrei mai usato. Questo dovrebbe essere trasformato in

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

2

Non dovrebbero; primo metodo per me.

Quando guardo il secondo, a causa delle linee inutilizzate (quelle che contengono solo parentesi graffe, oltre all'ultima parentesi graffa di chiusura), sembra che interrompa la continuità del codice. Non riesco a leggerlo così velocemente perché devo prestare particolare attenzione alle righe vuote che di solito significano una separazione nello scopo del codice o qualcosa del genere, ma in nessun caso "questa riga appartiene a una parentesi graffa" (che ripete solo il significato di rientro).

Ad ogni modo, proprio come quando scrivi un testo ... l'aggiunta di un rientro all'inizio di un paragrafo è superflua se c'è una riga vuota prima di essa (doppio segno di modifica del paragrafo), non è necessario sprecare le righe per le parentesi graffe quando siamo rientro corretto.

Inoltre, come già detto, consente di inserire più codice nello schermo, che altrimenti è un po 'controproducente.


2

Dipende dalla piattaforma / lingua / convenzioni

In Java:

void someMethod() { 
     if (you.hasAnswer()) {
         you.postAnswer();
     } else {
       you.doSomething();
     }
}

In C #

void someMethod() 
{ 
     if (you.hasAnswer()) 
     {
         you.postAnswer();
     } 
     else 
     {
       you.doSomething();
     }
}

In C:

void someMethod() 
{ 
     if (you_hasAnswer()) {
         you.postAnswer();
     } else {
       you_doSomething();
     }
}

Odio quando i ragazzi Java usano il loro stile nel codice C # e viceversa.


3
Lo stile C mi ha sempre infastidito. Sii coerente!
Christian Mann,

1

Tutto quello che posso dire è che se sei un fan del metodo n. 3, sarai perseguitato da tutti i programmatori di codice IDE sulla terra.


1

Uso il primo metodo semplicemente perché è più compatto e consente più codice sullo schermo. Io stesso non ho mai avuto problemi con l'associazione delle parentesi graffe (le scrivo sempre insieme ifall'istruzione prima di aggiungere la condizione e la maggior parte degli ambienti consente di passare alla parentesi graffa corrispondente).

Se hai bisogno di accoppiare bretelle visivamente, allora io preferirei il secondo metodo. Tuttavia, ciò consente meno codice contemporaneamente, il che richiede di scorrere di più. E questo, almeno per me, ha un impatto maggiore sulla lettura del codice piuttosto che avere parentesi graffe ben allineate. Odio lo scorrimento. Inoltre, se è necessario scorrere una singola ifistruzione, è molto probabilmente troppo grande e necessita di refactoring.

Ma; la cosa più importante di tutte è la coerenza. Usa l'uno o l'altro, mai entrambi!


0

Quando ho appreso per la prima volta la programmazione a 12 anni, ho messo le parentesi graffe sulla riga successiva perché i tutorial di programmazione Microsoft sono così. Quella volta ho anche frugato con TABS a 4 spazi.

Dopo alcuni anni, ho imparato Java e JavaScript e ho visto più codici parentesi sulla stessa riga, quindi ho cambiato. Ho anche iniziato a rientrare con gli spazi di 2 spazi.


5
+1, -1. Perché NON dovresti rientrare con le schede poiché qualsiasi editor può adattare la lunghezza della scheda alla tua lunghezza arbitraria? Altrimenti, conduci molti di noi a cui piacciono i veri rientri a 8 anni per maledire il tuo codice.
Jé Queue,

0

Esiste una quarta opzione che mantiene allineate le parentesi graffe, ma non spreca spazio:

if (you.hasAnswer())
{    you.postAnswer();
     i.readAnswer();
}
else
{   you.doSomething();
}

L'unico problema è che la maggior parte delle autoformatters di IDE soffocano su questo.


9
... come la maggior parte dei programmatori che soffocerebbero su questo.
Jé Queue,

4
Sembra orrendo. Pensa allo sforzo extra che devi compiere se vuoi inserire una linea nella parte superiore o rimuovere la linea superiore. Non puoi semplicemente cancellare la linea e andare avanti, devi ricordare di reinserire la parentesi graffa.
Bryan Oakley,

lol questo è fantastico! :) meglio del primo stile!
nawfal,

Apparentemente ha anche un nome. Horstman Syyle è menzionato in Wikipedia . Ho lavorato con una base di codice come questa, non è davvero male da usare.
AShelly,

-1

Tutto dipende da te fintanto che non stai lavorando a un progetto in cui alcuni vincoli di codifica o alcuni standard sono stati stabiliti dal project manager che tutti i programmatori che stanno lavorando a quel progetto devono seguire durante la codifica.

Personalmente preferirei il primo metodo.

Inoltre non ho ottenuto quello che vuoi mostrare con il terzo metodo?

Non è un modo sbagliato? Ad esempio, considera una situazione come ...

if (you.hasAnswer())
  you.postAnswer();
else
  you.doSomething();

E se qualcuno volesse aggiungere qualche altra istruzione nel blocco if ?

In tal caso, se si utilizza il terzo metodo, il compilatore genererà l'errore di sintassi.

if (you.hasAnswer())
   you.postAnswer1();
   you.postAnswer2();
else
   you.doSomething();

2
Ancora peggio sarebbe se qualcuno venisse e lo facesse: if (you.hasAnswer ()) you.postAnswer (); altrimenti you.doSomething (); you.doSomethingElse (); - è una ricetta per bug sottili su cui l'occhio può facilmente scivolare e che il compilatore non aiuterà neanche
FinnNk,

@FinnNk: esattamente!
Chankey Pathak,

2
Se qualcuno vuole aggiungere un'altra affermazione, può inserire le parentesi graffe. Qualsiasi programmatore degno del suo sale dovrebbe davvero essere in grado di capirlo.
Robert Harvey,

Volevo dire che il suo terzo metodo è sbagliato.
Chankey Pathak,

3
@Robert Harvey, ho visto i programmatori molto esperti perdere l'aggiunta delle parentesi graffe durante la modifica del codice esistente. Penso che il problema sia che l'indentazione è un indizio molto più forte del significato rispetto alle parentesi graffe (soprattutto perché ci sono più stili di parentesi graffe), quindi è abbastanza facile trascurare la parentesi mancante se l'indentazione assomiglia a quello che ti aspetti.
AShelly,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.