Magia JavaScript
Imperativo vs. Ricorsivo vs. Funzionale
Imperativo vs. Ricorsivo vs. Funzionale
[ Lavoro in corso ]
// Imperativo: Il più veloce ( + molto semplice, nessun puntatore aggiuntivo né allocazioni eccessive ):function fib(n) { var a = 1, b = 1, c = 0; for (var i = 1; i < n - 1; ++i) { c = a + b; a = b; b = c; } return b;}
// Ricorsivo: (SOLO FIREFOX O BABELJS) Definizione di funzione ES6 con// parametri predefiniti utilizzati per impostare i valori iniziali (interna/ricorsiva)function fib(n, current = 0, a = 1, b = 1, c = 0) { current++; c = a + b; a = b; b = c; return current >= n ? b : fib(n, current, a, b, c);}
// Esempio testuale cattivo - cattiva gestione dello scope con variabili esterne mutabilifunction fib(n) { if (!arr) { var arr = [1, 1]; n = n - 2; } // Cattivo if (n === -1) { return [arr[0]]; } if (n === 0) { return arr; } var proc = function() { --n; arr.push(arr[arr.length - 1] + arr[arr.length - 2]); return n === 0 ? arr : proc(); // Cattivo: funzione ricorsiva interna non necessaria, suggerimento: le variabili utilizzate provengono dallo scope della funzione padre }; var ans = proc(); return ans[ans.length - 1];}Promises: Fantastico!
// Esempio utilizzando le Promises di Bluebirdvar Promise = require("bluebird"), fs = Promise.promisifyAll(require("fs")), less = Promise.promisifyAll(require("less"));
function writeFileData(data) { return fs.writeFileAsync("/tmp/output.css", data);}// Bluebird rende qualcosa come questo forse troppo semplice e conciso:fs.readFileAsync("./style.less") // Chiamata a readFile() promisificata .then(less.renderAsync) // Passa a less.render .then(writeFileData); // Funzione per ricevere i contenuti css (primo parametro)- Sebbene le Promises native di ES6 siano ottime, preferisco la robusta libreria Bluebird Promise.
- Con o senza libreria, i browser moderni supportano le Promises da anni.
- Le Promises possono essere utilizzate senza pattern complicati - l’uso implicito di
deferredè preferibile. - $q è pessima, usa semplicemente Bluebird, vedi sopra.
- Merita menzione: i benchmark di Bluebird sono test ottimizzati, quindi notalo se stai creando catene di Promises complesse.
Java vs JavaScript
Limitazione di Velocità / Debounce / Throttle
- In JavaScript David Walsh ha implementato debounce in meno di 20 righe!
- In Java, JDebounce, una libreria molto più complessa, è lunga circa 500+ righe.
- _ Confronto tra i due: _
- Il JavaScript è veloce e utilizza le funzioni di primo livello per ottenere una semplicità brillante.
- Mentre il Java ha molte più parti mobili, vengono utilizzate annotazioni per applicare comportamenti a tempo di compilazione, e c’è una tonnellata di XML, solo per divertimento!