Quelle est la différence entre les styles K & R et One True Brace Style (1TBS)?

48

J'ai lu l'article de Wikipedia sur les styles d'indentation , mais je ne comprends toujours pas. Quelle est la différence entre K & R et 1TBS?

GavinR
la source
J'ai lu quelque part que le style dans K & R était régi par des considérations d'espace - c'est-à-dire pour réduire l'espace vertical que le code occupait dans le livre.
ChrisF
@ChrisF, il réduit également l'espace vertical à l'écran. Lorsque nous avions 80 terminaux de ligne de couleur x 25, cela en valait la peine!
Martin Beckett
7
"Goto fail" d'Apple est un excellent exemple d'un sérieux bogue qui aurait certainement pu être évité en utilisant 1TBS: imperialviolet.org/2014/02/22/applebug.html
4
Le bogue d’Apple aurait également pu être évité en mettant l’énoncé sur une seule ligne, en corrigeant les erreurs, en utilisant un vérificateur de code mort ou un langage sensible au retrait.
Cees Timmerman
1
@CeesTimmerman, .. ou avoir des tests ...
thoni56

Réponses:

76

La plus grande différence entre K & R et un vrai style Brace (1TBS) est que dans le 1TBS, tous if, else, whileet fordéclarations ont accolades ouverture et de clôture, même si elles ne sont pas nécessaires. Le but est de faciliter l’insertion de nouvelles instructions et de savoir exactement comment elles seront regroupées.

Par exemple:

K & R:

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

1TBS:

int i;
for (i = 0; i < 10; i++) {
  printf("Hi");
}
Thomas Owens
la source
20

K & R est comme ça:

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

C'est-à-dire: les accolades utilisées uniquement si nécessaire, l'ouverture de l'accolade sur la même ligne que l'instruction de contrôle, la fermeture de l'accolade sur sa propre ligne.

Le "style à une accolade vraie" (1TBS ou OTBS) transforme une seule instruction contrôlée en une instruction composée en la mettant entre accolades:

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

Le style Allman va un peu plus loin que 1TBS et impose un espacement vertical en plaçant l'accolade d'ouverture sur une ligne également:

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

Modifier:

J'essaie toujours de comprendre exactement comment il est qualifié d '"arrogant": "Dennis Ritchie était un type extrêmement intelligent qui a non seulement inventé un bon langage, mais également un style de doublure vraiment bon."

Pour ceux qui insistent pour que ce soit arrogant de toute façon, voici un petit défi: allez à Sourceforge, Github (etc.) et choisissez des projets utilisant le style K & R brace. Parcourez leurs enregistrements de bugs et de commits et essayez de trouver un seul bogue causé par le style d'accolade utilisé.

Si vous ne voulez pas faire autant de travail, essayez de faire une simple analyse statistique. Comparez les projets en utilisant différents styles d'accolade et voyez si vous pouvez afficher la "bimodalité" - une différence statistiquement significative dans le nombre de bogues (gravité, etc.) en corrélation avec le style de contreventement.

Il ya quelques années, j’ai fait les deux, et je n’ai trouvé aucun bug que je pourrais attribuer aux styles de contreventement, et je n’ai rien trouvé qui soit proche d’une corrélation statistiquement significative entre les deux. En moyenne, ceux qui utilisaient des attelles K & R avaient légèrement moins de bogues, mais la différence était beaucoup trop petite pour être considérée comme statistiquement significative.

Puisqu'il a été soulevé, je commenterai la situation avec les macros à plusieurs instructions. Une macro qui inclut plusieurs instructions, mais ne les entoure pas d'accolades, a un bogue. Mon travail n’est pas d’écrire du code qui cache ce bogue. Bien au contraire, mon travail consiste à rechercher et à éliminer ce bogue le plus rapidement possible.

Écrire du code dans l’espoir qu’il recouvre des bugs afin qu’ils ne soient ni diagnostiqués ni corrigés est tout simplement diabolique. Appelez cela arrogant si vous voulez, mais je ne vois pas cela aussi proche de négociable. Les bugs doivent être trouvés et corrigés, pas dissimulés. Plus le système existe longtemps, plus il est probable qu’il deviendra beaucoup plus difficile et coûteux à réparer.

Jerry Coffin
la source
1
Suppression de tous les commentaires, car ils étaient tombés dans des querelles et du bruit. Si vous avez un point valide, postez-le comme réponse. Si vous voulez une discussion prendre à discuter
ChrisF
8
Les 1tbs ne mettent-ils pas le} et le reste sur une seule ligne? Économiser de l'espace vertical tout en préservant la magnifique symétrie est le but!
Martin Beckett
4
@ Jerry - et bien toute bonne guerre sainte nécessite quelques schismes ;-)
Martin Beckett
6
allez échouer; allez échouer;
Jamie Pate
9
Oui, pour faire suite au commentaire de @ JamiePate, à savoir le bogue Apple SSL qui est analysé ici . Il y a une ifdéclaration avec des déclarations indentées après, indiquant ainsi qu'elles sont toutes deux exécutées sous condition. Mais il n'y a pas d'accolades! La deuxième déclaration est vraiment au-delà de la ifet sera toujours exécutée, donc le bogue.
Colin D Bennett
9

Le problème, en général avec le style d'accolade KR, est le refactoring de code. Lorsque vous déplacez du code, il est facile de rater le fait qu'il n'y a pas d'accolade autour de quelque chose, déplacez-le incorrectement (ou déplacez-le dessous en pensant qu'il est exécuté sous condition), puis grattez votre tête lorsque quelque chose ne fonctionne plus, ou soyez malheureux et soyez dans une zone de code mal testée et le bogue passe inaperçu jusqu’à ce qu’un chapeau noir trouve le moyen de l’exploiter. Un petit tour dans le débogueur trouve facilement le problème si vous le remarquez, mais si vous ne le faites pas ...

Justin Swanhart
la source
2
cela semble simplement répéter le point soulevé et expliqué dans les réponses précédentes
GBNat le
1
Je ne pense pas que les autres réponses expliquent exactement comment le problème se pose dans le code de tous les jours. Ils expliquent ce qu'est OTB, mais pas pourquoi c'est vraiment important. Les commentaires peuvent répondre à cela, mais pas les réponses.
Justin Swanhart