I tag e gli attributi HTML vengono impiegati sempre più per fornire informazioni aggiuntive sui numerosi dati che popolano ogni pagina web di cui curiamo la pubblicazione. Una maggiore sensibilità verso questo aspetto significa aprire le porte a motori di ricerca più efficienti: si pensi al modo in cui già da più di un anno Google usa RDFa, microformat e microdata (formati di definizione e marcatura che definiscono uno standard per lo scambio di dati, in modo automatico, tra macchine) per offrire un set arricchito di informazioni partendo dai dati strutturati contenuti nelle pagine web create da ciascuno di noi.
La semantica è anche la via attraverso la quale “liberare i dati” rendendone possibile la fruizione non solo a individui, ma anche direttamente ad altre macchine; in questo modo i dati possono essere rielaborati per assolvere funzioni diverse da quelle per cui originariamente erano stati resi disponibili. Infine, una più accurata descrizione del significato di un documento significa anche maggiore accessibilità per mezzo di tecnologie di supporto che, sfruttando una più approfondita conoscenza delle pagine web, possono svolgere meglio la loro funzione di supporto alla navigazione.

che contenga le informazioni correlate ad esso.
I messaggi sono il meccanismo principale utilizzato dalle applicazioni Windows, ma non solo, per spedire e/o ricevere notifiche di un qualcosa che è avvenuto e che interessa l’applicazione stessa. Ad esempio quando l’utente interagisce con una finestra cliccando su un pulsante, l’applicazione di cui fa parte la finestra verrà informata di ciò tramite un apposito messaggio.
Un oggetto può generare degli eventi, un altro oggetto viene informato di essi ed intraprende delle azioni. Il mittente dell’evento non sa quale altro oggetto lo riceverà , dunque è necessario un meccanismo che funga da intermediario, che prescinda dalle tipologie di oggetti destinatari dell’evento.
Non esiste un programma perfetto, nonostante tutta l’attenzione che si può mettere nell’evitare gli errori, possono sempre sfuggire delle situazioni di possibile malfunzionamento, ed altre in cui il programma non si comporta come vorremmo. Non è inoltre sufficiente prevedere tali situazioni e restituire ad esempio un codice di errore, soprattutto in metodi con diversi rami di esecuzione, e diverse cose che possono andare male.
Supponiamo ad esempio di voler aprire una connessione di rete , scaricare un file, aprirlo e leggere delle stringhe rappresentanti dei numeri, convertirli in interi, fare delle divisioni, spedire il risultato sulla rete, e mille cose di altro genere. Dovremmo prevedere il fatto che il file non esiste, o che è già in uso, o che non abbiamo il permesso di leggerlo, o che se anche riusciamo a leggerlo esso è corrotto, che la connessione di rete non è disponibile, che la divisione non è eseguibile perchè i numeri sono nulli.
Quando si verifica una eccezione, viene creato un oggetto contenente, tra le altre, informazioni sull’errore che si è verificato. Eccezioni più specifiche possono inoltre derivare da classi particolari, ad esempio eccezioni che riguardano errori di Input/Output sono in genere derivate dalla classe IOException, da cui a loro volta derivano fra le altre FileNotFoundException o FileLoadException che riguardano ancora più specificatamente eccezioni nella gestione di file.
Negli ultimi tempi stiamo assistendo ad un crescente interesse verso la programmazione funzionale. Linguaggi di programmazione come Elm,Erlang, Clojure o Haskell stanno attirando sempre più l’attenzione di numerosi sviluppatori ed il numero di progetti scritti in questi linguaggi è in crescita. La sempre maggiore popolarità dei linguaggi di programmazione funzionale sta anche influenzando i cosiddetti linguaggi tradizionali. Da qualche anno, infatti, si è visto un generale arricchimento del supporto di caratteristiche funzionali all’interno di linguaggi non funzionali come Java e C#. Ci riferiamo, per fare qualche esempio, all’introduzione delle lambda expression e al supporto delle closure, al diffondersi di librerie dichiarative per la manipolazione di liste (es.: LINQ) e per il supporto dell’immutabilità dei dati, ecc.
In genere si dice che l’elemento del codominio è il risultato dell’applicazione della funzione sugli elementi del dominio. L’aspetto interessante delle funzioni matematiche è che, a parità di elementi del dominio, l’applicazione di una funzione restituisce sempre lo stesso risultato. In altre parole, l’applicazione di una funzione matematica è deterministica e pertanto è possibile fare verifiche di correttezza ed altre elaborazioni formali.
Questo è uno dei vantaggi fondamentali della programmazione funzionale rispetto alla programmazione imperativa. Infatti, nella programmazione tradizionale l’applicazione di una funzione può in certi casi restituire risultati diversi a parità di valori di input. Questo accade quando la funzione fa riferimento ad uno stato, condiviso o meno, e questo viene modificato da effetti collaterali derivanti dall’esecuzione della funzione stessa o di altre entità. Ci basta evidenziare i seguenti punti caratterizzanti della programmazione funzionale:
le funzioni sono funzioni matematiche che per un dato input restituiscono sempre lo stesso risultato;
le funzioni non modificano i dati ricevuti in input, ma restituiscono sempre nuovi valori;
le funzioni possono essere passate come parametro e restituite da altre funzioni, e possono essere combinate tra di loro.

Questi semplici punti possono essere considerati i punti fondamentali della programmazione funzionale e da essi derivano altre caratteristiche. Ovviamente esistono altri aspetti tipicamente supportati dai linguaggi di programmazione funzionale, ma il nostro obiettivo è comprendere quali sono i principi fondamentali di questo modello di programmazione, e come possiamo applicarli quando scriviamo dei codici.
È importante evidenziare che la programmazione funzionale è un paradigma di programmazione, cioè un modo di vedere la programmazione, un approccio, un modello per la costruzione di programmi.
Come tale quindi non è legato ad uno specifico linguaggio di programmazione. Naturalmente, un linguaggio di programmazione specificamente progettato per la programmazione funzionale ci indirizza all’applicazione dei principi di questo paradigma e ci impedisce di commettere errori grossolani che violano i principi di base.
Con un linguaggio non funzionale dobbiamo essere noi ad imporci una disciplina nella scrittura di codice che rispetti i principi di base del paradigma funzionale. E questo non sempre risulta così semplice, soprattutto se non è chiaro il modello proposto e se continuiamo a pensare con un approccio imperativo.
