2015-05-14 11 views
5

io sono confuso circa la CC di istruzione switchcomplessità ciclomatica dell'interruttore istruzione case

Se ho seguente codice:

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"); 
} 

qual è la CC?

ho trovato a post detto che si tratta di 5, con questo schema CC diagram

(i bordi sono 17, non 16, penso che sia un errore di battitura)

Si dice che abbiamo solo bisogno di contare caso 0 e custodia 1 come uno

Ma penso diagramma dovrebbe essere: CC diagram

bordi: 17,
Nodi: 13,
17-13 + 2P = 6

io reputo tutti i casi come 1

Il mio professore OOSE ha detto che è 6, ma in modo diverso

Egli ha detto:

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

quindi dovrebbe essere 6

Qual è la risposta corretta?
Sono davvero confuso, grazie.


a cura:
Ora penso che sia . sì, 7
Perché se n è più di 5, non farà nulla e uscirà dall'istruzione switch.

allora riusciamo ad ottenere questo schema:
enter image description here

nuovamente nome = 18
18 - 13 + 2 =

Ho ragione ..?
davvero, davvero, davvero confuso ...

risposta

2

Strumenti metrici di codice Ho lavorato con contare ogni caso come un ramo separato, anche se è un caso di caduta.

Ma questa è una scelta arbitraria. Per impostazione predefinita, gli strumenti di metrica del codice tendono ad errare sul lato della cautela. Il modo in cui verrà valutata l'istruzione switch sarà un dettaglio di implementazione interno che varierà in base al tipo di input e al numero di casi (almeno in C#).

La risposta decisiva per ridurre la complessità ciclomatica causata dalle istruzioni switch è convertire i casi/uscite in un dizionario. Nel tuo esempio, sarebbe qualcosa di simile all'esempio di codice qui sotto. Essere consapevoli che questo è solo per leggibilità/manutenibilità.Se la tua istruzione switch è abbastanza lunga, il compilatore .Net lo convertirà automaticamente in un dizionario per te, quindi non ci sono guadagni in termini di prestazioni.

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

grazie per la tua risposta. Sto imparando sulla complessità ciclomatica e voglio solo sapere come calcolarlo. – CodinCat

Problemi correlati