Come calcolare la complessità ciclomatica per vuoti mentre se + si rompe?

1

Questo è strettamente correlato a questa domanda che richiede la complessità di quanto segue:

while (x > level)
    x = x – 1;
x = 0

Utilizzando il metodo grafico ha una complessità = 2. Fred Swartz indica un un modo più rapido di calcolare la complessità per Java / C # in base alle istruzioni effettive di queste lingue:

- Start with a count of one for the method.
- Add one for each of the following flow-related elements that are found in the method.
    Returns - Each return that isn't the last statement of a method.
    Selection - if, else, case, default.
    Loops - for, while, do-while, break, and continue.
    Operators - &&, ||, ?, and :
    Exceptions - catch, finally, throw, or throws clause.

Tuttavia, nonconvergent chiede come deve essere trattato if .. break . Quindi, sto pensando di riscrivere sopra il codice in questo modo:

while (true)
{
    if (x > level) 
        break;

    x = x – 1;
}
x = 0

Anche se questo è equivalente all'algoritmo iniziale, teoricamente aggiungerei una complessità di 2 ( if + break ).

Il mio sentimento è che if ... break debba contare come 1 e vuoto while s non dovrebbe contare affatto.

Domanda: come calcolare la complessità ciclomatica per vuoti mentre if + break?

    
posta Alexei 03.03.2018 - 07:55
fonte

1 risposta

1

Per prima cosa dovrei dire che in generale dovresti preferire non usare loop infiniti con un'interruzione interna. Sono molto più difficili da seguire per i lettori del tuo codice e possono causare problemi di manutenzione.

Detto questo, un while(true) non è un "vuoto mentre". Dal punto di vista della complessità ciclomatica vogliamo sapere quanto spesso il codice si dirama. C'è ancora un ramo alla fine del loop che risale all'inizio. Hai aggiunto un altro ramo con l'istruzione if . Quindi direi che dovresti considerarlo come una complessità aggiuntiva. Infatti, sono tentato di contare il if...break come 2 poiché c'è il ramo per if e il ramo aggiuntivo per break .

Anche se non sei d'accordo con la mia valutazione della complessità ciclomatica, sicuramente puoi vedere che leggere il codice è più difficile con if...break . Nel codice originale, posso vedere chiaramente che stiamo diminuendo x finché non è uguale a level . Nel secondo snippet di codice, devo pensare molto più difficile vederlo.

Inoltre break confonde i linguaggi basati su C. L'uso più comune è nelle dichiarazioni switch , in cui è abbastanza facile da capire, poiché è lì che la maggior parte delle persone prima apprende. Una volta inserito in strutture di controllo annidate, diventa molto più confuso. È uscito solo da quello in cui si trova, come con un'istruzione switch ? Bene, qui non ha senso perché è l'ultima riga di un if . Potresti semplicemente non metterlo lì e saresti fuori dal if alla parentesi di chiusura. Quindi deve uscire dalla struttura di controllo al di fuori di questo. Ma cosa succede se si trova all'interno di un'altra struttura di controllo? Si distacca anche da quello? Se no, perché no? E perché, quando viene utilizzato con un switch , non esce anche dalla struttura di controllo che lo racchiude? Pertanto, tendo ad evitare di utilizzare break ovunque tranne le dichiarazioni switch .

    
risposta data 03.03.2018 - 18:24
fonte

Leggi altre domande sui tag