Qual è la migliore pratica per quando controllare se qualcosa deve essere fatto?

3

Diciamo che ho una funzione che fa x . Passo una variabile, e se la variabile non è nulla, fa qualche azione. E ho una serie di variabili e ho intenzione di eseguire questa funzione su ciascuna di esse.

All'interno della funzione, sembra una buona pratica controllare se l'argomento è nullo prima di procedere. Un argomento nullo non è un errore, ma solo un ritorno anticipato.

Potrei scorrere l'array e passare ogni valore alla funzione, e la funzione funzionerà benissimo.

C'è qualche valore nel controllare se var è nullo e chiamare la funzione solo se non è nullo durante il ciclo?

Questo si raddoppia sul controllo di null, ma:

  • C'è qualche valore guadagnato?
  • C'è qualche vantaggio nel non chiamare una funzione?
  • Qualunque guadagno di leggibilità sul loop nel codice padre?

Per amore della mia domanda, supponiamo che il controllo per null sarà sempre il caso. Riesco a vedere come il controllo di alcune proprietà dell'oggetto potrebbe cambiare nel tempo, il che rende la prima analisi una cattiva idea.

Esempio di pseudo codice:

for(thing in array) {
    x(thing)
}

Versus:

for(thing in array) {
    if(thing not null) x(thing)
}

Se esistono problemi specifici per la lingua, sono uno sviluppatore web che lavora in PHP e JavaScript.

    
posta changokun 26.10.2012 - 18:36
fonte

3 risposte

6

Is there any value to checking if the var is null and only calling the function if it is not null during the loop?

In termini pratici, molto poco a meno che tu non stia usando una lingua che impone un costo di chiamata incredibilmente alto.

Se la tua funzione afferma che "farà x se la cosa che passi non è null , nulla se lo è", allora all'interno della funzione è dove deve essere determinato quel comportamento. Altrimenti, la prima volta che la funzione viene chiamata con un puntatore null , si corre il rischio di comportamenti imprevedibili o indesiderati. Inoltre, se desideri modificare il comportamento della funzione in presenza di null , devi solo modificarlo in un unico punto.

    
risposta data 26.10.2012 - 18:56
fonte
3

Se passare null è legale dal punto di vista della funzione che chiami, aggiungere un controllo aggiuntivo al di fuori del loop è superfluo e deve essere evitato.

L'esempio classico è la funzione free di C che consente NULL s: tecnicamente, il controllo null prima che la chiamata non faccia danno, ma ingombra il codice e ha un impatto negativo sulla leggibilità.

Detto questo, puoi risparmiare alcuni cicli della CPU quando passi altri parametri che devono essere preparati:

var index = 0
for(thing in array) {
    if(thing not null) x(thing, prepareOtherParameters(index))
    index++
}

è più veloce della stessa chiamata senza "guardia", perché le chiamate a prepareOtherParameters vengono evitate.

    
risposta data 26.10.2012 - 18:51
fonte
2

Non so come si popola la matrice, ma se si tratta di una query di database, è possibile indicare all'SQL di omettere le righe in cui tale colonna è nullo. Forse la cosa corretta da fare è l'array che non ha valori nulli per iniziare con .

In ogni caso, poiché il parametro beeing null non è un errore, la prima opzione è OK.

for(thing in array) {
    x(thing)
}

Non ci dovrebbero essere differenze sostanziali nel rendimento, ecc.

    
risposta data 26.10.2012 - 18:46
fonte

Leggi altre domande sui tag