ciao @Enniorosanero,
Allora probabilmente questo post sara' un po' lungo, ma cerchero' di spiegare in maniera sintattica alcune cose:
Partiamo dal principio. Javascript e' un linguaggio interpretato orientato ad oggetti ed eventi. Viene impiegato in un'ampia gamma di servizi: (WebBrowser, Motori di rendering, shell da terminale, ...). Ovviamente l'uso piu' ampio ricade sui browser in quanto maggiori utilizzati.
Javascript supporta il concetto di variabili non tipizzate, (come php), ovvero, ogni variabile possiede il tipo del valore assegnato:
esempio"
Codice: Seleziona tutto
var x = 1; //x tipo numerico
var y = 'a';//y tipo stringa
una variabile puo' anche essere di tipo oggetto o funzione
esempio:
per rapidita' salteremo la parte dei parametri delle funzioni e dei costrutti supponendo che tu li conosca.
Un evento, e' il verificarsi di una condizione in un determinato istante alla quale tu puoi far associare una funzione.
Parliamo adesso di Eventi, Clousure e Callback.
Supponendo di avere queste funzioni:
Codice: Seleziona tutto
function myCallBack_first(){ process.stdout.write('first'); }
function myCallBack_second() { process.stdout.write('second'); }
function myCallBackChooser(variable, function_first, function_second){
if(variable == 1) { function_first(); }
if(variable == 2) { function_second(); }
}
adesso quello che vogliamo fare e' implementare un callback, ovvero, vogliamo fare in modo che la funzione chiamata esegua del codice a seconda delle situazioni, questa tecnica con qualche modifica in piu' viene chiamata IoC (Iversion of Control), ci arriviamo fra poco.
adesso, se proviamo a fare una cosa del genere:
Codice: Seleziona tutto
myCallBackChooser(1, myCallBack_first, myCallBack_second);
la funzione myCallBackChooser al suo interno chiamera' myCallBack_first, nel caso anaologo in cui sia passato il valore intero '2' sara' eseguito myCallBack_second.
giusto per dare un accenno di IoC (semplice semplice) per utilizzare una funzione anonima (Detta anche Clousure analoghe alle funzioni
lambda ma queste non sono dotate di nome)
supponiamo di avere queste funzioni adesso: (senza clousure)
Codice: Seleziona tutto
function iocFunction(thefunction) {
return thefunction(3);
}
function myFunction (myvalue) {
return myvalue + 1;
}
process.stdout.write(iocFunction(myFunction).toString());
quello che succede in questo caso e che chiamando iocFunction con myFunction otterremo il valore 4. Analogamente con una clousure avremmo potuto fare una cosa del genere
Codice: Seleziona tutto
function iocFunction(thefunction) {
return thefunction(3);
}
process.stdout.write(
iocFunction(
function(value) { return value + 1; }
).toString()
);
come vedi abbiamo passato come parametro di iocFunction una funzione scritta in quel momento che non possiede nome (Clousure).
ti spiego passo passo cosa succede:
Codice: Seleziona tutto
//abbreviato in una sola riga
process.stdout.write(iocFunction(function(value){ return value + 1}).toString());
1# viene chiamata iocFunction con parametro (function(value){ return value + 1})
2# iocFunction al suo interno chiama thefunction con valore 3. quindi abbiamo una cosa del genere (function(3){ return value 3 + 1; })
3# la funzione restituisce il valore 3 + 1 al chiamante (iocFunction) iocFunction a sua volta la restituisce a process.stdout.write che lo scrive sullo stdout adattato a stringa (Numeric possiede il metodo toString per convertire un numero in stringa).
Quali sono le potenzialita'?
+ supponendo di dover fare cose prima e dopo ma con qualche variazione nel mezzo (esempio: prendo degli input, li trasformo in un modo, li passo ad un altro metodo che se li aspetta in quel modo e li salva e poi li devo restituire in output), posso scrivere questo metodo che fa da IO, e modificare solamente il metodo che passa i dati (scusami per la confusione ma non so spiegarlo meglio).
Quindi, ricapitolando:
una CallBack e' una funzione che viene chiamata di ritorno secondo determinate condizioni
una Clousure e' una funzione (Anonima - senza nome) che serve per fare (Anche) IoC. Ma viene utilizzata per diversi scopi, alcuni sono presenti piu' avanti.
Queste saranno molto utilizzate in vari framework (come AngularJS).
----------
Passiamo a JSON (Javascritp Object Notation).
Un Oggetto JSON e' una variabile che al suo interno contiene un oggetto, ed e' rappresentata dalle parentesi graffe {}.
questo e' un oggetto JSON
questo e' un oggetto JSON con una variabile:
questo e un oggetto JSON con piu variabili
e' possibile accedere ad un attributo di un oggetto json tramite la dot notation
cosi come per le variabili vale anche per le funzioni:
in un oggetto literale e' possibile aggiungere funzioni
Codice: Seleziona tutto
var myjsonvar = { x:3, y:'ciao', z: function() { return 3.33; } };
> console.log(myjsonvar.z);
[Function]
> console.log(myjsonvar.z());
3.33
e' possibile anche assegnare dinamicamente un'attributo ad un oggetto se esiste
in un oggetto literale e' possibile aggiungere dinamicamente variabili all'oggetto.
Codice: Seleziona tutto
myjsonvar.t = 7;
> console.log(myjsonvar);
{ x:3, y: 'ciao', z: [Function], t: 7 }
Torniamo per un secondo agli eventi:
Gli eventi sono creati dal gestore che li mantiene (Browser, NodeJs, ...).
Ogni gestore mette a disposizione dei controlli per intercettare (o anche lanciare) degli eventi. Questo e' chiamato dispatcher. invece il metodo che lo gestisce viene chiamato handler. Sostanzialmante e' dispatch -> handle.
per fare un esempio con js implementato in un browser, supponendo di avere un bottone ed averlo nella variabile 'var button', potremmo modificare in questo modo il comportamento dell'evento
Codice: Seleziona tutto
var mybutton = document.getElementById('the-super-button');
mybutton.click = function() { window.alert('button was pressed!'); };
come vedi abbiamo utilizzato una clousure, al suo interno, il browser, quando intercettera' il segnale scatenera' la funzione click(), che nel nostro caso corrisponde a (function() { window.alert('button was pressed!'); };)
esistono anche i listener che permettono di registrare piu' funzioni e che accettano come parametro l'evento scatenato
http://www.w3schools.com/jsref/met_docu ... stener.asp
----------
Qualche definizione:
Flussi: "la strada che prende il codice", l'ordine in cui il codice e' eseguito.
Modulo: un insieme di direttive e funzioni che hanno uno scopo comune, analogo al concetto di package in Java.
----------
Saltiamo la parte AngularJS, Node.js, Socket.io perche' non puo' essere affrontata in un post.
----------
REST, Representional State Transfer, e' un tipo di architettura software che serve per prelevare/immettere/patchare/eliminare dei dati in genere viene mappato con CRUD (Create Read Update Delete) per la gestione dei modelli.
REST e' un protocollo client-server statless (perche' implementato su http). e si basa sul principio di risorse. Ogni risorsa ha un url (unified resource location) che lo identifica.
Esempio:
avremmo che user e' la risorsa rest, e superstep e' il modello. in questo modo e' possibile fare su di esso determinate operazioni tramite l'url
Codice: Seleziona tutto
HTTP-VERB | URL | SPIEGAZIONE | OPERAZIONE CRUD
GET www.example.com/user @mostra tutti gli utenti analogo ad un metodo indice (READ)
GET www.example.com/user/superstep @mostra l'utente specifico (READ)
POST www.example.com/user/ @in genere se la richiesta e' post serve per creare il modello (CREATE)
PUT/PATCH www.example.com/user/superstep @questo serve per aggiornare il modello (UPDATE)
DELETE www.example.com/user/superstep @questo serve per cancellare il modello (DELETE)
nei sistemi con basi di dati relazionati (tramite database), e' possibile usare CRUD per accedere agli elementi tramite URL.
esempio banale
Codice: Seleziona tutto
GET www.example.com/user/superstep/comments @tutti i commenti di superstep
GET www.example.com/user/superstep/comments/3 @il commento specifico 3 di superstep
per il momento mi fermo qui, spero di esserti stato di aiuto.