Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

Grundlagen der Programmierung: Codemetriken

Zyklomatische Komplexität

Testen Sie unsere 2021 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Die Komplexität einer Methode oder Klasse kann man errechnen. Schauen Sie sich an, wie dies geht!
05:55

Transkript

Eine wichtige, wenn auch nicht hundertprozentig unumstrittene Methodik, um die Komplexität von Code festzustellen, ist die so genannte zyklomatische Komplexität beziehungsweise die McCabe-Metrik. Wir widmen uns zunächst der theoretischen Betrachtung und sehen uns das Ganze dann in der Praxis an. Theoretisch besteht eine Methode, eine Klasse oder an sich der gesamte Code, den wir schreiben, aus einer unterschiedlichen Anzahl von Knoten und Kanten. Die Komplexität als solches kann also aus dem Zusammenhang jener Knoten, Kanten und eben deren Abhängigkeiten voneinander betrachtet werden. Das können wir uns im einfachsten Fall so vorstellen, dass wir zu Beginn einer Methode einen Zustand "a" haben und am Ende einer Methode einen Zustand "x". Wenn wir diesen Code jetzt einfach abarbeiten, werden "a" und "x" über eine Kante verbunden. Wir haben demnach zwei Knoten, eine Kante und demnach nur einen unabhängigen Pfad. Und zwar den von "a" nach "x". Wir kommen in unserem Fall demnach auf eine Komplexität von 1. Der Grund, warum ich "p" hier auf Eins gesetzt habe, ist, weil wir nur eine einzige Komponente betrachten und zwar eine Methode. Wenn man mehrere Methoden innerhalb einer Klasse betrachten würde oder eventuell sogar mehrere Klassen innerhalb eines Namensraums, dann müsste man die Anzahl für die Zusammenhangskomponenten entsprechend erhöhen. Da ich das Beispiel aber möglichst einfach halten möchte, lassen wir es zunächst bei "p=1". Wenn wir nun eine if-Anweisung in unserem Code haben, dann haben wir mehr als nur einen unabhängigen Pfad, denn sowohl kann unser Standardpfad von "a" nach "x" ausgeführt werden, es kann aber auch sein, dass die if-Anweisung getriggert wird. In diesem Fall haben wir zwei unabhängige Pfade. Von "a" nach "x" und von "a" nach "x" über "b". Wir kommen in diesem Fall auf eine Komplexität von 2. Man kann auf die Art und Weise auch Schleifen abbilden, so zum Beispiel indem man von "a" zu "b" und von "b" zurück nach "a" wechselt. Auf die Weise würde der Code zwischen "a" und "b" immer wieder ausgeführt werden. Durch die mehrmalige Ausführung des Pfades "ab" erhöht sich die Komplexität aber nicht. Denn wir haben in diesem Fall nur zwei unabhängige Pfade, von "a" nach "b" und von "a" nach "x". Die Komplexität des Codes als solches bleibt demnach bei 2. Schauen wir uns das Ganze in der Praxis an. Hier haben wir einen Getter und einen Konstruktor für "ImageSelectionView", und beide haben eine zyklomatische Komplexität von 1, während die gesamte Klasse "ImageSelectionView" eine zyklomatische Komplexität von 2 aufweist. Der Grund, warum hier auch für den Getter der "Uri"-Property eine Eins steht, ist, dass wir im Hintergrund den Byte-Code betrachten. Dies kann je nach Art und Weise wie die zyklomatische Komplexität errechnet wird, unterschiedlich sein. Das heißt, Sie können mit unterschiedlichen Werkzeugen durchaus zu unterschiedlichen Ergebnissen kommen. Sie müssen im Vorfeld also prüfen, wie wurde die zyklomatische Komplexität beziehungsweise auf welcher Basis welches Quellcodes wurde sie errechnet. In diesem Fall haben wir jetzt eine if-Anweisung und damit wird die Komplexität 2. Weil der Code des Bodys von "if" ja durchlaufen werden könnte oder nicht. Wir haben also diesen Fall "abx" und "ax". Hier wird das Ganze etwas schwieriger, denn in dem Fall verbirgt sich hinter "Action act" eine so genannte Lambda-Expression, also eine anonyme Methode. Da wir auf dem Byte-Code arbeiten, wird die Komplexität dieser anonymen Methode in die umgebende Komponente, also die Klasse, mit hineingerechnet. Auf diese Weise kommen wir auf eine Komplexität von 2. Und zwar ist das die Komplexität für die Methode "LoadingNextModuleWithoutAny" und so weiter und so fort, also für diese Testmethode. Nehmen wir nun diesen sehr schwierig geschriebenen C#-Code, dann hat er eine Komplexität von 4 und da sind wir genau bei einem Punkt, denn die aufgeräumte Fassung in C# hat ebenfalls eine Komplexität von 4. Das heißt, weil in diesem File die Komplexität auf Basis des Byte-Codes errechnet wurde, sind alle Optimierungen, die uns C# bieten, nicht miteingerechnet. Und diese Optimierungen oder der syntaktische Zucker, der durch so etwas wie die "any"-Methode kommt, die sind für die Berechnung dieser Komplexität nicht unbedingt ausschlaggebend. Die zyklomatische Komplexität sagt also mehr darüber aus, wie komplex der Code zur Laufzeit ist, als wie komplex der Code für uns zu lesen ist. Und das macht die zyklomatische Komplexität ein wenig umstritten. Wo sie uns in jedem Fall hilft, ist bei der Einschätzung, wie viel Testabdeckung wir brauchen. Denn in diesem Fall wird einberechnet, welche Codepfade vorhanden sind und rein theoretisch bräuchten wir für jeden Codepfad, der vorhanden ist, auch einen Test, um einschätzen zu können, ob alles hundertprozentig funktioniert. In diesem Fall bei der switch-case-Anweisung haben wir dann eine Komplexität von 3, da sich die einzelnen case-Blöcke genauso verhalten wie if-Anweisungen. Der default-Zweig als solches wird nicht zusätzlich eingerechnet, da er kein unabhängiger Pfad im Verhältnis zu anderen Pfaden ist.

Grundlagen der Programmierung: Codemetriken

Lernen Sie Methoden, Prinzipien und Werkzeuge kennen, mit deren Hilfe Sie die Qualität Ihrer Software dauerhaft sicherstellen können.

1 Std. 43 min (20 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Exklusiv für Abo-Kunden
Erscheinungsdatum:25.04.2017

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!