Para a maior parte, esta é uma preferência pessoal, no entanto, há algumas coisas a considerar.
Possíveis bugs
Embora possa ser argumentado que os erros causados pelo esquecimento das chaves de add-in são raros, pelo que visto que eles fazer acontecer ocasionalmente (sem esquecer o famoso IOS goto falha bug). Então eu acho que isso deve ser um fator ao considerar seu estilo de código (algumas ferramentas alertam sobre indentação enganosa , por isso depende da sua cadeia de ferramentas também) .
Código válido (que diz que pode ser um bug)
Mesmo supondo que seu projeto não sofra tais erros, ao ler o código você pode ver alguns blocos de código que parecem poderiam ser bugs - mas não são, tirando um pouco da sua mentalidade ciclos.
Começamos com:
if (foo)
bar();
Um desenvolvedor adiciona um comentário útil.
if (foo)
// At this point we know foo is valid.
bar();
Mais tarde, um desenvolvedor se expande.
if (foo)
// At this point we know foo is valid.
// This never fails but is too slow even for debug, so keep disabled.
// assert(is_valid(foo));
bar();
Ou adiciona um bloco aninhado:
if (foo)
while (i--) {
bar(i);
baz(i);
}
Ou usa uma macro:
if (foo)
SOME_MACRO();
"... Como as macros podem definir várias linhas de código, a macro usa do {...} while (0)
para várias linhas? Deve porque está no nosso guia de estilo, mas é melhor verificar apenas no caso!"
Os exemplos acima são todos códigos válidos, no entanto, quanto mais conteúdo no bloco de códigos, mais você precisa ler para garantir que não haja erros.
Talvez seu estilo de código defina que blocos de várias linhas exigem uma chave (não importa o que, mesmo que não seja código) , mas eu vi esses tipos de comentários serem adicionados código de produção. Quando você lê, há uma pequena dúvida de que quem quer que tenha editado as linhas por último esqueceu-se de adicionar uma chave, às vezes eu sinto que a necessidade de verificar novamente está funcionando como pretendido (especialmente ao investigar um bug nessa área do código ) .
Diff Noise
Um motivo prático para usar chaves para linhas simples é reduzir o diff noise .
Ou seja, mudando:
if (foo)
bar();
Para:
if (foo) {
bar();
baz();
}
... faz com que a linha condicional apareça em um diff como sendo alterado, isso adiciona um pequeno mas desnecessário overhead.
- as linhas aparecem como alteradas em revisões de código, se suas ferramentas de diferenciação forem baseadas em palavras, você pode ver facilmente que apenas a chave foi alterada, mas isso leva mais tempo para verificar se a linha não foi alterada Dito isto, nem todas as ferramentas suportam o diff baseado em palavras, o diff (svn, git, hg ... etc) mostrará como se toda a linha mudasse, mesmo com ferramentas sofisticadas, às vezes você pode precisar procurar rapidamente sobre um diff baseado em linha simples para ver o que mudou.
As ferramentas de anotação - (como
git blame
) mostrarão a linha como alterada, tornando o rastreamento da origem de uma linha mais uma etapa para encontrar a alteração real .
Estes são pequenos e dependem de quanto tempo você gasta em revisão de código ou rastreamento que confirma linhas de código alteradas.
Uma inconveniência mais tangível de ter linhas extras alteradas em um diff, sua maior probabilidade de alteração no código causará conflitos que precisam ser resolvidos manualmente .
Existe uma exceção a isso, para bases de código que possuem {
em sua própria linha - não é um problema.
O argumento diff noise não é válido se você escrever neste estilo:
if (foo)
{
bar();
baz();
}
No entanto, isso não é uma convenção tão comum, então, principalmente, adicionando à resposta a completude (não sugerindo que os projetos usem esse estilo) .