Usando il valore di ritorno di una funzione come condizione if, buona pratica?

4

Pensi che sia una buona pratica usare i valori di ritorno delle funzioni come se le condizioni fossero? Sto codificando in PHP atm ma è valido per molti altri linguaggi.

if(isTheConditionMet($maybeSomeParams))
{
}

o

$res = isTheConditionMet($maybeSomeParams);
if($res)
{
}

Non riesco a pensare a una situazione in cui il primo crea un problema, vero?

EDIT: Assume che il valore restituito non verrà utilizzato dopo la valutazione della condizione.

    
posta guenis 26.11.2013 - 04:11
fonte

5 risposte

18

Nel codice che hai postato, non c'è motivo di memorizzare il risultato della funzione in una variabile prima di usarlo. (A meno che il nome della variabile non sia sufficientemente significativo da rendere il codice più chiaro per il lettore.)

D'altra parte, se devi fare riferimento al valore più di una volta, dovresti probabilmente memorizzarlo in una variabile piuttosto che chiamare la funzione più volte, il che potrebbe essere inefficiente e / o sbagliato:

$res = isTheConditionMet($maybeSomeParams);
if ($res)
{
    echo "res = $res\n";
    // do stuff
}
    
risposta data 26.11.2013 - 04:17
fonte
8

L'unico caso in cui il primo può causare un problema o essere fastidioso è quando si utilizza un debugger che non esegue o non può valutare la funzione durante il debug. Fino a poco tempo fa, questo era il caso delle funzioni .NET / Visual Studio.

Non posso dirlo con certezza, ma sospetterei che un ottimizzatore decente ottimizzerebbe la variabile per risparmiare memoria.

    
risposta data 26.11.2013 - 05:36
fonte
1

Se puoi guardarlo il giorno successivo ed è ovvio e facile da leggere, non è necessario per l'assegnazione. Ma aveva un sacco di args, o era accompagnato da molte altre chiamate di funzione in quelli se parens insieme a un gruppo di operatori, lo rilasciavo in una var ben denominata per spiegare quale cazzata si intende effettivamente passare on.

    
risposta data 26.11.2013 - 09:58
fonte
0

Supponendo che il codice funzioni correttamente e che non sia necessario eseguirne il debug.

Dato che non userete la variabile $ res, non dovreste averla neanche lì. Nel blocco di codice 1 è presente un'operazione di confronto sul valore di ritorno di isTheConditionMet .

Nel blocco di codice 2 il valore di ritorno è assegnato a $ res e quindi confrontato in if. Perché eseguire un'operazione di assegnazione aggiuntiva.

    
risposta data 26.11.2013 - 04:50
fonte
0

Ecco un'altra situazione a cui devi davvero pensare:

if(isTheFirstConditionMet($maybeSomeParams) and isTheSecondConditionMet($maybeSomeParams))
{
}

o

$res = isTheFirstConditionMet($maybeSomeParams);
$res2 = isTheSecondConditionMet($maybeSomeParams);
if($res and $res2)
{
}

Ora improvvisamente il codice non si comporta più come prima. Perché nel primo caso la seconda condizione verrà valutata solo se la prima condizione è vera. Ma quando si assegnano le variabili temporanee nel secondo caso, entrambe le funzioni saranno sempre valutate. Nel caso in cui usi più condizioni, devi davvero pensare al comportamento che desideri.

Php e la maggior parte delle altre lingue che conosco usano la valutazione di cortocircuito, il che significa che faranno il numero minimo di valutazioni per ottenere il risultato.

    
risposta data 28.02.2017 - 16:38
fonte