Recentemente ho lavorato con laravel (PHP) e c'è un'opzione quando si usa il loro ORM fluente per definire le clausole che usano le chiusure. Questo ci dà due modi, funzionalmente equivalenti, per specificare una clausola where che dovrebbe essere aggiunta solo in certi casi:
Esempio 1
$query = App::make('Vendor_Orders')->
where(function($query) use ($admin) {
if (!$admin) {
$query->where('vendor_id', '=', $this->id);
}
})->
get();
Esempio 2
$query = App::make('Vendor_Orders');
if (!$admin) {
$query->where('vendor_id', '=', $this->id);
}
$query = $query->get();
Come puoi vedere, uno di questi sta usando una chiusura (e mantenendo la "fluidità"), mentre l'altro lo evita. Il mio istinto è di preferire il secondo, perché l'uso di una funzione anonima come quella è l'aggiunta di un ulteriore stack frame, che mi aspetterei di rendere il programma meno efficiente (probabilmente un residuo del mio tempo che lavoro con C). D'altra parte, il mio collega (la cui prima lingua era PHP) preferisce il primo esempio, perché evita l'uso di un secondo operatore di assegnazione, e non vede nulla di sbagliato con accumulare chiamate di funzioni extra.
Questo mi ha fatto pensare: quanti effetti ha davvero quel frame di stack in più, in un sistema moderno? Fa qualche differenza pratica se si usa una chiamata di funzione invece di un'istruzione if?
Non cerco risposte soggettive che preferisco, chiedo una sorta di fatti riguardanti l'impatto di salti non necessari - in particolare per le funzioni anonime - in linguaggi moderni e interpretati (es. PHP, Java , eccetera.). Forse anche alcune note su come questo si differenzia dalle lingue compilate della vecchia scuola.