Come calcolare complessità ciclomatica di uno switch?

di surfernet il
19 risposte
Ciao a tutti , stavo leggendo su wikipedia la voce complessità ciclomatica (),dice che si può calcolare anche contando i predicati ,con la formula n + 1 , dove n è il numero dei punti decisionali (ovvero if,for,while) ma uno "switch" ad esempio vale quanti sono i suoi "case"? ed un "if elseif" vale 2? , grazie per un a vostra risposta,ciao

19 Risposte

  • Banale, converti lo switch in if e fal il calcolo di conseguenza: vale il numero di "case"
    l'elseif e' un modo compatto di scrivere "else if".

    Dalla definizione in wikipedia, l'ELSE dell'IF e il DEFAULT dello SWITCH non contano!
  • Quindi "if elseif" vale 2?
  • Sono DUE if, quindi 2!
  • Secondo voi la nidificazione delle istruzioni non cambia il calcolo della complessità ciclomatica?
  • No
  • Grazie
  • 3 e' sbagliato! E' 2!

    Bisogna contare il numero di rami del codice, ed un if ne ha 2, non 3.
  • Ciao migliorabile, ti ringrazio per il suggerimento ,ho trovato un documento interessante :

    https://web.archive.org/web/20120419143103/http://hissa.nist.gov/HHRFdata/Artifacts/ITLdoc/235/chapter4.htm#449165

    la figura 4.4 sembra interessante ,nell'esempio di microsoft credo sia l' or a contare uno oltre all'if ed oltre all'uno che và aggiunto agli n punti decisionali ,
    se hai qualche opinione od osservazione spero tu possa comunicarle,ciao
  • surfernet ha scritto:


    Qui https://docs.microsoft.com/it-it/visualstudio/code-quality/ca1502?view=vs-2019 un if viene dato con complessità 3 anche se contiene solo un if ,allora contano anche le condizioni dell'if e come sono legate? ,se if vale 1 e per il totale bisogna sommare 1 io avrei 2 e non tre... ?
    È giusto 3. Sono gli if del linguaggio macchina non dei linguaggi ad alto livello.

    Da Wikipedia inglese:
    McCabe showed that the cyclomatic complexity of any structured program with only one entry point and one exit point is equal to the number of decision points (i.e., "if" statements or conditional loops) contained in that program plus one. However, this is true only for decision points counted at the lowest, machine-level instructions. Decisions involving compound predicates like those found in high-level languages like IF cond1 AND cond2 THEN ... should be counted in terms of predicate variables involved, i.e. in this example one should count two decision points, because at machine level it is equivalent to IF cond1 THEN IF cond2 THEN ...
  • E' una questione "filosofica"!

    Non ha molto senso considerare la rappresentazione a basso livello della condizione, cioe' contare gli AND/OR.

    Wikipedia a' un buon punto di partenza, ma NON E' LA BIBBIA!

    I motivi sono ""banali"":

    1) AND e OR sono DUE possibili funzion booleane, ma non sono le uniche, c'e' lo XOR, ad esempio, le costanti, ecc Ci sono 16 POSSIBILI funzioni booleane a 2 valori
    2) SE la condizione viene spostata in una funzione separata, OPPURE viene calcolata PRIMA dell'IF e poi assegnata ad una variabile booleana, ed il test viene fatto sulla variabile, CAMBIA la complessita' ciclomatica! Ma non ha senso, perche' il codice e' SEMPRE LO STESSO solo scritto in modo leggermente diverso..


    Bisogna tenere presente un paio di cose:

    1) il teorico ragiona in termini assoluti e fa degli esempi mooolto semplici
    2) la pratica deve fare i conti con la realta', con codice scritto con i ""piedi"" , e deve essere ragionevolmente ""stabile""
    3) i valori di complessita' non sono assoluti, ma vanno ""contestualizzati"" e poi confrontati NON per valore assoluto, ma, in generale, come ""rapporto"".

    Ovviamente, per poter fare i confronti, bisogna usare sempre la stessa definizione.

    Ci sono tool che calcolano la complessita ciclomatica di codice java

    https://stackoverflow.com/questions/30005793/java-tool-for-calculating-cyclomatic-complexity

    Diversi tool NON danno gli stessi ESATTI valori. Ma non e' importante, perche' basta che i valori siano ""confrontabili"" quando si usa sempre lo stesso tool.
  • >>>Ci sono tool che calcolano la complessita ciclomatica di codice java
    ci sono,che voi sappiate, dei tool opensource che per c# effettuino il calcolo della complessità ciclomatica ? ,grazie,ciao
  • @migliorabile

    Non è una questione filosofica. La definizione deve essere consistente logicamente, altrimenti non serve a nulla. Ti pare mai che possa dipendere da come gli gira al programmatore? Allora basta mettere un miliardo di condizioni in riga anziché in colonna e per magia la complessità scompare?
  • Mi è venuto un dubbio ,gli operatori di confronto (>,<,etc.etc.) valgono come punti decisionali? , io direi di no ,a favore di questa ipotesi c'è l'esempio https://web.archive.org/web/20120419143103/http://hissa.nist.gov/HHRFdata/Artifacts/ITLdoc/235/chapter4.htm#449165 ,figura 4.4 ,
    ho fatto una lista iniziale di istruzioni ed operatori che siano punti decisionali:
    
    public class InUtil
        {
            List<string> listaPuntiDecisionali = new List<string>();
            public InUtil()
            {            
                listaPuntiDecisionali.Add("if");
                listaPuntiDecisionali.Add("while");
                listaPuntiDecisionali.Add("for");
                listaPuntiDecisionali.Add("do");
                listaPuntiDecisionali.Add("foreach");
                listaPuntiDecisionali.Add("switch");
                listaPuntiDecisionali.Add("elseif");
    
                listaPuntiDecisionali.Add("&&");
                listaPuntiDecisionali.Add("||");
                listaPuntiDecisionali.Add("&");
                listaPuntiDecisionali.Add("|");
            }
        }
    
    attendo la vostra opinione,grazie,ciao
Devi accedere o registrarti per scrivere nel forum
19 risposte