Qual è la differenza tra gli stili K&R e One True Brace Style (1TBS)?


48

Ho letto l' articolo di Wikipedia sugli stili di rientro , ma ancora non capisco. Qual è la differenza tra K&R e 1TBS?


Ho letto da qualche parte che lo stile di K&R era governato da considerazioni di spazio, cioè per ridurre lo spazio verticale che il codice occupava nel libro.
ChrisF

@ChrisF riduce anche lo spazio verticale sullo schermo. Quando ne abbiamo avuti 80 terminali linea col x 25 ne è valsa la pena!
Martin Beckett,

7
Il "goto fail" di Apple è un ottimo esempio di un grave bug che sarebbe sicuramente stato prevenuto usando 1TBS: imperialviolet.org/2014/02/22/applebug.html

4
Il bug di Apple avrebbe potuto anche essere evitato inserendo la dichiarazione su una sola riga, correggendo le bozze, usando un controllo del codice morto o usando un linguaggio sensibile al rientro.
Cees Timmerman,

1
@CeesTimmerman, .. o fare i test ...
thoni56

Risposte:


76

La differenza più grande tra K e R e l'unico vero Brace Style (1 cucchiaio) è che in 1 cucchiaio, tutti if, else, while, e fordichiarazioni hanno parentesi aperte e chiuse, anche se non sono necessarie. Lo scopo è facilitare l'inserimento di nuove dichiarazioni e sapere esattamente come verranno raggruppate.

Come esempio:

K & R:

int i;
for (i = 0; i < 10; i++)
  printf("Hi.");

1 cucchiaio:

int i;
for (i = 0; i < 10; i++) {
  printf("Hi");
}

20

K&R è così:

if (x) 
    a();
else {
    b();
    c();
}

Cioè: parentesi graffe utilizzate solo dove necessario, aprendo parentesi graffa sulla stessa riga dell'istruzione di controllo, chiudendo parentesi graffa sulla propria riga.

Il "one true brace style" (1TBS o OTBS) trasforma una singola istruzione controllata in un'istruzione composta racchiudendola tra parentesi graffe:

if (x) {
    a();
} else {
    b();
    c();
}

Lo stile Allman va un po 'oltre 1TBS e forza la spaziatura verticale posizionando anche la parentesi graffa di apertura su una linea:

if (x) 
{
    a();
}
else 
{
    b();
    c();
}

Modificare:

Sto ancora cercando di capire esattamente come si qualifichi come "arrogante" per dire "Dennis Ritchie era un ragazzo estremamente intelligente che non solo ha inventato un buon linguaggio, ma ha anche inventato un ottimo stile per questo".

Per coloro che insistono sul fatto che sia comunque arrogante, ecco una piccola sfida: vai a Sourceforge, Github (ecc.) E scegli i progetti usando lo stile di parentesi K&R. Esamina i loro record di bug e commit e cerca di trovare un singolo bug causato dallo stile di parentesi utilizzato.

Se non vuoi fare così tanto lavoro, prova a fare una semplice analisi statistica. Confronta i progetti utilizzando diversi stili di parentesi graffa e vedi se riesci a mostrare "bimodalità", una differenza statisticamente significativa nel conteggio dei bug (gravità, ecc.) Correlata allo stile di controventatura.

Ho fatto entrambe queste cose qualche anno fa e non sono riuscito a trovare un singolo bug che potrei attribuire agli stili di rinforzo, né ho potuto trovare qualcosa che si avvicina a una correlazione statisticamente significativa tra i due. In media, quelli che utilizzano R rinforzo K & avevano un po 'meno bug, ma la differenza era molto troppo piccolo per qualificarsi come statisticamente significativo.

Da quando è stato allevato, commenterò la situazione con macro multiistruzione. Una macro che include più istruzioni ma non le circonda con parentesi graffe, ha un bug. Il mio compito non è scrivere codice che copra quel bug. Al contrario, il mio compito è trovare ed eliminare quel bug il più rapidamente possibile.

Scrivere codice nella speranza di nascondere i bug in modo che rimangano non diagnosticati e non risolti è decisamente malvagio. Chiamalo arrogante se vuoi, ma non lo vedo nemmeno vicino a negoziabile. I bug devono essere trovati e corretti, non coperti. Più a lungo esiste, più è probabile che diventino molto più difficili e costosi da risolvere.


1
Cancella tutti i commenti mentre scendevano al battibecco e al rumore. Se hai un punto valido, pubblicalo come risposta. Se vuoi una discussione,
portala

8
1tbs non mette} e altro su una riga? Salvare lo spazio verticale preservando la meravigliosa meravigliosa simmetria è il punto!
Martin Beckett,

4
@Jerry - beh, ogni buona guerra santa ha bisogno di qualche scisma ;-)
Martin Beckett,

6
andare a fallire; andare a fallire;
Jamie Pate,

9
Sì, per dare seguito al commento di @ JamiePate che è il bug Apple SSL che viene analizzato qui . Esiste ifun'istruzione con dichiarazioni rientrate, che sembra quindi che siano entrambe eseguite in modo condizionale. Ma non ci sono parentesi graffe! La seconda affermazione è davvero oltre ife verrà sempre eseguita, quindi il bug.
Colin D Bennett,

9

Il problema, in generale con lo stile di parentesi graffa KR è nel refactoring del codice. Quando si sposta il codice, è facile perdere il fatto che non ci siano parentesi graffe attorno a qualcosa, spostarlo in modo errato (o spostare qualcosa sotto di esso pensando che sia eseguito in modo condizionale) e quindi grattarsi la testa quando qualcosa non funziona più, oppure essere sfortunati ed essere dentro un'area di codice non ben testata e il bug passa inosservato fino a quando un cappello nero non trova il modo di sfruttarlo. Un rapido viaggio nel debugger trova facilmente il problema se lo noti, ma se non lo fai ...


2
questo sembra semplicemente ripetere il punto sollevato e spiegato nelle risposte precedenti
moscerino del

1
Non credo che le altre risposte spieghino esattamente come si presenta il problema nel codice di tutti i giorni. Spiegano che cos'è OTB, ma non perché sia ​​realmente importante. I commenti potrebbero rispondere a questo, ma non alle risposte.
Justin Swanhart,
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.