Qual é a diferença entre os estilos K & R e One True Brace Style (1TBS)?

41

Eu li o artigo da Wikipédia sobre estilos de recuo , mas ainda não entendi. Qual é a diferença entre o K & R e o 1TBS?

    
por GavinR 08.08.2011 / 23:45
fonte

3 respostas

68

A maior diferença entre o K & R e o One True Brace Style (1TBS) é que no 1TBS, todas as instruções if , else , while e for têm chaves de abertura e fechamento, mesmo se eles não são necessários. O objetivo é facilitar a inserção de novas declarações e saber exatamente como elas serão agrupadas.

Como exemplo:

K & R:

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

1TBS:

int i;
for (i = 0; i < 10; i++) {
  printf("Hi");
}
    
por 08.08.2011 / 23:52
fonte
19

K & R é assim:

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

Ou seja: chaves usadas somente quando necessário, abrindo a chave na mesma linha que a instrução de controle, fechando a chave em sua própria linha.

O "one true brace style" (1TBS ou OTBS) transforma uma única instrução controlada em uma instrução composta, colocando-a entre chaves:

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

O estilo Allman vai um pouco além do 1TBS, e força o espaçamento vertical colocando a chave de abertura em uma linha sozinha:

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

Editar:

Eu ainda estou tentando descobrir exatamente como ele se qualifica como "arrogante" para dizer "Dennis Ritchie era um cara extremamente inteligente que não apenas inventou uma boa língua, mas também inventou um realmente bom estilo de cinta para isso. "

Para aqueles que insistem que está sendo arrogante, aqui está um pequeno desafio: vá ao Sourceforge, Github (etc.) e escolha projetos usando o estilo de chave K & R. Percorra seus registros de bugs e commits, e tente encontrar um bug single que foi causado pelo estilo de chave que eles usaram.

Se você não quiser fazer tanto trabalho, tente fazer uma análise estatística simples. Compare projetos usando diferentes estilos de chaves e veja se você pode mostrar "bimodalidade" - uma diferença estatisticamente significativa na contagem de erros (gravidade, etc.) que se correlaciona com o estilo de contraventamento.

Eu fiz os dois há alguns anos, e não consegui encontrar um único bug que eu pudesse atribuir aos estilos de contração, nem consegui encontrar algo que se aproximasse de uma correlação estatisticamente significante entre os dois. Em média, aqueles que usavam órtese K & R tinham um pouco menos defeitos, mas a diferença era muito muito pequena para se qualificar como estatisticamente significativa.

Desde que foi criado, comentarei a situação com macros com instruções múltiplas. Uma macro que inclui várias instruções, mas não as cerca com chaves, tem um bug. Meu trabalho é não para escrever código que cubra esse bug. Muito pelo contrário, meu trabalho é encontrar e erradicar esse bug o mais rápido possível.

Escrever código na esperança de encobrir erros para que eles permaneçam não diagnosticados e não corrigidos é totalmente errado. Chame isso de arrogante, se quiser, mas não vejo isso nem perto de ser negociável. Bugs devem ser encontrados e corrigidos, não cobertos. Quanto mais tempo existir, mais provável será que se tornem muito mais difíceis e dispendiosas de resolver.

    
por 09.08.2011 / 01:02
fonte
8

O problema, em geral, com o estilo de chave KR está na refatoração de código. Ao mover o código em torno dele é fácil errar que não há chaves em torno de algo, mova-o incorretamente (ou mova algo sob ele pensando que ele seja condicionalmente executado) e então coça a sua cabeça quando algo não funciona mais, ou seja infeliz e esteja em uma área de código não bem testada e o bug passa despercebido até que um black hat encontre uma maneira de explorá-lo. Uma rápida visita ao depurador facilmente encontra o problema se você perceber, mas se você não o fizer ...

    
por 05.06.2015 / 20:40
fonte