Considere este pedaço de código:
if (x == 1)
{
throw "no good; aborting" ;
}
[... more code ...]
Agora considere este código:
if (x == 1)
{
throw "no good; aborting" ;
}
else
{
[... more code ...]
}
Os dois casos funcionam exatamente da mesma maneira. O primeiro caso tem a vantagem de que você não precisa "envolver" o restante do código em um arquivo else
. O segundo tem a vantagem de seguir a prática de ter explicitamente um else
para todos if
.
Alguém pode apresentar argumentos sólidos em favor de um sobre o outro?
coding-style
exceptions
rlandster
fonte
fonte
else
parece falsa. Muitas vezes, simplesmente não há nada para colocar noelse
bloco, a menos que você se incline para trás.if
precisa de umelse
. O último programador que trabalhou em nossa base de código seguiu isso rigidamente ( bem, às vezes ... é meio esquizofrênico ). Como resultado, temos um monte de totalmente sem sentidoelse { /* do nothing */ }
blocos desarrumar o código ...Respostas:
Você não deve adicionar ramificações
else
posterioresif
que quebram o fluxo de controle incondicionalmente , como aquelas que contêm athrow
ou areturn
. Isso melhoraria a legibilidade do seu programa, removendo o nível desnecessário de aninhamento introduzido pelaelse
ramificação.O que parece mais ou menos OK com um single
throw
torna-se realmente feio quando vários lançamentos consecutivos são realizados:Este trecho faz a mesma coisa, mas parece muito melhor:
fonte
else if
.if
teste para uma única condição e lida com ela se a condição for verdadeira, e a menos que exista algo alternativo que ocorra se a condição for falsa,else if
são desnecessários. Temos um prazo em meu escritório para código como o primeiro trecho de dasblinkenlight: " máquinas pachinko ".else
.Eu chamaria a prática de "outra coisa explícita" a que você se refere como anti-padrão, pois obscurece o fato de que não há código de caso especial como outra coisa para o seu if.
A legibilidade / manutenção geralmente é aprimorada quando você não possui nada além de construções de fluxo de código necessárias e você as minimiza. Isso significa erros redundantes e ifs que adicionarão um escopo a uma função inteira dificultam o acompanhamento e a manutenção.
Digamos, por exemplo, que você tenha esta função:
Agora, existe o requisito de que, durante a configuração, você também deve especificar o índice de tipo / tipo do oblogon, existem vários escopos nos quais alguém pode colocar esse código e obter um código inválido, ou seja,
Compare isso se o código original foi escrito com construções mínimas de fluxo de controle necessárias e minimizadas.
Agora seria muito mais difícil colocar acidentalmente algo no escopo errado ou acabar inchando os escopos, causando duplicação no crescimento e manutenção a longo prazo dessa função. Além disso, é óbvio quais são os possíveis fluxos através dessa função para que a legibilidade seja aprimorada.
Eu sei, o exemplo é um pouco artificial, mas eu já vi muitas vezes
Então, formalizando essas regras sobre construções de controle-fluxo, acho que pode ajudar as pessoas a desenvolver a intuição necessária para sentir o cheiro de algo quando começarem a escrever código assim. Então eles vão começar a escrever ..
fonte