<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=McCabe-Metrik</id>
	<title>McCabe-Metrik - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=McCabe-Metrik"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=McCabe-Metrik&amp;action=history"/>
	<updated>2026-06-06T10:27:04Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=McCabe-Metrik&amp;diff=375379&amp;oldid=prev</id>
		<title>imported&gt;SchlurcherBot: Bot: http → https</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=McCabe-Metrik&amp;diff=375379&amp;oldid=prev"/>
		<updated>2025-10-16T06:16:23Z</updated>

		<summary type="html">&lt;p&gt;Bot: http → https&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Die &amp;#039;&amp;#039;&amp;#039;McCabe-Metrik&amp;#039;&amp;#039;&amp;#039; (auch &amp;#039;&amp;#039;&amp;#039;zyklomatische Komplexität&amp;#039;&amp;#039;&amp;#039; – &amp;#039;&amp;#039;cyclomatic complexity&amp;#039;&amp;#039;) ist eine [[Softwaremetrik]], mit der die [[Komplexität]] eines [[Modul (Software)|Software-Moduls]] (Funktion, Prozedur oder allgemein ein Stück Sourcecode) gemessen werden kann. Die zyklomatische Komplexität wurde 1976 durch [[Thomas J. McCabe]] eingeführt.&amp;lt;ref name=&amp;quot;:0&amp;quot;&amp;gt;{{Literatur |Autor=Christof Ebert, James Cain, Giuliano Antoniol, Steve Counsell, Phillip Laplante |Titel=Cyclomatic Complexity |Sammelwerk=IEEE Software |Band=33 |Nummer=6 |Datum=2016-11 |ISSN=0740-7459 |DOI=10.1109/MS.2016.147 |Seiten=27–29 |Online=https://ieeexplore.ieee.org/document/7725232/ |Abruf=2021-02-19}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinter der Software-Metrik von McCabe steckt der Gedanke, dass ab einer bestimmten Komplexität das Modul für den Menschen nicht mehr begreifbar ist. Die &amp;#039;&amp;#039;cyclomatic complexity&amp;#039;&amp;#039; ist definiert als Anzahl linear unabhängiger Pfade auf dem [[Kontrollflussgraph]]en eines Moduls. Damit ist die Zahl eine obere Schranke für die minimale Anzahl der Testfälle, die nötig sind, um eine vollständige [[Kontrollflussorientierte Testverfahren|Zweigüberdeckung]] des Kontrollflussgraphen zu erreichen.&lt;br /&gt;
&lt;br /&gt;
== Berechnung ==&lt;br /&gt;
Es gibt zwei Ansätze, wie man die zyklomatische Komplexität nach McCabe –&amp;amp;nbsp;also die linear unabhängigen Pfade in einem Kontrollfluss&amp;amp;nbsp;– berechnen kann, abhängig von der Anzahl der Binärverzweigungen oder abhängig von der Anzahl der Knoten und Kanten in Kontrollflussgraphen.&lt;br /&gt;
&lt;br /&gt;
=== Berechnung durch Anzahl Binärverzweigungen ===&lt;br /&gt;
Das Komplexitätsmaß nach McCabe &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; ist gleich der Anzahl der binären Verzweigungen &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; plus 1. Bei Betrachtung mehrerer Kontrollflussgraphen (also &amp;lt;math&amp;gt;p&amp;gt;1&amp;lt;/math&amp;gt;) gilt &amp;lt;math&amp;gt;M = b + p&amp;lt;/math&amp;gt; wobei&lt;br /&gt;
: b: Anzahl Binärverzweigungen, also [[bedingte Anweisung]]en mit genau zwei Zweigen, z.&amp;amp;nbsp;B. &amp;lt;code&amp;gt;IF&amp;lt;/code&amp;gt;-Anweisungen und&lt;br /&gt;
: p: Anzahl der einzelnen Kontrollflussgraphen (ein Graph pro Funktion/Prozedur).&lt;br /&gt;
&lt;br /&gt;
Verzweigungen mit mehr als zwei Zweigen können auf Binärverzweigungen heruntergebrochen werden. Dabei gilt &amp;lt;math&amp;gt;b = z - 1&amp;lt;/math&amp;gt; mit&lt;br /&gt;
: z: Anzahl Zweige.&lt;br /&gt;
&lt;br /&gt;
=== Berechnung durch Anzahl Knoten und Kanten ===&lt;br /&gt;
Alternativ kann man das Komplexitätsmaß noch durch die Anzahl der Knoten und Kanten im Kontrollflussgraph berechnen. In diesem Fall ist die McCabe-Zahl definiert als &amp;lt;math&amp;gt;M = e - n + 2p&amp;lt;/math&amp;gt; wobei&lt;br /&gt;
: e: Anzahl Kanten im Graphen,&lt;br /&gt;
: n: Anzahl Knoten im Graphen und&lt;br /&gt;
: p: Anzahl der [[Zusammenhang (Graphentheorie)|Zusammenhangskomponenten]] des Graphen.&lt;br /&gt;
&lt;br /&gt;
== Interpretation der Metrik ==&lt;br /&gt;
Laut McCabe sollte die zyklomatische Zahl eines in sich abgeschlossenen Teilprogramms nicht höher als 10 sein, da sonst das Programm zu komplex und zu schwer zu testen ist. Diese Regel ist allerdings umstritten, da sich die zyklomatische Zahl nur dann erhöht, wenn verzweigende Anweisungen wie &amp;lt;code&amp;gt;IF&amp;lt;/code&amp;gt; eingefügt werden, aber nicht beim Einfügen sonstiger Anweisungen (zum Beispiel einer Bildschirmausgabe). Es kann also lediglich eine Aussage über den Testaufwand (Anzahl der zu testenden unabhängigen&lt;br /&gt;
Programmpfade) getroffen werden.&lt;br /&gt;
&lt;br /&gt;
== Kritik ==&lt;br /&gt;
Komplexitätsmaße sind für Menschen mitunter nicht intuitiv zu erfassen, insbesondere &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;-Anweisungen werden häufig als weniger komplex angesehen, als ihre Komplexitätszahl vermuten lässt. So kann im folgenden Beispiel von Unübersichtlichkeit für Menschen keine Rede sein, jedoch erreicht es mit einer Komplexitätszahl von 8 einen recht hohen Wert.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
const String wochentagsname(const int nummer)&lt;br /&gt;
{&lt;br /&gt;
  switch (nummer)&lt;br /&gt;
  {&lt;br /&gt;
    case 1: return &amp;quot;Montag&amp;quot;;&lt;br /&gt;
    case 2: return &amp;quot;Dienstag&amp;quot;;&lt;br /&gt;
    case 3: return &amp;quot;Mittwoch&amp;quot;;&lt;br /&gt;
    case 4: return &amp;quot;Donnerstag&amp;quot;;&lt;br /&gt;
    case 5: return &amp;quot;Freitag&amp;quot;;&lt;br /&gt;
    case 6: return &amp;quot;Samstag&amp;quot;;&lt;br /&gt;
    case 7: return &amp;quot;Sonntag&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  return &amp;quot;(unbekannter Wochentag)&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Praxis wird die &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;-Konstruktion häufig für Nachschlageaufgaben dieser Art eingesetzt. Die Funktion &amp;quot;wochentagsname&amp;quot; umfasst acht Kontrollflusspfade und acht Ausstiegspunkte, hat entsprechend eine hohe Komplexitätszahl von 8 und ist trotzdem vom Menschen leicht zu überblicken. Dennoch birgt die Konstruktion Gefahren, nämlich die Möglichkeit in einzelne Case-Anweisungen [[Wirkung (Informatik)|Nebenwirkungen]] einzubauen.&lt;br /&gt;
&lt;br /&gt;
Die folgende Implementierung des gleichen Beispiels hat eine erheblich niedrigere Komplexität, weil keine Nebenwirkungen für die acht Fälle programmiert werden können, die jeweils eine eigene Rückgabeanweisung haben und die zudem untereinander nicht getrennt sind:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
const String wochentagsname(const int nummer)&lt;br /&gt;
{&lt;br /&gt;
  string[] tage = new string[]&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;Montag&amp;quot;,&lt;br /&gt;
    &amp;quot;Dienstag&amp;quot;,&lt;br /&gt;
    &amp;quot;Mittwoch&amp;quot;,&lt;br /&gt;
    &amp;quot;Donnerstag&amp;quot;,&lt;br /&gt;
    &amp;quot;Freitag&amp;quot;,&lt;br /&gt;
    &amp;quot;Samstag&amp;quot;,&lt;br /&gt;
    &amp;quot;Sonntag&amp;quot;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  String ergebnis = &amp;quot;(unbekannter Wochentag)&amp;quot;;&lt;br /&gt;
  if ((nummer &amp;gt;= 1) &amp;amp;&amp;amp; (nummer &amp;lt;= sizeof (tage)))&lt;br /&gt;
  {&lt;br /&gt;
    ergebnis = tage[nummer - 1];&lt;br /&gt;
  }&lt;br /&gt;
  return ergebnis;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Allerdings enthält der umstrukturierte Code mehr fehlerträchtige Stellen (Nutzen des Operators &amp;#039;&amp;#039;sizeof&amp;#039;&amp;#039;, Bereichsprüfung für Datenfeld &amp;#039;&amp;#039;tage&amp;#039;&amp;#039; und explizite Berechnung des Indexes).&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* Thomas J. McCabe: &amp;#039;&amp;#039;A Complexity Measure.&amp;#039;&amp;#039; In: &amp;#039;&amp;#039;IEEE Transactions on Software Engineering&amp;#039;&amp;#039;, Band SE-2, 1976, S. 308–320.&lt;br /&gt;
* [[Helmut Balzert]]: &amp;#039;&amp;#039;Lehrbuch der Software-Technik; Software-Management, Software-Qualitätssicherung, Unternehmensmodellierung&amp;#039;&amp;#039;. S.&amp;amp;nbsp;481–482.&lt;br /&gt;
*Christof Ebert, James Cain: Cyclomatic Complexity. In: IEEE Software, 33(6), 2016, S. 27–29.&amp;lt;ref name=&amp;quot;:0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[Kontrollflussorientierte Testverfahren]]&lt;br /&gt;
* [[Softwaremetrik]]&lt;br /&gt;
* [[Softwarequalität]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* Thomas J. McCabe [http://www.literateprogramming.com/mccabe.pdf A &amp;#039;&amp;#039;Complexity Measure&amp;#039;&amp;#039;.] (PDF; 1,68 MB) 1976&lt;br /&gt;
* [https://www.verifysoft.com/de_cmtpp_mscoder.pdf Berechnung der McCabe-Metrik (Beispielprojekt)] (PDF; 0,74 MB)&lt;br /&gt;
* [https://www.verifysoft.com/de_mccabe_metrics.html Messung von McCabe-Metriken]&lt;br /&gt;
* [https://web.archive.org/web/20230203195937/https://www.cqse.eu/en/news/blog/mccabe-cyclomatic-complexity//  &amp;#039;&amp;#039;McCabe’s Cyclomatic Complexity and Why We Don’t Use It&amp;#039;&amp;#039;.]&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Qualitätsmanagement (Softwaretechnik)]]&lt;br /&gt;
[[Kategorie:Software-Metrik]]&lt;/div&gt;</summary>
		<author><name>imported&gt;SchlurcherBot</name></author>
	</entry>
</feed>