Einige Bemerkungen dazu, die ich untätig schreibe ...
Speziell für die Wikipedia-Gleichung von M = E - N + 2P
Diese Gleichung ist sehr falsch .
Aus irgendeinem Grund verwendet McCabe es zwar in seiner Originalarbeit ("A Complexity Measure", IEEE Transactions on Software Engineering, Vo .. SE-2, Nr. 4, Dezember 1976), jedoch ohne es zu rechtfertigen und nachdem er tatsächlich das Richtige zitiert hat Formel auf der ersten Seite, die ist
v (G) = e - v + p
(Hier wurden die Formelelemente neu beschriftet)
Insbesondere verweist McCabe auf das Buch C.Berge, Graphs and Hypergraphs (im Folgenden als G & HG abgekürzt). Direkt aus diesem Buch :
Definition (Seite 27 unten in G & HG):
Die zyklomatische Zahl v (G) eines (ungerichteten) Graphen G (der mehrere getrennte Komponenten haben kann) ist definiert als:
v (G) = e - v + p
Dabei ist e = Anzahl der Kanten, v = Anzahl der Eckpunkte, p = Anzahl der verbundenen Komponenten
Satz (Seite 29 oben in G & HG) (nicht von McCabe verwendet):
Die zyklomatische Zahl v (G) eines Graphen G ist gleich der maximalen Anzahl unabhängiger Zyklen
Ein Zyklus ist eine Folge von Scheitelpunkten, die am gleichen Scheitelpunkt beginnen und enden, wobei jeweils zwei aufeinanderfolgende Scheitelpunkte in der Folge im Diagramm nebeneinander liegen.
Intuitiv eine Reihe von Zyklen ist unabhängig , wenn keine der Zyklen kann durch Überlagerung der von den anderen Bereichen ausgebildet sein.
Satz (Seite 29 Mitte von G & HG) (wie von McCabe verwendet):
In einem stark verbundenen Graphen G ist die zyklomatische Zahl gleich der maximalen Anzahl linear unabhängiger Schaltungen.
Eine Schaltung ist ein Zyklus, bei dem keine Wiederholungen von Eckpunkten und Kanten zulässig sind.
Ein gerichteter Graph wird als stark verbunden bezeichnet, wenn jeder Scheitelpunkt von jedem anderen Scheitelpunkt aus erreichbar ist, indem die Kanten in der angegebenen Richtung durchlaufen werden.
Beachten Sie, dass wir hier von ungerichteten Graphen zu stark verbundenen Graphen übergegangen sind (die gerichtet sind ... Berge macht dies nicht ganz klar).
McCabe wendet nun den obigen Satz an, um einen einfachen Weg abzuleiten, um eine "McCabe Cyclomatic Complexity Number" (CCN) folgendermaßen zu berechnen:
Bei einem gerichteten Graphen, der die "Sprungtopologie" einer Prozedur darstellt (der Befehlsflussgraph), wobei ein bestimmter Scheitelpunkt den eindeutigen Eintrittspunkt und ein bestimmter Scheitelpunkt den eindeutigen Austrittspunkt darstellt (der Austrittspunktscheitelpunkt muss möglicherweise "konstruiert" werden). Erstellen Sie ein stark verbundenes Diagramm, indem Sie eine gerichtete Kante vom Austrittspunktscheitelpunkt zum Eintrittspunktscheitelpunkt hinzufügen, um den Eintrittspunktscheitelpunkt von jedem anderen Scheitelpunkt aus erreichbar zu machen.
McCabe geht nun davon aus (ziemlich verwirrend, könnte ich sagen), dass die zyklomatische Zahl des modifizierten Befehlsflussgraphen "unserer intuitiven Vorstellung von 'minimaler Anzahl von Pfaden' entspricht", und deshalb werden wir diese Zahl als Komplexitätsmaß verwenden.
Cool, also:
Die zyklomatische Komplexitätszahl des modifizierten Befehlsflussgraphen kann durch Zählen der "kleinsten" Schaltungen in dem ungerichteten Graphen bestimmt werden. Dies ist für Mensch oder Maschine nicht besonders schwierig, aber die Anwendung des obigen Theorems gibt uns eine noch einfachere Möglichkeit, es zu bestimmen:
v (G) = e - v + p
wenn man die Richtwirkung der Kanten außer Acht lässt.
In allen Fällen betrachten wir nur eine einzelne Prozedur, sodass im gesamten Diagramm nur eine verbundene Komponente vorhanden ist.
v (G) = e - v + 1.
Wenn man das ursprüngliche Diagramm ohne die hinzugefügte "Exit-to-Entry" -Kante betrachtet , erhält man einfach:
ṽ (G) = ẽ - v + 2
als ẽ = e - 1
Lassen Sie uns anhand des Beispiels von McCabe aus seiner Arbeit veranschaulichen:
Hier haben wir:
- e = 10
- v = 6
- p = 1 (eine Komponente)
- v (G) = 5 (wir zählen eindeutig 5 Zyklen)
Die Formel für die zyklomatische Zahl lautet:
v (G) = e - v + p
was 5 = 10 - 6 + 1 ergibt und so richtig!
Die "McCabe Cyclomatic Complexity Number", wie in seiner Arbeit angegeben, ist
5 = 9 - 6 + 2 (in der Arbeit werden keine weiteren Erklärungen dazu gegeben, wie)
was zufällig richtig ist (es ergibt v (G)), aber aus den falschen Gründen, dh wir verwenden:
ṽ (G) = ẽ - v + 2
und damit ṽ (G) = v (G) ... Puh!
Aber ist diese Maßnahme gut?
In zwei Worten: Nicht sehr
- Es ist nicht ganz klar, wie das "Anweisungsflussdiagramm" einer Prozedur erstellt werden soll, insbesondere wenn Ausnahmebehandlung und Rekursion ins Bild treten. Beachten Sie, dass McCabe seine Idee auf Code angewendet hat, der in FORTRAN 66 geschrieben wurde , einer Sprache ohne Rekursion, ohne Ausnahmen und mit einer einfachen Ausführungsstruktur.
- Die Tatsache, dass eine Prozedur mit einer Entscheidung und eine Prozedur mit einer Schleife dieselbe CCN ergeben, ist kein gutes Zeichen.
- Noch weniger gut ist die Tatsache, dass
for
Schleifen und while
Schleifen auf die gleiche Weise behandelt werden (beachten Sie, dass man in C das missbrauchen kann for
, um a while
auf andere Weise auszudrücken ; hier spreche ich von der strengen for (int i=0;i<const_val;i++)
Schleife). Wir wissen aus der theoretischen Informatik , dass diese beiden Konstrukte Ausbeuten völlig unterschiedliche Rechen Kräfte: primitiv-rekursiven Funktionen , wenn Sie sind ausgestattet mit for
, teilweise μ-rekursiven Funktionen , wenn Sie sind ausgestattet mit while
.
- Ein Experiment Experten mit beurteilen die Komplexität des Codes zeigt , dass CCN nicht die Idee der „Komplexität des Codes“ sowie anderer Maßnahmen nicht erfassen, insbesondere Halsteads Software Wissenschaft und Shao und Wangs kognitive Funktionsgröße (wobei letztere offenbar der Sieger), siehe Anwendbarkeit von drei Metriken für die kognitive Komplexität, Internationale Konferenz 2012 über Fortschritte in der IKT für Schwellenländer, 12.-15. Dezember 2012
- Die empirische Überprüfung zeigt, dass CCN (zumindest für ausgereiften Code) stark linear mit LOC (Codezeilen) korreliert ist, dh, der CCN nimmt natürlich mit der Länge des Verfahrens zu, und Sie können die LOC-Anzahl auch verwenden, um die Komplexität auszudrücken. Ein besseres Maß als das absolute CCN könnte CCN / LOC sein. Siehe insbesondere: Zyklomatische Komplexitätsmetriken überarbeitet - DSpace @ MIT und Die Rolle des Empirismus bei der Verbesserung der Zuverlässigkeit zukünftiger Software