Domanda

Mi sono divertito a misurare la complessità ciclomatica di una grande base di codice.

La complessità ciclomatica è il numero di percorsi linearmente indipendenti attraverso il codice sorgente di un programma e ci sono molti strumenti gratuiti per il tuo linguaggio preferito.

I risultati sono interessanti ma non sorprendenti.Cioè, le parti che so essere le più pelose erano in realtà le più complesse (con un punteggio > 50).Ma ciò che trovo utile è che a ciascun metodo viene assegnato un numero di "cattiveria" concreto come qualcosa a cui posso indicare quando decido da dove iniziare il refactoring.

Usi la complessità ciclomatica?Qual è la parte di codice più complessa che hai trovato?

È stato utile?

Soluzione

Effettuiamo il refactoring senza pietà e utilizziamo la complessità ciclomatica come uno dei parametri che inserisce il codice nella nostra "lista dei risultati".1-6 non segnaliamo la complessità (anche se potrebbe essere messo in discussione per altri motivi), 7-9 è discutibile e si presume che qualsiasi metodo superiore a 10 sia negativo se non dimostrato diversamente.

Il peggiore che abbiamo visto è stato 87 da una mostruosa catena if-else-if in un codice legacy di cui abbiamo dovuto prendere il controllo.

Altri suggerimenti

In realtà, la complessità ciclomatica può essere utilizzata oltre le sole soglie a livello di metodo.Per cominciare, un metodo grande con elevata complessità può essere suddiviso in diversi metodi piccoli con complessità inferiore.Ma ha davvero migliorato la base di codice?Certo, potresti ottenere una leggibilità leggermente migliore con tutti quei nomi di metodi.Ma la logica condizionale totale non è cambiata.E la logica condizionale totale può spesso essere ridotta di sostituendo i condizionali con il polimorfismo.

Abbiamo bisogno di una metrica che non diventi verde attraverso la mera scomposizione del metodo.Lo chiamo così CC100.

CC100 = 100 * (Complessità ciclomatica totale della base di codice) / (Righe di codice totali)

Mi è utile nello stesso modo in cui è utile la O grande:So di cosa si tratta e posso usarlo per avere un'idea viscerale se un metodo è buono o cattivo, ma non ho bisogno di calcolarlo per ogni funzione che ho scritto.

Penso che parametri più semplici, come LOC, siano almeno altrettanto validi nella maggior parte dei casi.Se una funzione non sta in uno schermo, quasi non importa quanto sia semplice.Se una funzione accetta 20 parametri e crea 40 variabili locali, non importa se la sua complessità ciclomatica è 1.

Recentemente abbiamo iniziato ad usarlo.Usiamo NDepend per eseguire alcune analisi statiche del codice e misura la complessità ciclomatica.Sono d'accordo, è un modo decente per identificare i metodi per il refactoring.

Purtroppo, abbiamo riscontrato numeri superiori a 200 per alcuni metodi creati dai nostri sviluppatori offshore.

Fino a quando non esiste uno strumento che possa funzionare bene con i modelli C++ e le tecniche di metaprogrammazione, non è di grande aiuto nella mia situazione.Comunque ricordatelo e basta

"Non tutte le cose che contano possono essere misurate e non tutte le cose che possono essere misurate conteggi" Einstein

Ricorda quindi di passare qualsiasi informazione di questo tipo anche attraverso il filtraggio umano.

Riconoscerai la complessità quando la vedrai.La cosa principale per cui questo tipo di strumento è utile è contrassegnare le parti del codice che sfuggivano alla tua attenzione.

Misuro spesso la complessità ciclomatica del mio codice.Ho scoperto che mi aiuta a individuare aree di codice che stanno facendo troppo.Avere uno strumento che indichi i punti caldi nel mio codice richiede molto meno tempo che dover leggere migliaia di righe di codice cercando di capire quali metodi non seguono l'SRP.

Tuttavia, ho scoperto che quando eseguo un'analisi della complessità ciclomatica sul codice di altre persone, di solito porta a sentimenti di frustrazione, angoscia e rabbia generale quando trovo codice con complessità ciclomatica nell'ordine di 100.Cosa spinge le persone a scrivere metodi che contengono diverse migliaia di righe di codice?!

È ottimo per aiutare a identificare i candidati per il refactoring, ma è importante mantenere il tuo giudizio in giro.Supporterei le gamme di kenj0418 per le guide alla potatura.

Esiste una metrica Java chiamata CRAP4J che combina empiricamente la complessità ciclomatica e la copertura del test JUnit per ottenere un'unica metrica.Ha fatto ricerche per cercare di migliorare la sua formula empirica.Non sono sicuro di quanto sia diffuso.

Non lo uso da un po', ma in un progetto precedente mi ha davvero aiutato a identificare potenziali punti problematici nel codice di qualcun altro (non sarebbe mio ovviamente!)

Dopo aver trovato l'area da controllare, ho subito riscontrato numerosi problemi (anche molti GOTO, ci crederesti!) Con la logica e alcuni codici WTF davvero strani.

La complessità ciclomatica è ottima per mostrare aree che probabilmente stanno facendo troppo e quindi infrangono la singola responsabilità principale.Idealmente, questi dovrebbero essere suddivisi in più funzioni

Temo che, per il linguaggio del progetto per il quale preferirei metriche come questa, LPC, non sono infatti disponibili molti strumenti gratuiti per produrlo.Quindi no, non mi è così utile.

+1 per i valori della lista dei risultati di kenj0418.

Il peggiore che ho visto è stato un 275.Ce n'erano un paio altri oltre 200 che siamo riusciti a rifattorizzare in CC molto più piccoli;erano ancora alti ma questo li ha spinti più indietro in linea.Non abbiamo avuto molta fortuna con la bestia 275: era (probabilmente lo è ancora) una rete di istruzioni if ​​e switch semplicemente troppo complesse.Il suo vero valore è solo un passo avanti quando si decide di ricostruire il sistema.

Le eccezioni al CC elevato con cui mi sentivo a mio agio erano le fabbriche;IMO, dovrebbero avere un CC elevato, ma solo se eseguono solo la semplice creazione e restituzione di oggetti.

Dopo comprensione cosa significa, ora ho iniziato a usarlo in "prova".Finora l'ho trovato utile, perché di solito un CC alto va di pari passo con il Anti-modello freccia, il che rende il codice più difficile da leggere e comprendere.Non ho ancora un numero fisso, ma NDepend avvisa per tutto ciò che è superiore a 5, il che sembra un buon inizio per indagare sui metodi.

Sì, lo usiamo e l'ho trovato utile anche io.Abbiamo una grande base di codice legacy da domare e abbiamo riscontrato un'elevata complessità ciclomatica allarmante.(387 in un metodo!).CC ti indirizza direttamente alle aree che vale la pena sottoporre a refactoring.Usiamo CCCC sul codice C++.

La complessità ciclomatica è solo una delle componenti di quella che potrebbe essere chiamata complessità fabbricata.Qualche tempo fa ho scritto un articolo per riassumere diverse dimensioni della complessità del codice:Combattere la complessità fabbricata

Gli strumenti sono necessari per essere efficienti nella gestione della complessità del codice.Lo strumento NDipende per il codice .NET ti consentirà di analizzare molte dimensioni della complessità del codice, comprese le metriche del codice come:Complessità ciclomatica, profondità di nidificazione, mancanza di coesione dei metodi, copertura dei test...

inclusa l'analisi delle dipendenze e inclusa una lingua (Linguaggio di interrogazione del codice) dedicato a chiedere cosa c'è di complesso nel mio codice e a scrivere la regola?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top