Pergunta

Os desenvolvedores devem evitar usar continuar em C# ou equivalente em outras linguagens para forçar a próxima iteração de um loop?Os argumentos a favor ou contra se sobreporiam aos argumentos sobre Vá para?

Foi útil?

Solução

Acho que deveria haver mais uso de continue!

Muitas vezes me deparo com códigos como:

for (...)
{
   if (!cond1)
   {
      if (!cond2)
      {
          ... highly indented lines ...
      }
   }
}

em vez de

for (...)
{
   if (cond1 || cond2)
   {
      continue;
   }

   ...
}

Use-o para tornar o código mais legível!

Outras dicas

É continue mais prejudicial do que, digamos, break?

Na verdade, na maioria dos casos em que o encontro/uso, acho que torna o código mais claro e menos parecido com espaguete.

Você pode escrever um código bom com ou sem continuar e pode escrever um código ruim com ou sem continuar.

Provavelmente há alguma sobreposição com argumentos sobre goto, mas no que me diz respeito, o uso de continue é equivalente a usar instruções break (em loops) ou instruções return de qualquer lugar no corpo do método - se usado corretamente, pode simplificar o código (menos provável que contenha bugs, mais fácil de manter).

Não existem palavras-chave prejudiciais.Há apenas usos prejudiciais deles.

Goto não é prejudicial por si só, nem continue.Eles precisam ser usados ​​com cuidado, só isso.

Se continuar estiver causando problemas de legibilidade, é provável que você tenha outros problemas.Por exemplo, grandes quantidades de código dentro de um loop for.Se você tiver que escrever loops for grandes, eu tentaria usar continue próximo ao topo do loop for.Caso contrário, um continue enterrado bem no meio de um loop for pode facilmente ser perdido.

Gosto de usar continue no início dos loops para lidar com condições if simples.

Para mim, isso torna o código mais legível, pois não há aninhamento extra e você pode ver que lidei explicitamente com esses casos.

É esse o mesmo motivo pelo qual eu usaria um goto?Talvez.Às vezes, eu os uso para facilitar a leitura e para interromper o aninhamento de código, mas geralmente os uso mais para limpeza/tratamento de erros.

Eu diria:"depende".

Se você tiver um código de loop razoavelmente pequeno (onde você pode ver todo o código de loop sem rolar), geralmente não há problema em usar continuar.

No entanto, se o corpo do loop for grande (por exemplo, devido a uma grande mudança) e houver algum código de acompanhamento (digamos, abaixo da chave), você poderá facilmente introduzir bugs adicionando um continue e, portanto, às vezes ignorando esse código.Eu encontrei isso no coração de um interpretador de bytecode, onde algum código de instrumentação às vezes não era executado devido a uma continuação em algumas ramificações de caso.

Este pode ser um caso construído artificialmente, mas geralmente tento evitar continuar e usar um if (mas não aninhar muito profundamente como no código de exemplo de Rob).

Não acho que continue seja tão difícil quanto goto, já que continue nunca move a execução para fora do bloco de código em que está.

Se você estiver iterando qualquer tipo de conjunto de resultados e executando operações nesses resultados, por exemplo, dentro de um for each, e se um resultado específico causou um problema, é bastante útil para capturar um erro esperado (via try-catch), registrá-lo e passar para o próximo resultado via continue.Continue é especialmente útil, na minha opinião, para serviços autônomos que realizam trabalhos em horários estranhos, e uma exceção não deve afetar o outro x número de registros.

  1. Usar continue no início de um loop para evitar iteração sobre elementos desnecessários não é prejudicial e pode ser muito útil, mas usá-lo no meio de ifs e elses aninhados pode transformar o código do loop em um labirinto complexo, para entender e validar.

  2. Acho que evitar o uso também é resultado de um mal-entendido semântico.Pessoas que nunca veem/escrevem a palavra-chave 'continue' em seu código, ao ver um código com continue podem interpretá-lo como "a continuação do fluxo natural".Se em vez de continuar tivéssemos próximo, por exemplo, acho que mais pessoas apreciariam esse valioso recurso de cursor.

goto pode ser usado como continuação, mas não o contrário.

Você pode "ir para" qualquer lugar, quebrando assim o controle de fluxo arbitrariamente.

Assim continue, não tão prejudicial.

Outros sugeriram isso...mas continue e break são impostos pelo compilador e têm suas próprias regras associadas.Goto não tem tais limitações, embora o efeito líquido poder quase ser o mesmo, em algumas circunstâncias.

Não considero continue ou break prejudiciais por si só, embora tenha certeza de que qualquer um deles pode ser mal usado de uma maneira que faria qualquer programador sensato engasgar.

Eu diria que sim.Para mim, isso apenas quebra o 'fluxo' de um trecho de código escrito com fluidez.

Outro argumento também poderia ser que, se você seguir as palavras-chave básicas suportadas pela maioria das linguagens modernas, o fluxo do seu programa (se não a lógica ou o código) poderá ser portado para qualquer outra linguagem.Ter uma palavra-chave não suportada (ou seja, continuar ou ir para) quebraria isso.

Na verdade, é mais uma preferência pessoal, mas nunca tive que usá-lo e não considero isso uma opção quando estou escrevendo um novo código.(o mesmo que ir para.)

No que diz respeito a este programador, Aninhado if/else considerado prejudicial.

Continue é uma função realmente útil na maioria das linguagens, pois permite que blocos de código sejam ignorados em determinadas condições.

Uma alternativa seria usar variáveis ​​booleanas em instruções if, mas elas precisariam ser redefinidas após cada uso.

continuar parece errado para mim.break tira você de lá, mas continue parece apenas espaguete.

Por outro lado, você pode emular continue com break (pelo menos em Java).

for (String str : strs) contLp: {
    ...
       continue contLp;
    ...
}

continue pode ser útil em algumas circunstâncias, mas ainda parece sujo para mim.

for (char c : cs) {
    final int i;
    if ('0' <= c && c <= '9') {
        i = c - '0';
    } else if ('a' <= c && c <= 'z') {
        i = c - 'a' + 10;
    } else {
        continue;
    }
    ... use i ...
}

Acredito que o argumento final contra continue é que fica mais difícil PROVAR que o código está correto.Isso é provado no sentido matemático.Mas provavelmente isso não importa para você, porque ninguém tem os recursos para “provar” um programa de computador que seja significativamente complexo.

Entre nas ferramentas de análise estática.Você pode tornar as coisas mais difíceis para eles...

E o goto, isso parece um pesadelo pelos mesmos motivos, mas em qualquer lugar aleatório do código.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top