2015-05-14 11 views
5

Ich bin verwirrend über die CC der switch-Anweisungzyklomatische Komplexität von Schalt case-Anweisung

Wenn ich folgenden Code haben:

if (n >= 0) { 
    switch(n) { 
     case 0: 
     case 1: 
      printf("zero or one\n"); 
      break; 
     case 2: 
      printf("two\n"); 
      break; 
     case 3: 
     case 4: 
      printf("three or four\n"); 
      break; 
     } 
    } 
else { 
    printf ("negative\n"); 
} 

was ist der CC?

Ich fand a post sagte, dass es 5 ist, mit diesem Diagramm CC diagram

(die Ränder 17 sind, nicht 16, ich denke, es ist ein Tippfehler)

Er sagt, dass wir müssen nur Fall Anzahl 0 und Fall 1 als ein

Aber ich denke, sollte das Diagramm sein: CC diagram

Kanten: 17,
Knoten: 13,
17-13 + 2P = 6

zähle ich alle Fälle als 1

Mein OOSE Professor sagte, es ist 6, aber in anderer Weise

Er sagte:

init  => 1 
if  => 1 
switch => 1 
case 0 1 => 1 
case 2 => 1 
case 3 4 => 1 

so sollte es sein 6

Was ist die richtige Antwort?
Ich bin wirklich verwirrt, danke.


bearbeitet:
Jetzt denke ich, es ist. ja, 7
Weil, wenn n mehr als 5 ist, wird nichts tun und die switch-Anweisung beenden.

dann bekommen wir dieses Diagramm:
enter image description here

jetzt E = 18
18 - 13 + 2 =

bin ich richtig ..?
wirklich, wirklich, wirklich verwirrt ...

Antwort

2

Code metrische Werkzeuge, mit denen ich gearbeitet habe, zählen jeden Fall als eine separate Branche, auch wenn es ein Fall durch Fall ist.

Aber das ist eine willkürliche Wahl. Code-Metrik-Tools neigen dazu, standardmäßig auf der Seite der Vorsicht zu bleiben. Die Art und Weise, wie die switch-Anweisung letztendlich ausgewertet wird, ist ein internes Implementierungsdetail, das basierend auf der Art der Eingabe und der Anzahl der Fälle (zumindest in C#) variiert.

Die erste Antwort zur Reduzierung der zyklomatischen Komplexität durch Schalteranweisungen ist die Umwandlung der Fälle/Ausgaben in ein Wörterbuch. In Ihrem Beispiel wäre es so etwas wie das Codebeispiel unten. Beachten Sie, dass dies nur für die Lesbarkeit/Wartbarkeit gilt.Wenn Ihre switch-Anweisung lang genug ist, wird der .NET-Compiler sie automatisch in ein Wörterbuch für Sie konvertieren, so dass es keinen Leistungsgewinn gibt.

var outputs = new Dictionary<int, string>() 
      { 
       { 0, "zero or one\n" }, 
       { 1, "zero or one\n" }, 
       { 2, "two\n" }, 
       { 3, "three or four\n" }, 
       { 4, "three or four\n" } 
      }; 

if (n >= 0) 
{ 
    printf(outputs[n]); 
} 
+0

Danke für deine Antwort. Ich lerne etwas über Cyclomatic Complexity und möchte nur wissen, wie ich es berechnen kann. – CodinCat