Please ignore secret bonuses. Secret tests do NOT award bonus. Max hw grade is 30+2 bonus efficiency

Do you need help?

Notice Board

Per partecipare al corso di Fondamenti di programmazione 2023-24 loggatevi e attivatelo nella vostra pagina dei corsi preferiti. A quel punto il corso appare nel menù personale cliccando sul proprio avatar. Per i materiali degli anni precedenti seguite lo stesso metodo.

To join the Programming/Lab 2023-24 course, log-on and select it on the my courses page. It will appear on the personal menu of your avatar. For earlier years use the same method.

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

Alessio Natalucci (3660 points)
7 10 23
in Programmare in Python by (3.7k points)
edited by

"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 (11280 points)
3 4 21
by (11.3k points)
Molto utile, Grazie!
9
9Andrea9 (12340 points)
12 32 56
by (12.3k 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)
7 10 23
by (3.7k 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)
5 8 40
by (8.9k 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)
7 10 23
by (3.7k 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)
5 8 40
by (8.9k 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
by (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)
5 8 40
by (8.9k points)
Ah ok, pensavo partisse da 0. Grazie mille!
1
1937764 (3520 points)
7 14 42
by (3.5k points)
Utilissimo, soprattutto per le spiegazioni di come è effettuato il calcolo e il link alla guida completa!
giordano_sannino (13650 points)
7 16 81
by (13.7k points)
Grazie utilissimo
alessiodellasanta (11830 points)
8 14 34
by (11.8k points)
ottimo post anche questo, molto bravo
andrea_25 (6070 points)
2 2 24
by (6.1k points)
Grazie mille, è davvero molto chiaro
Romitoskj (8920 points)
5 8 40
by (8.9k 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)
7 27 64
by (6.4k 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)
5 8 40
by (8.9k points)
Grazie mille, ora gli do uno sguardo.
A
Alessandro Vecchi (1870 points)
1 10 18
by (1.9k points)
Ottimo post, bravo. Se posso chiedere, cosa vuol dire il numero subito dopo la F in viola?
Romitoskj (8920 points)
5 8 40
by (8.9k 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
by (1.9k points)
il numero dopo la f... non la f
A
Alessandro Vecchi (1870 points)
1 10 18
by (1.9k points)
tipo 104:0 nella prima riga
Romitoskj (8920 points)
5 8 40
by (8.9k 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)
2 6 16
by (2.6k 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)
7 27 64
by (6.4k points)
è utilissimo, ma potresti cambiare "NOMEPROGRAMMA.py"a "program01.py"
Alessio Natalucci (3660 points)
7 10 23
by (3.7k points)
Fatto (con un po' di ritardo) :)