¿Cuál es la diferencia entre los estilos K&R y One True Brace Style (1TBS)?


48

He leído el artículo de Wikipedia sobre los estilos de sangría , pero aún no lo entiendo. ¿Cuál es la diferencia entre K&R y 1TBS?


Leí en alguna parte que el estilo en K&R estaba regido por consideraciones de espacio, es decir, para reducir el espacio vertical que ocupaba el código en el libro.
ChrisF

@ChrisF también reduce el espacio vertical en la pantalla. ¡Cuando tuvimos 80 terminales de línea col x 25 valió la pena!
Martin Beckett

77
"Goto fail" de Apple es un gran ejemplo de un error grave que seguramente se habría evitado usando 1TBS: imperialviolet.org/2014/02/22/applebug.html

44
El error de Apple también podría haberse evitado poniendo la declaración en una sola línea, corrigiendo, usando un verificador de código muerto o usando un lenguaje sensible a la sangría.
Cees Timmerman

1
@CeesTimmerman, .. o tener pruebas ...
thoni56

Respuestas:


76

La mayor diferencia entre K & R y el estilo Brace Verdadero (1TBS) es que en el 1TBS, todos if, else, while, y forlas declaraciones tienen llaves de apertura y cierre, incluso si no son necesarios. El propósito es facilitar la inserción de nuevas declaraciones y saber exactamente cómo se agruparán.

Como ejemplo:

K&R:

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

1TBS:

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

20

K&R es así:

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

Es decir: las llaves se usan solo donde es necesario, abriendo la llave en la misma línea que la instrucción de control, cerrando la llave en su propia línea.

El "estilo de una llave verdadera" (1TBS u OTBS) convierte una sola declaración controlada en una declaración compuesta encerrándola entre llaves:

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

El estilo Allman va un poco más allá de 1TBS, y fuerza el espaciado vertical al colocar la llave de apertura en una línea también por sí misma:

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

Editar:

Todavía estoy tratando de entender exactamente cómo califica como "arrogante" decir "Dennis Ritchie fue un tipo extremadamente inteligente que no solo inventó un buen lenguaje, sino que también ideó un estilo de corsé realmente bueno para él".

Para aquellos que insisten en que es arrogante de todos modos, aquí hay un pequeño desafío: ve a Sourceforge, Github (etc.) y elige proyectos usando el estilo de llaves K&R. Revise sus registros de errores y confirmaciones, e intente encontrar un solo error causado por el estilo de llave que usaron.

Si no quiere hacer tanto trabajo, intente hacer un análisis estadístico simple. Compare proyectos con diferentes estilos de llaves y vea si puede mostrar "bimodalidad", una diferencia estadísticamente significativa en los recuentos de errores (gravedad, etc.) que se correlaciona con el estilo de arriostramiento.

Hice ambas cosas hace unos años, y no pude encontrar un solo error que pudiera atribuir a los estilos de refuerzo, ni pude encontrar nada que se acercara a una correlación estadísticamente significativa entre los dos. En promedio, los que utilizan K & R arriostramiento tenían ligeramente menos errores, pero la diferencia era mucho demasiado pequeña para calificar como estadísticamente significativo.

Desde que se mencionó, comentaré la situación con macros de múltiples declaraciones. Una macro que incluye varias declaraciones pero no las rodea con llaves, tiene un error. Mi trabajo no es escribir código que cubra ese error. Por el contrario, mi trabajo es encontrar y erradicar ese error lo más rápido posible.

Escribir código con la esperanza de que cubra los errores para que permanezcan sin diagnosticar y sin reparar es francamente malo. Llame a eso arrogante si lo desea, pero no lo veo ni siquiera como negociable. Los errores deben ser encontrados y reparados, no cubiertos. Cuanto más tiempo exista, más probable es que se vuelvan mucho más difíciles y costosos de arreglar.


1
Eliminó todos los comentarios, ya que habían descendido a disputas y ruidos. Si tiene un punto válido, publíquelo como respuesta. Si quieres una discusión llevarlo a chatear
ChrisF

8
¿No pone el 1tbs el} y más en una línea? ¡Ahorrar espacio vertical mientras se preserva la maravillosa y hermosa simetría es el punto!
Martin Beckett

44
@Jerry: bueno, cualquier buena guerra santa necesita algunos cismas ;-)
Martin Beckett

66
ir a fallar; ir a fallar;
Jamie Pate

99
Sí, para seguir el comentario de @ JamiePate que es el error SSL de Apple que se analiza aquí . Hay una ifdeclaración con declaraciones con sangría después, que parece que ambas se ejecutan condicionalmente. ¡Pero no hay llaves! La segunda declaración está realmente más allá de ify siempre se ejecutará, por lo tanto, el error.
Colin D Bennett

9

El problema, en general con el estilo de llaves KR está en la refactorización de código. Al mover el código, es fácil pasar por alto que no hay llaves alrededor de algo, moverlo incorrectamente (o mover algo debajo de él pensando que se ejecuta condicionalmente) y luego rascarse la cabeza cuando algo ya no funciona, o ser desafortunado y estar en un área de código no está bien probada y el error pasa desapercibido hasta que un sombrero negro encuentra la manera de explotarlo. Un viaje rápido al depurador encuentra fácilmente el problema si lo nota, pero si no lo hace ...


2
esto parece simplemente repetir el punto hecho y explicado en respuestas anteriores
mosto

1
No creo que las otras respuestas expliquen exactamente cómo surge el problema en el código cotidiano. Explican qué es OTB, pero no por qué es realmente importante. Los comentarios pueden abordar eso, pero no las respuestas.
Justin Swanhart
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.