Digamos que eu tenha um código em C com aproximadamente esta estrutura:
switch (something)
{
case 0:
return "blah";
break;
case 1:
case 4:
return "foo";
break;
case 2:
case 3:
return "bar";
break;
default:
return "foobar";
break;
}
Obviamente, os break
s não são necessários para o código funcionar corretamente, mas parecerá uma prática ruim se eu não os colocar lá para mim.
O que você acha? Posso removê-los? Ou você os guardaria para aumentar a "correção"?
c
switch-statement
correctness
houbysoft
fonte
fonte
continue
ougoto
- é idiomático usá-las no lugar debreak
.Eu tomaria uma abordagem totalmente diferente. NÃO RETORNE no meio do método / função. Em vez disso, basta colocar o valor de retorno em uma variável local e enviá-lo no final.
Pessoalmente, acho o seguinte mais legível:
fonte
Pessoalmente, gostaria de remover as devoluções e manter os intervalos. Eu usaria a instrução switch para atribuir um valor a uma variável. Em seguida, retorne essa variável após a instrução switch.
Embora este seja um ponto discutível, sempre achei que um bom design e encapsulamento significam uma entrada e uma saída. É muito mais fácil garantir a lógica e você não perderá acidentalmente o código de limpeza com base na complexidade ciclomática de sua função.
Uma exceção: retornar antecipadamente está correto se um parâmetro inválido for detectado no início de uma função - antes que quaisquer recursos sejam adquiridos.
fonte
switch
, mas não necessariamente melhor em geral. Bem, digamos que a instrução switch dentro de uma função preceda outras 500 linhas de código que são válidas apenas quando certos casos sãotrue
. Qual é o objetivo de executar todo aquele código extra para os casos que não precisam executá-lo; não é melhor apenasreturn
dentro doswitch
para aquelescase
s?Mantenha as pausas - é menos provável que você tenha problemas se / quando editar o código mais tarde, se as quebras já estiverem no lugar.
Dito isso, é considerado por muitos (inclusive eu) uma má prática retornar do meio de uma função. Idealmente, uma função deve ter um ponto de entrada e um ponto de saída.
fonte
Remova eles. É idiomático retornar de
case
instruções e, caso contrário, é ruído de "código inalcançável".fonte
Eu iria removê-los. Em meu livro, um código morto como esse deve ser considerado um erro porque faz você ficar surpreso e se perguntar "Como eu executaria essa linha?"
fonte
Eu normalmente escreveria o código sem eles. IMO, código morto tende a indicar desleixo e / ou falta de compreensão.
Claro, eu também consideraria algo como:
Editar: mesmo com a postagem editada, essa ideia geral pode funcionar bem:
Em algum ponto, especialmente se os valores de entrada forem esparsos (por exemplo, 1, 100, 1000 e 10000), você deseja uma matriz esparsa. Você pode implementar isso como uma árvore ou um mapa razoavelmente bem (embora, é claro, uma opção ainda funcione neste caso também).
fonte
Eu diria para removê-los e definir um padrão: branch.
fonte
Não seria melhor ter um array com
e fazer
return arr[something];
?Se for sobre a prática em geral, você deve manter as
break
instruções no switch. No caso de você não precisar dereturn
declarações no futuro, diminui a chance de passar para a próximacase
.fonte
Para "correção", blocos de entrada única e saída única são uma boa ideia. Pelo menos eles eram quando eu fiz minha graduação em ciência da computação. Então, eu provavelmente declararia uma variável, atribuiria a ela no switch e retornaria uma vez no final da função
fonte
Não há problema em removê-los. Usar
return
é exatamente o cenário ondebreak
não deve ser usado.fonte
Interessante. O consenso da maioria dessas respostas parece ser que a
break
afirmação redundante é uma desordem desnecessária. Por outro lado, eu li abreak
declaração em um switch como o 'encerramento' de um caso.case
blocos que não terminam em umbreak
tendem a saltar sobre mim como uma queda potencial através de insetos.Eu sei que não é assim quando há um em
return
vez de umbreak
, mas é assim que meus olhos 'lêem' os blocos de caso em um switch, então eu pessoalmente prefiro que cada umcase
seja pareado com umbreak
. Mas muitos compiladores reclamam que obreak
depoisreturn
é supérfluo / inacessível, e aparentemente eu pareço estar em minoria de qualquer maneira.Portanto, livre-se do
break
seguintereturn
.NB: tudo isso ignora se violar a regra de entrada / saída única é uma boa ideia ou não. Quanto a isso, tenho uma opinião que, infelizmente, muda dependendo das circunstâncias ...
fonte
Eu digo para removê-los. Se o seu código é tão ilegível que você precisa colocar as quebras lá 'para estar no lado seguro', você deve reconsiderar seu estilo de codificação :)
Além disso, sempre preferi não misturar quebras e retornos na instrução switch, mas sim ficar com um deles.
fonte
Eu pessoalmente tendo a perder o
break
s. Possivelmente, uma fonte desse hábito são os procedimentos da janela de programação para aplicativos do Windows:Pessoalmente, acho essa abordagem muito mais simples, sucinta e flexível do que declarar uma variável de retorno definida por cada manipulador e retorná-la no final. Dada essa abordagem, os
break
s são redundantes e, portanto, devem ser eliminados - eles não têm nenhum propósito útil (sintaticamente ou IMO visualmente) e apenas incham o código.fonte
Eu acho que o * intervalo * s têm um propósito. É para manter viva a 'ideologia' da programação. Se quisermos apenas 'programar' nosso código sem coerência lógica, talvez ele seja legível para você agora, mas tente amanhã. Tente explicar isso ao seu chefe. Tente executá-lo no Windows 3030.
Bleah, a ideia é muito simples:
/ * Só uma pequena questão. Quanto café você bebeu durante a leitura do texto acima? TI quebra o sistema às vezes * /
fonte
Saia do código em um ponto. Isso fornece melhor legibilidade para o código. Adicionar instruções de retorno (saídas múltiplas) entre elas tornará a depuração difícil.
fonte
Se você tiver o tipo de código "lookup", poderá empacotar a cláusula switch-case em um método por si só.
Eu tenho alguns desses em um sistema de "hobby" que estou desenvolvendo para me divertir:
(Sim. Esse é o espaço GURPS ...)
Concordo com os outros que você deve, na maioria dos casos, evitar mais de um retorno em um método e reconheço que este poderia ter sido melhor implementado como um array ou outra coisa. Acabei de descobrir que switch-case-return é uma combinação muito fácil para uma tabela de pesquisa com uma correlação de 1-1 entre entrada e saída, como a coisa acima (jogos de RPG estão cheios deles, tenho certeza de que existem em outros "negócios" também): D
Por outro lado, se a cláusula case for mais complexa, ou algo acontecer após a instrução switch, eu não recomendaria usar return nela, mas sim definir uma variável na switch, terminar com uma pausa e retornar o valor da variável no final.
(Por outro lado ... você sempre pode refatorar um switch em seu próprio método ... Duvido que tenha um efeito no desempenho, e não me surpreenderia se compiladores modernos pudessem reconhecê-lo como algo que poderia ser embutido ...)
fonte