Ist eine tiefe Verschachtelung des Kontrollflusses im Code ein untersuchtes Problem?

8

Ich machte Kollegen klar, dass ein tiefgreifender Kontrollfluss die Lesbarkeit von Code beeinträchtigt.

Beispiel aus der entsprechenden Stapelüberlauffrage /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...

Wie bei den meisten Dingen ist es trivial einfach, Meinungen zu diesem Thema zu finden.

Ich frage mich jedoch, ob jemand mehr dazu beitragen kann.

Wurde zum Beispiel eine aktuelle Studie durchgeführt, die für das Problem relevant ist?

Oder können andere Argumente vorgebracht werden, die über "Ich mag X besser" hinausgehen?

user50849
quelle
3
Es gibt viele Möglichkeiten, die Anzahl der Einrückungsstufen zu verringern. Eine vorzeitige Rückkehr ist eine davon.
Robert Harvey
Wenn "Proof by Authority" akzeptabel ist, können Sie das relevante Material aus Microsoft Code Complete (2. Ausgabe) verwenden, das IIRC nicht mehr als 3 oder 4 Verschachtelungsebenen in Sec. 19.4 (die Argumentation der Klarheit des Verständnisses geht über diesen Punkt hinaus verloren).
Hardmath
1
Jede Bereichsebene fügt zusätzliche Dinge hinzu, die Sie im Kopf behalten müssen, um die Funktionalität des Codes richtig zu verstehen. Das Arbeitsgedächtnis eines Menschen ist nicht so groß . Berücksichtigen Sie auch die Komplexität des Unit-Tests des Codes, der "mehr als eine Sache" bewirkt.

Antworten:

4

Schnelles Googeln zeigt, dass einige Untersuchungen durchgeführt wurden. Dieses Papier zeigt zum Beispiel, dass es einen Wert für die zyklomatische Komplexität von Code gibt, der die Fehlerrate minimiert:

ein flacher Sigmoid-Graph

Wahrscheinlich ist eine tiefe Verschachtelung in Ordnung, solange sie nicht an jedem Punkt verzweigt. Das heißt, viele verschachtelte Bedingungen oben zu haben, wie in Ihrem Beispiel, ist wahrscheinlich in Ordnung, da es sich im Wesentlichen um eine Bedingung handelt, die nur nicht als Konjunktion geschrieben wurde.

OTOH Wenn Ihre unten stehende switch-Anweisung groß ist und nicht triviale Verzweigungen aufweist, gilt möglicherweise die Klausel "Sie sind geschraubt".

9000
quelle