Come calcolare esattamente la complessità ciclomatica?

6

La mia domanda riguarda più la trasformazione dal codice di programmazione al controllo del flusso grafico.

Dì, ho un pezzo di codice:

public class Contractor
{
    // other member fields... 
    private bool isVerified;
    private int noOfA;
    private int noOfB;

    // other member methods... 
    public int GetNumberOfDependents()
    {
        this.noOfB = this.noOfA;

        if (this.isVerified)
        {
            this.noOfB++;
        }

        if (this.noOfB > 4)
        {
            this.noOfB = 4;
        }

        return this.noOfB;
    }
}

Ho disegnato un diagramma di flusso come di seguito:

Etienipresentechenonhodisegnatounnodoperl'espressionecondizionaledell'istruzioneIF,perchénonpensochesiaun'comando'.

Secondo la pagina di Wikipedia su CC , la definizione di nodo è:

the nodes of the graph correspond to indivisible groups of commands of a program

E la formula è:

M = E − N + 2P

Quindi ho ottenuto il valore CC come 4.

Tuttavia, secondo la descrizione di questo link , ho ottenuto il suo valore CC come 3 .

C'è una discrepanza qui.

Inoltre, secondo la risposta di David Tonhofer alla domanda "Comprendere la complessità ciclopica" su Programmers.SE, il la formula in dovrebbe essere:

v(G) = e - v + p

Questa risposta non è riconosciuta da nessuno, la mia domanda è: il mio diagramma è corretto?

    
posta VincentZHANG 08.05.2016 - 08:31
fonte

3 risposte

2

Il diagramma di flusso può essere semplificato come:

[this.noOfB = this.noOfA;]
   |           \
   |            \
   |           [noOfB++]
   |            /
   |           /
[-----------------]
   |           \
   |            \
   |           [noOfB = 4]
   |            /
   |           /
[-----------------]

Questo dà 5 nodi, 6 lati e 1 componente connesso = > M = 6 - 5 + 2 * 1 = 3. In generale, la complessità ciclomatica viene solitamente calcolata utilizzando i grafici del flusso di controllo che hanno al massimo due bordi lasciando ciascun nodo.

    
risposta data 09.05.2016 - 02:56
fonte
-1

La soluzione più semplice a questa domanda è contare il numero di controlli di condizione nell'intero codice e quindi aggiungere 1 al risultato che porterà la complessità ciclomatica come output.

Soluzione Condizione 1: - se (this.isVerified) Condizione 2: - if (this.noOfB > 4)

Quindi il numero totale di predicati o condizioni è 2 e la formula è V (G) = N (P) + 1 = 2 + 1 Quindi la risposta è 3

    
risposta data 13.11.2017 - 06:45
fonte
-2

Una cosa che ti manca qui che aumenta sostanzialmente la complessità della funzione è che è una funzione membro che sta mutando lo stato dell'oggetto. Sembra che tu l'abbia modellato come se fossero solo normali variabili locali.

    
risposta data 08.05.2016 - 15:01
fonte

Leggi altre domande sui tag