É uma má prática usar break
declaração dentro de um for
loop ?
Digamos, estou procurando um valor em uma matriz. Compare dentro de um loop for e, quando o valor for encontrado, break;
saia do loop for.
Esta é uma prática ruim? Vi a alternativa usada: defina uma variável vFound
e defina-a como true quando o valor for encontrado e verifique vFound
a for
condição da instrução. Mas é necessário criar uma nova variável apenas para esse fim?
Estou perguntando no contexto de um loop normal C ou C ++.
PS: As diretrizes de codificação MISRA desaconselham o uso de interrupções.
break
na mesma liga quegoto
:)Respostas:
Muitas respostas aqui, mas ainda não vi isso mencionado:
A maioria dos "perigos" associados ao uso
break
oucontinue
em um loop for são negados se você criar loops organizados e de fácil leitura. Se o corpo do seu loop abranger vários comprimentos de tela e tiver vários sub-blocos aninhados, sim, você pode facilmente esquecer que algum código não será executado após a interrupção. Se, no entanto, o loop for curto e direto ao ponto, o objetivo da instrução break deve ser óbvio.Se um loop estiver ficando muito grande, use uma ou mais chamadas de função bem nomeadas no loop. O único motivo real para evitar isso é processar gargalos.
fonte
Não, quebrar é a solução correta.
Adicionar uma variável booleana dificulta a leitura do código e adiciona uma fonte potencial de erros.
fonte
goto
para interromper os loops aninhados de nível 2+ - porque não existembreak(level)
Você pode encontrar todos os tipos de códigos profissionais com instruções 'break' neles. Faz perfeitamente sentido usá-lo sempre que necessário. No seu caso, essa opção é melhor do que criar uma variável separada apenas com o objetivo de sair do loop.
fonte
Usar
break
tanto quantocontinue
emfor
loop é perfeitamente adequado .Simplifica o código e melhora sua legibilidade.
fonte
Longe das práticas recomendadas, o Python (e outras linguagens?) Estendeu a estrutura do
for
loop , de modo que parte dela só será executada se o loop não forbreak
.Resultado:
Código equivalente sem
break
e útilelse
:fonte
Não há nada inerentemente errado em usar uma instrução break, mas os loops aninhados podem ficar confusos. Para melhorar a legibilidade, muitas linguagens ( pelo menos Java suporta ) quebram os rótulos, o que melhorará bastante a legibilidade.
Eu direi que as instruções de quebra (e retorno) geralmente aumentam a complexidade ciclomática, o que dificulta a comprovação de que o código está fazendo a coisa correta em todos os casos.
Se você estiver pensando em usar uma pausa ao iterar sobre uma sequência para um item em particular, convém reconsiderar a estrutura de dados usada para armazenar seus dados. Usar algo como um Conjunto ou Mapa pode fornecer melhores resultados.
fonte
for
loops complexos .break é uma declaração completamente aceitável de usar (assim como continue , btw). É tudo sobre legibilidade do código - contanto que você não tenha loops complicados demais, tudo bem.
Não é como se eles fossem da mesma liga que goto . :)
fonte
Regra geral: se seguir uma regra exigir que você faça algo mais estranho e difícil de ler, quebre a regra e quebre a regra.
No caso de fazer um loop até encontrar algo, você se depara com o problema de distinguir achado versus não encontrado quando sai. Isso é:
Então, ok, você pode definir um sinalizador ou inicializar um valor "encontrado" para nulo. Mas
Por isso, em geral, prefiro inserir minhas pesquisas em funções:
Isso também ajuda a organizar o código. Na linha principal, "localizar" se torna uma única declaração e, quando as condições são complexas, elas são escritas apenas uma vez.
fonte
break
, tento encontrar uma maneira de refatorar o código em uma função, para que eu possa usá-loreturn
.Depende do idioma. Enquanto você pode verificar uma variável booleana aqui:
não é possível fazer isso ao percorrer uma matriz:
Enfim,
break
tornaria ambos os códigos mais legíveis.fonte
No seu exemplo, você não sabe o número de iterações para o loop for . Por que não usar enquanto laço em vez disso, o que permite que o número de iterações a ser indeterminado no início?
É, por conseguinte, não é necessário o uso de ruptura statemement em geral, como o ciclo pode ser melhor demonstrados como uma enquanto loop.
fonte
Eu concordo com outras pessoas que recomendam o uso
break
. A pergunta conseqüente óbvia é por que alguém recomendaria o contrário? Bem ... quando você usa break, pula o restante do código no bloco e as demais iterações. Às vezes, isso causa bugs, por exemplo:um recurso adquirido na parte superior do bloco pode ser liberado na parte inferior (isso é verdade mesmo para blocos dentro de
for
loops), mas essa etapa de liberação pode ser acidentalmente ignorada quando uma saída "prematura" é causada por umabreak
declaração (em "moderno" C ++, "RAII" é usado para lidar com isso de uma maneira confiável e protegida contra exceções: basicamente, os destruidores de objetos liberam recursos de maneira confiável, independentemente de como um escopo é encerrado)alguém pode alterar o teste condicional na
for
declaração sem perceber que existem outras condições de saída deslocalizadasA resposta de ndim observa que algumas pessoas podem evitar
break
s para manter um tempo de execução de loop relativamente consistente, mas você estava comparandobreak
com o uso de uma variável de controle booleana de saída antecipada onde isso não se aplicaDe vez em quando, as pessoas que observam esses erros percebem que podem ser evitadas / atenuadas por essa regra de "sem interrupções" ... na verdade, existe toda uma estratégia relacionada à programação "mais segura" chamada "programação estruturada", onde cada função deve ter um único ponto de entrada e saída também (ou seja, sem ir, sem retorno antecipado). Pode eliminar alguns erros, mas sem dúvida apresenta outros. Por que eles fazem isso?
fonte
break
. Eles o evitaram, mas não conseguiram pensar nas condições que substituíram o uso do intervalo.É perfeitamente válido de usar
break
- como outros já apontaram, não está na mesma liga quegoto
.Embora você queira usar a
vFound
variável quando quiser verificar fora do loop se o valor foi encontrado na matriz. Também do ponto de vista da capacidade de manutenção, ter uma bandeira comum sinalizando os critérios de saída pode ser útil.fonte
Fiz algumas análises sobre a base de código em que estou trabalhando (40.000 linhas de JavaScript).
Encontrei apenas 22
break
afirmações, das quais:switch
instruções (temos apenas 3 instruções de chave no total!).for
loops - um código que eu imediatamente classifiquei para ser refatorado em funções separadas e substituído porreturn
declaração.break
interno finalwhile
... Corrigit blame
para ver quem escreveu essa porcaria!Então, de acordo com minhas estatísticas: Se
break
for usado fora deswitch
, é um cheiro de código.Eu também procurei por
continue
declarações. Não encontrou nenhum.fonte
Não vejo nenhuma razão para que seja uma prática recomendada, desde que você queira concluir o processamento de STOP nesse momento.
fonte
No mundo incorporado, há muito código por aí que usa a seguinte construção:
Este é um exemplo muito genérico, muitas coisas estão acontecendo atrás da cortina, interrompendo em particular. Não use isso como código padrão, estou apenas tentando ilustrar um exemplo.
Minha opinião pessoal é que não há nada errado em escrever um loop dessa maneira, desde que sejam tomados os devidos cuidados para evitar que ele permaneça indefinidamente.
fonte
continue
instruções dentro da lógica do aplicativo. Existem?Depende do seu caso de uso. Existem aplicativos em que o tempo de execução de um loop for precisa ser constante (por exemplo, para satisfazer algumas restrições de tempo ou para ocultar seus dados internos de ataques baseados em tempo).
Nesses casos, fará sentido definir um sinalizador e somente verificar o valor do sinalizador APÓS todas as
for
iterações do loop terem sido executadas. Obviamente, todas as iterações de loop for precisam executar código que ainda leva aproximadamente o mesmo tempo.Se você não se importa com o tempo de execução ... use
break;
econtinue;
para facilitar a leitura do código.fonte
Nas regras MISRA 98, usadas na minha empresa em C dev, a declaração de interrupção não deve ser usada ...
Edit: Break é permitido em MISRA '04
fonte
Claro,
break;
é a solução para interromper o loop for ou foreach. Eu usei em php em foreach e for loop e encontrei trabalhando.fonte
Discordo!
Por que você ignoraria a funcionalidade interna de um loop for para criar sua própria? Você não precisa reinventar a roda.
Eu acho que faz mais sentido ter seus cheques no topo do seu loop for, assim
ou se você precisar processar a linha primeiro
Dessa forma, você pode escrever uma função para executar tudo e criar um código muito mais limpo.
Ou, se sua condição for complicada, você também pode mudar esse código!
"Código profissional", repleto de pausas, não parece realmente um código profissional para mim. Parece codificação lenta;)
fonte
break
argumenta que é para legibilidade do código. Agora olhe novamente para a louca condição de 8 km de comprimento nos loops acima ...