[GUIDA] Testare la Complessità Ciclomatica Massima per gli Homework

Alessio Natalucci (3660 points)
5 10 23
asked Oct 29, 2020 in Programmare in Python by Alessio Natalucci (3,660 points)
edited Dec 2, 2020 by Alessio Natalucci

"Cyclomatic Complexity corresponds to the number of decisions a block of code contains plus 1. This number (also called McCabe number) is equal to the number of linearly independent paths through the code. This number can be used as a guide when testing conditional logic in blocks."

La complessità ciclomatica corrisponde al numero di decisioni che un blocco di codice contiene, più 1 (vedi schema in fondo alla pagina). Questo numero (chiamato anche numero McCabe) è uguale al numero di percorsi linearmente indipendenti attraverso il codice. Questo numero può essere utilizzato come guida durante il test della logica condizionale nei blocchi.

È possibile calcolare la Complessità Ciclomatica Massima senza caricare il programma su Q2A (risparmiando così del tempo).

Per farlo bisognerà installare attraverso Anaconda Prompt il pacchetto "Radon" (soltanto la prima volta):  

conda install -c conda-forge radon

Dopodichè ogni volta che si vorrà testare il programma basterà lanciare il comando sempre su Anaconda Prompt:

radon cc -a -s --show-closures program01.py

(Assicurarsi di aver salvato prima di eseguirlo)

 Il comando ritornerà una schermata simile a questa:

Per capire cosa significa:

  • La lettera viola indica se si tratta di una Funzione, una Classe o un Metodo:

 

  • Il numero indica il valore della CC mentre la lettera in verde il punteggio della funzione in termini di qualità del codice:

(Per gli Homework non bisogna considerare la Complessità Ciclomatica Media (in questo caso 4) ma la Complessità Ciclomatica Massima, rappresentata dalla funzione con la CC massima (nell'esempio la prima e la seconda funzione a parità di valore, 5)

  • Di seguito invece una tabella per comprendere meglio come e da cosa viene influenzata la Complessità Ciclomatica:

Link alla documentazione: https://radon.readthedocs.io/en/latest/index.html

10 Answers

raponi.federico (11240 points)
2 4 21
answered Oct 29, 2020 by raponi.federico (11,240 points)
Molto utile, Grazie!
9
9Andrea9 (12340 points)
10 31 56
answered Oct 29, 2020 by 9Andrea9 (12,340 points)
Dunque conviene sempre sostituire i cicli for nel programma principale con delle chiamate alle funzioni in cui farli, per avere il minimo di complessità ciclomatica
Alessio Natalucci (3660 points)
5 10 23
commented Oct 29, 2020 by Alessio Natalucci (3,660 points)
Esatto, inserendo cicli ampi/complessi all'interno di funzioni esterne (che richiami poi da quella principale) ti permette di abbassare (e non di poco, almeno per me) la CC del codice. Ho riscontrato però che troppe funzioni rischiano di rallentare i tempi (non so se sia una cosa universale e sempre così oppure sia per via della struttura del mio codice). Se c'è qualcuno che possa smentire o confermare sarebbe ottimo
Romitoskj (8920 points)
4 8 40
answered Oct 29, 2020 by Romitoskj (8,920 points)
Anche il not (!=) aumenta la complessità come l'and o l'or?

Perché guardando il mio codice dovrei avere 4 ma ho 5, se contassi anche il not allora corrisponderebbe.
Alessio Natalucci (3660 points)
5 10 23
commented Oct 29, 2020 by Alessio Natalucci (3,660 points)
Da quanto c'è scritto qui anche il NOT fa parte dei Boolean Operator

https://thomas-cokelaer.info/tutorials/python/boolean.html
Romitoskj (8920 points)
4 8 40
commented Oct 29, 2020 by Romitoskj (8,920 points)
Ho visto, ho provato a toglierlo comunque ma rimane 5... non so cosa possa essere quel punto in più.

Ho solo un while con un and nella condizione e due if, quindi dovrebbe essere 4.
e
e.pauroso (420 points)
0 0 4
commented Oct 29, 2020 by e.pauroso (420 points)
la complessità parte dal valore 1,

quindi tu hai 4 elementi (while, l'operatore AND e due if) che portano la complessità della funzione a 5
Romitoskj (8920 points)
4 8 40
commented Oct 29, 2020 by Romitoskj (8,920 points)
Ah ok, pensavo partisse da 0. Grazie mille!
1
1937764 (3520 points)
6 14 42
answered Oct 29, 2020 by 1937764 (3,520 points)
Utilissimo, soprattutto per le spiegazioni di come è effettuato il calcolo e il link alla guida completa!
giordano_sannino (13650 points)
7 16 81
answered Oct 29, 2020 by giordano_sannino (13,650 points)
Grazie utilissimo
alessiodellasanta (11830 points)
7 13 34
answered Oct 29, 2020 by alessiodellasanta (11,830 points)
ottimo post anche questo, molto bravo
andrea_25 (6070 points)
2 2 24
answered Nov 3, 2020 by andrea_25 (6,070 points)
Grazie mille, è davvero molto chiaro
Romitoskj (8920 points)
4 8 40
answered Nov 11, 2020 by Romitoskj (8,920 points)

Non capisco perché ma il with non mi viene contato... è un bene ovviamentelaugh

Qualcuno ha riscontrato la stessa cosa? Mi sembra strano dato che nella documentazione sta scritto che incrementa la cc di uno.

O
Oakandrew (6400 points)
4 26 63
commented Nov 11, 2020 by Oakandrew (6,400 points)

Probabilmente non hanno aggiornato la documentazione, ma qui potresti vedere perche with è diventato 0 in radon:

https://github.com/rubik/radon/issues/123

Romitoskj (8920 points)
4 8 40
commented Nov 11, 2020 by Romitoskj (8,920 points)
Grazie mille, ora gli do uno sguardo.
A
Alessandro Vecchi (1870 points)
1 10 18
answered Nov 12, 2020 by Alessandro Vecchi (1,870 points)
Ottimo post, bravo. Se posso chiedere, cosa vuol dire il numero subito dopo la F in viola?
Romitoskj (8920 points)
4 8 40
commented Nov 12, 2020 by Romitoskj (8,920 points)
C'è scritto nel post, indica che il blocco di cui è stata calcolata la complessità è una funzione.
A
Alessandro Vecchi (1870 points)
1 10 18
commented Nov 12, 2020 by Alessandro Vecchi (1,870 points)
il numero dopo la f... non la f
A
Alessandro Vecchi (1870 points)
1 10 18
commented Nov 12, 2020 by Alessandro Vecchi (1,870 points)
tipo 104:0 nella prima riga
Romitoskj (8920 points)
4 8 40
commented Nov 12, 2020 by Romitoskj (8,920 points)

Ah sorry, era l'una di notte ed avevo appena finito l'hwfrown

Il primo numero indica la riga in cui è stata definita la funzione, il secondo non lo so, avevo pensato la colonna ma non potrebbe essere 0.

S
Silktrader (2550 points)
1 6 16
commented Nov 12, 2020 by Silktrader (2,550 points)
Si tratta del "maintainability index", una misura che approssima la facilità di comprensione, espansione, modifica del codice. Idealmente vorresti che quell'indice fosse più alto possibile.

Gli indici sono determinati dal numero di linee di codice, di statements, di operandi, di operatori, di commenti, etc.

Non gli darei troppa importanza, non sostituisce un'analisi qualitativa del codice. Se tu volessi aumentare il "maintainability index", senza toccare linee di codice, potresti descrivere ogni statement con un commento, fino a 100% di copertura.
O
Oakandrew (6400 points)
4 26 63
answered Nov 14, 2020 by Oakandrew (6,400 points)
è utilissimo, ma potresti cambiare "NOMEPROGRAMMA.py"a "program01.py"
Alessio Natalucci (3660 points)
5 10 23
commented Dec 2, 2020 by Alessio Natalucci (3,660 points)
Fatto (con un po' di ritardo) :)