Come stratificare le istruzioni se l'ordine della logica è irrilevante?

4

Fondamentalmente ho una serie di logiche nel mio sito che possono portare a 5 risultati totali. Fondamentalmente due diversi se test e poi una catch all else statement.

Ad esempio:

if cond1:
    if mod1:
        #do things
    elif mod2:
        #do things
elif cond2:
    if mod1:
        #do things
    elif mod2
        #do things
else:
    #do things

Stavo pensando di riscriverlo in questo modo:

if cond1 and mod1:
    #do things
elif cond1 and mod2:
    #do things
elif cond2 and mod1:
    #do things
elif cond2 and mod2:
    #do things
else:
    #do things

C'è una vera differenza in queste due opzioni di codifica / una scelta migliore per questo tipo di test logico?

    
posta Jack Fraser 15.08.2014 - 18:11
fonte

2 risposte

8

Una differenza è che cond1 viene valutato una sola volta nel primo frammento di codice, ma può essere valutato due volte nel secondo esempio se mod2 è falso. Se cond1 ha effetti collaterali, questo cambia la semantica. Se cond1 è costoso da valutare, potrebbe anche essere un problema anche se la semantica non cambia.

Se nessuna di queste condizioni è vera, è in gran parte una questione di gusto e stile, ma direi che la seconda forma evidenzia più chiaramente la natura della logica (5 casi indipendenti) mentre la prima forma richiede un po 'più di sforzo per vedere che i 5 casi possono essere trattati separatamente.

    
risposta data 15.08.2014 - 18:19
fonte
0

Le istruzioni nidificate if (o nidificate nulla) aggiungono complessità al codice. Rende più difficile per qualcuno leggere e capire il codice. Esiste in realtà una misura di complessità chiamata complessità Cyclomatic . Il modo in cui funziona è ogni volta che c'è un ramo condizionale che aggiunge un punto. Punti più alti significa più complessi. Esistono alcuni strumenti automatici che possono eseguire la scansione del tuo codice e segnarlo per te.

Uno dei nostri compiti principali come sviluppatori è di ridurre la complessità il più possibile. Cerco di evitare blocchi nidificati quando possibile, quindi la tua seconda scelta sembra un buon modo.

    
risposta data 16.08.2014 - 19:10
fonte