Máximo aninhamento de loops e condicionais? [duplicado]

14

Eu escrevi algum código que tem alguns ninhos bastante profundos (uma vez, eu escrevi algo que era uma verificação condicional dentro de um forloop dentro de uma verificação condicional dentro de um forloop dentro de um forloop).

Existe uma diretriz geral sobre os limites para o número de loops / condicionais aninhados que você tem?

    
por Josh Brown 09.10.2013 / 19:50
fonte

6 respostas

14

Você está tocando em uma das métricas de código clássicas - complexidade ciclomática . Ele não mede níveis aninhados, mas sim loops e condicionais (que normalmente incluem níveis aninhados).

PMD (uma ferramenta de análise estática de Java) tem complexidade como uma de suas medidas e tem isso a dizer sobre isso :

Complexity is determined by the number of decision points in a method plus one for the method entry. The decision points are 'if', 'while', 'for', and 'case labels'. Generally, 1-4 is low complexity, 5-7 indicates moderate complexity, 8-10 is high complexity, and 11+ is very high complexity.

Veja também Experiências que correlacionam métricas de código à densidade de bugs de P.SE que se aprofunda nas medidas reais.

    
por 09.10.2013 / 20:30
fonte
9

A linguagem C permite até 127 níveis de blocos aninhados; como 640KB de RAM, é tudo que qualquer um deve precisar.

Na prática, se você se deparar com mais de 4 ou 5 níveis de profundidade, pense em incluir alguns desses níveis internos em suas próprias funções (ou repensar seu algoritmo). Se nada mais, o código será mais fácil de digitalizar.

    
por 09.10.2013 / 20:20
fonte
9

Eu recomendo strongmente que você leia "Clean Code" de Robert Martin, um extrato que diz sobre estruturas aninhadas:

Blocks and Indenting

...the blocks within if statements, else statements, while statements, and so on should be one line long. Probably that line should be a function call. Not only does this keep the enclosing function small, but it also adds documentary value because the function called within the block can have a nicely descriptive name.

This also implies that functions should not be large enough to hold nested structures. Therefore, the indent level of a function should not be greater than one or two. This, of course, makes the functions easier to read and understand.

Assim, a recomendação de Bob Martin é que o departamento de estrutura aninhada deve ser no máximo dois .

Concordo com isso e, embora nem sempre cumpra, pelo menos eu tento.

Além disso, de acordo com a configuração padrão do analisador estático PDM, a complexidade ciclomática de uma função não deve exceder 11, o que é facilmente alcançado se você for além de um dept de dois.

    
por 09.10.2013 / 22:29
fonte
5

Como na maioria das perguntas sobre padrões de codificação, a resposta é: O que quer que torne seu código mais legível.

Eu diria que é geralmente bastante próximo de zero camadas incorporadas de lógica. Mas, às vezes, não é, e aderir veementemente às regras contra o bom senso é mais prejudicial do que seguir a simples política de ler seu próprio código ou fazer com que outra pessoa o faça.

Qualquer coisa que o torne mais legível, faça isso.

    
por 09.10.2013 / 20:23
fonte
2

Eu pessoalmente tento evitar mais de quatro ou cinco níveis em uma única função. Mais do que isso seria um mau "cheiro de código". Eu sugeriria tentar evitar isso ajustando a estrutura do programa ou reformulando seu problema.

    
por 09.10.2013 / 20:10
fonte
1

Uma desvantagem para loops aninhados não mencionados ainda: Se cada loop for repetido em um grande conjunto de dados, seu algoritmo terá classes de alta complexidade. Por exemplo,

foreach(foo in foos) {
  foreach(bar in bars) {
    foreach(baz in bazzes) {
      foreach(buzz in buzzes) {
        do_a_thing(foo, bar, baz, buzz);
      }
    }
  }
}

Será executado em aproximadamente O(n^4) time se foos , bars , bazzes e buzzes tiverem aproximadamente o mesmo tamanho.

Isso não é um problema se as coleções sempre forem pequenas. Então, o conselho de todos os outros se aplica. Se suas coleções tiverem uma chance decente de serem milhares de itens grandes ou maiores, vale a pena procurar um algoritmo mais rápido, se possível.

    
por 10.10.2013 / 01:58
fonte