O aninhamento profundo do fluxo de controle no código é um problema estudado?

8

Afirmei aos colegas de trabalho que níveis profundos de fluxo de controle eram prejudiciais à legibilidade do código.

Exemplo, retirado da pergunta relevante de estouro de pilha /software/52685/if-you-need-more-than-3-levels-of-indentation-youre-screwed :

for(int i=0; i<10; ++i){
  Object val = repeat(i, someVar);
  if(val.value > 3){
    switch(val.item){
      case DOG:
        if(mProcess){
          outputToUser(val);
          doMoreThings(val, mMoreThingDoer);
          if(mRepurpose){
            addExample(val);
          }
          // and so on, and so on...

Como na maioria das coisas, é trivialmente fácil encontrar opiniões sobre esse tópico.

Gostaria de saber, no entanto, se alguém pode contribuir mais do que isso.

Por exemplo, foi realizado um estudo real relevante para o problema?

Ou podem ser apresentados outros argumentos que vão além de "eu gosto mais de X"?

user50849
fonte
3
Existem muitas maneiras de reduzir o número de níveis de recuo. O retorno antecipado é um deles.
Robert Harvey
Se "prova por autoridade" for aceitável, você poderá usar o material relevante do Code Complete da Microsoft (2ª ed.), Que o IIRC recomenda não mais que 3 ou 4 níveis de aninhamento na seção 19.4 (argumentar que a clareza de entendimento se perde além desse ponto).
hardmath
1
Cada nível de escopo adiciona itens adicionais que você precisa manter em mente para entender corretamente a funcionalidade do código. A memória de trabalho de um humano não é tão grande . Considere também a complexidade do teste de unidade do código que faz "mais de uma coisa".

Respostas:

4

A pesquisa rápida mostra que algumas pesquisas foram feitas. Por exemplo, este artigo mostra que há um valor de complexidade ciclomática de código que minimiza a taxa de erros:

um gráfico sigmóide raso

Provavelmente o assentamento profundo pode ser bom, desde que não se ramifique em todos os pontos. Ou seja, ter muitas condições aninhadas no topo, como no seu exemplo, provavelmente é bom, pois é essencialmente uma condição, mas não escrita como uma conjunção.

OTOH, se a sua declaração de chave abaixo for grande e tiver ramificações seriamente não triviais, a cláusula 'você está ferrado' pode ser aplicada.

9000
fonte