Prefiro a versão sem aparelho, sempre que possível.
A explicação a seguir é longa. Por favor, tenha paciência comigo. Vou dar uma razão convincente para eu preferir esse estilo. Também explicarei por que acho que o contra-argumento usual não se sustenta.
Linhas (quase) vazias são um desperdício
A razão para isso é que a chave de fechamento requer uma linha extra de código - e a chave de abertura, dependendo do estilo. 1 1
Este é um grande negócio? Superficialmente, não. Afinal, a maioria das pessoas também coloca linhas vazias em seu código para separar blocos logicamente ligeiramente independentes, o que melhora bastante a legibilidade.
No entanto, detesto desperdiçar espaço vertical. Na verdade, os monitores modernos têm amplo espaço horizontal. Mas o espaço vertical ainda é muito, muito limitado (a menos que você use um monitor na posição vertical, o que não é incomum). Esse espaço vertical limitado é um problema: é amplamente reconhecido que os métodos individuais devem ser tão curtos quanto possível e que as chaves correspondentes (ou outros delimitadores de bloco) não devem ter mais que uma altura de tela na diferença, para que você possa ver o bloco inteiro sem rolagem.
Esse é um problema fundamental : depois que você não consegue mais ver o bloco inteiro na tela, fica difícil entender.
Como conseqüência, detesto linhas vazias redundantes. Onde linhas vazias únicas são cruciais para delimitar blocos independentes (basta olhar para a aparência visual deste texto), linhas vazias consecutivas são um estilo muito ruim no meu livro (e, na minha experiência, elas geralmente são um sinal de programadores iniciantes).
Da mesma forma, linhas que simplesmente se sustentam e que podem ser economizadas devem ser. Um bloco de instrução única que é delimitado por chaves desperdiça uma a duas linhas. Com apenas 50 linhas ish por altura da tela, isso é perceptível.
Omitir aparelho não faz mal nenhum
Há apenas um argumento contra a omissão de chaves: que alguém mais tarde adicione outra declaração ao bloco em questão e esqueça de adicioná-las, alterando inadvertidamente a semântica do código.
Isso seria realmente um grande negócio.
Mas na minha experiência, não é. Sou um programador desleixado; e, no entanto, em minha década de experiência em programação, posso dizer honestamente que nunca esqueci de adicionar chaves ao adicionar uma declaração extra a um bloco singleton.
Até acho implausível que esse seja um erro comum: os blocos são uma parte fundamental da programação. A resolução e o escopo no nível do bloco são um processo mental automático e arraigado para os programadores. O cérebro simplesmente faz isso (caso contrário, raciocinar sobre programação seria muito mais difícil). Não há esforço mental adicional necessário para lembrar de colocar os aparelhos: o programador também se lembra de recuar a declaração recém-adicionada corretamente, afinal; então o programador já processou mentalmente que um bloco está envolvido.
Agora, eu estou não dizer que omitindo chaves não causar erros. O que estou dizendo é que não temos evidências de um jeito ou de outro. Simplesmente não sabemos se isso causa danos.
Então, até que alguém possa me mostrar dados concretos, coletados de experimentos científicos, demonstrando que isso é realmente um problema na prática, essa teoria permanece uma " história mais ou menos ": uma hipótese muito convincente que nunca foi posta à prova e que não deve ser usado como argumento.
1 Às vezes, esse problema é resolvido colocando tudo - inclusive o aparelho - na mesma linha:
if (condition)
{ do_something(); }
No entanto, acredito que é seguro dizer que a maioria das pessoas despreza isso. Além disso, ele teria os mesmos problemas que a variante sem chaves, por isso é o pior dos dois mundos.