Nesting

In diesem Blogpost werde ich über Nesting berichten. Ich bin auf das Thema durch ein YouTube Video gestossen, das auf meiner Recommended Liste aufgetaucht ist. In diesem YouTube Video wurde erklärt, weshalb man als Entwickler das “else” Keyword im If-Statement vermeiden soll.Der Grund war, dass man somit Nesting vermeiden kann und am Schluss ein guten und lesbaren Code geschrieben hat.

Tief verschachtelter Code (Nesting) kommt in der strukturierten Programmierung immer wieder vor. Sie hat zwar einige Vorteile, die in diesem Blogpost erörtert werden, wird aber häufig als schwer lesbar und als Anti-Pattern angesehen.

Insbesondere ist ein verschachtelter Control Flow, wie If-Statements oder Schleifen (for, while), auf drei Verschachtelungsebenen schwer zu verstehen und hat eine hohe zyklomatische Komplexität. Dies wird als „Dangerously Deep Nesting“ oder, im Fall von verschachtelten If-Statements, als „Arrow Anti Pattern“ bezeichnet, und zwar aufgrund der folgenden Form:

Zyklomatische Komplexität

Die zyklomatische Komplexität ist eine Software-Metrik¹, die zur Bestimmung der Komplexität eines Programms verwendet wird. Es handelt sich dabei um eine Zählung der Anzahl der Entscheidungen im Quellcode. Je höher die Zahl, desto komplexer ist der Code. 

Die zyklomatische Komplexität kann auf zwei Arten verwendet werden:

  • Begrenzung der Code-Komplexität.
  • Die Anzahl der erforderlichen Testfälle zu bestimmen.

Sie kann jedoch eine der am schwierigsten zu verstehenden Software-Qualitätsmetriken sein. Und das macht die Berechnung der zyklomatischer Komplexität schwierig. Deshalb ist es wichtig, etwas über Software-Qualitätsmetriken – wie die zyklomatische Komplexität – zu erfahren und zu lernen, wie man sie genau misst.

Die zyklomatische Komplexität (M) berechnen

Um die zyklomatische Komplexität zu berechnen, wird folgende Formel verwendet:

M = E – N + 2P

Dabei ist:

E = Anzahl der Kanten des Control-Flow Graphen

N = Anzahl der Nodes des Control-Flow Graphen 

P = Anzahl der verbundenen Komponenten

Folgende Schritte sollten bei der Berechnung der zyklomatischen Komplexität und dem Entwurf von Testfällen befolgt werden: 

  • Konstruktion eines Control-Flow Graphen mit Nodes und Kanten aus dem Code.
  • Identifizierung von unabhängigen Pfaden.
  • Berechnung der zyklomatischen Komplexität
  • Entwurf von Testfällen

Als Beispiel nehmen wir dieses simples Pseudo-Code:

A = 10
   IF B > C THEN
      A = B
   ELSE
      A = C
   ENDIF
Print A
Print B
Print C

Aus diesem Code wird nun ein Control-Flow Graph mit den Nodes und Kanten erstellt.

Beispiel aus: https://www.geeksforgeeks.org/cyclomatic-complexity/

Die zyklomatische Komplexität wird aus diesem Graphen nun berechnet. Im Graphen können wir sieben Rechtecken (Nodes), sieben Pfeilen (Kanten) und ein verbundenen Komponent auslesen. Somit ist die zyklomatische Komplexität 7 – 7 + 2 * 1 = 2.

¹ Software-Metrik: Eine (meist mathematische) Funktion, die eine Eigenschaft von Software in einen Zahlenwert, auch Masszahl genannt, abbildet. Hierdurch werden formale Vergleichs- und Bewertungsmöglichkeiten geschaffen.