¿Es la anidación profunda del flujo de control en el código un problema estudiado?

8

Expuse a los compañeros de trabajo que los niveles profundos de flujo de control eran perjudiciales para la legibilidad del código.

Ejemplo, tomado de la pregunta de desbordamiento de pila relevante /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 con la mayoría de las cosas, es trivialmente fácil encontrar opiniones sobre este tema.

Sin embargo, me pregunto si alguien puede contribuir más que eso.

¿Se ha realizado, por ejemplo, un estudio real relevante para el problema?

¿O se pueden hacer otros argumentos que vayan más allá de "Me gusta X mejor"?

usuario50849
fuente
3
Hay muchas formas de reducir la cantidad de niveles de sangría. El regreso temprano es uno de ellos.
Robert Harvey
Si la "prueba por autoridad" es aceptable, puede usar el material relevante del Código Completo de Microsoft (2ª ed.), Que IIRC recomienda no más de 3 o 4 niveles de anidamiento en la Sec. 19.4 (argumentando que la claridad de comprensión se pierde más allá de ese punto).
hardmath
1
Cada nivel de alcance agrega cosas adicionales que debe tener en mente para comprender adecuadamente la funcionalidad del código. La memoria de trabajo de un humano no es tan grande . Considere también, la complejidad de la unidad que prueba el código que hace "más de una cosa".

Respuestas:

4

La búsqueda rápida en Google muestra que se han realizado algunas investigaciones. Por ejemplo, este documento muestra que hay un valor de complejidad ciclomática del código que minimiza la tasa de errores:

un gráfico sigmoide superficial

Probablemente la anidación profunda puede estar bien siempre que no se ramifique en todos los puntos. Es decir, tener muchas condiciones anidadas en la parte superior, como en su ejemplo, probablemente esté bien, ya que es esencialmente una condición, simplemente no escrita como una conjunción.

OTOH si su declaración de cambio a continuación es grande y tiene ramificaciones realmente no triviales, puede aplicarse la cláusula 'estás jodido'.

9000
fuente