Controlla un valore booleano prima di impostarlo in un ciclo o semplicemente impostarlo

0

Ho un ciclo piuttosto stretto con il seguente controllo per vedere se balance è mai stato positivo:

balance_null = True

while (crazy_loop()):
    ...
    if 0.0 < balance:
       balance_null = False

In nessun posto balance_null sarà mai impostato su True . Il codice sarebbe più efficiente se dovessi controllare lo stato di balance_null prima di impostarlo?

balance_null = True

while (crazy_loop()):
    ...
    if 0.0 < balance and 'balance_null'==True:
       balance_null = False

L'esempio di codice è in Python, ma in realtà sono interessato al caso generale, motivo per cui non sto semplicemente analizzandolo da solo. Che cosa è considerata una best practice e quali sono le eccezioni alla regola?

    
posta dotancohen 01.02.2015 - 18:13
fonte

3 risposte

1

Non dovresti controllarlo - non perché è più costoso farlo (data la CPU di oggi che non è affatto certa), ma perché è concettualmente inutile. Aggiungerlo rende più difficile ragionare il codice.

Tutto il codice dovrebbe essere utile, durante la lettura del codice non solo lo interpretiamo, ma cerchiamo anche di estrapolarlo - capire sia che cosa stia facendo, sia perché.

Il codice che non serve a nulla è quindi un ostacolo. Può causare notevoli ritardi se si cerca uno scopo, e ovviamente non lo si trova.

Se, in un caso specifico, dovessi profilare il codice, trovare un impatto significativo sulle prestazioni, quindi potresti aggiungere il controllo, con un commento appropriato (detto commento per includere il compilatore e la versione testata ).

    
risposta data 01.02.2015 - 19:16
fonte
3

L'impostazione di una variabile booleana è un costo irrisorio nella maggior parte dei linguaggi di programmazione. Non controllare prima per vedere se è impostato; appena impostato.

    
risposta data 01.02.2015 - 18:32
fonte
1

Se l'impostazione del booleano è l'unica ragione per il ciclo, puoi anche uscire da esso quando imposti il booleano:

balance_null = True

while (crazy_loop()):
    ...
    if 0.0 < balance:
       balance_null = False
       break;

o estrai il loop a una funzione e utilizza il ritorno anticipato.

    
risposta data 01.02.2015 - 18:53
fonte

Leggi altre domande sui tag