Concetti e terminologia (trasformazione funzionale) (LINQ to XML)
Questo articolo presenta i concetti e la terminologia delle trasformazioni funzionali pure. L'approccio di trasformazione funzionale alla trasformazione dei dati produce codice che spesso è più rapido da programmare, più espressivo e di cui è più semplice eseguire il debug e da mantenere rispetto alla programmazione imperativa più tradizionale.
Si noti che gli articoli di questa sezione non sono progettati per spiegare completamente la programmazione funzionale. Questi articoli identificano invece alcune delle funzionalità di programmazione funzionale che semplificano la trasformazione di XML da una forma a un'altra.
Che cos'è la trasformazione funzionale pura
Nella trasformazione funzionale pura un set di funzioni, denominate funzioni pure, definisce la modalità di trasformazione di un set di dati strutturati dal formato originale in un altro formato. La parola "pura" indica che le funzioni sono componibili, che richiede che siano:
- Autosufficienti, pertanto possono essere ordinate e ridisposte liberamente senza ostacoli o interdipendenze con il resto del programma. Le trasformazioni pure non conoscono l'ambiente, né influiscono su di esso. Le funzioni usate nella trasformazione non presentano quindi effetti collaterali.
- Indipendenti dallo stato, pertanto eseguendo la stessa funzione o un set specifico di funzioni sullo stesso input si otterrà sempre lo stesso output. Le trasformazioni pure non mantengono in memoria informazioni sull'utilizzo precedente.
Importante
Nelle restanti parti di questa esercitazione il termine "funzione pure" viene usato in senso generale per indicare un approccio di programmazione e non una funzionalità specifica del linguaggio.
Si noti che le funzioni pure devono essere implementate come metodi in C# e come funzioni in Visual Basic.
Fare attenzione a non confondere funzioni pure con metodi virtuali puri in C++. Questi ultimi indicano che la classe contenitore è astratta e che non viene fornito alcun corpo del metodo.
Programmazione funzionale
La programmazione funzionale è un approccio di programmazione che supporta direttamente la trasformazione funzionale pure.
Dal punto di vista storico, i linguaggi di programmazione funzionale generici, tra cui ML, Scheme, Haskell e F# sono stati oggetto di interesse principalmente della comunità accademica. Sebbene sia sempre stato possibile scrivere trasformazioni funzionali pure in C# e Visual Basic, la difficoltà di farlo non ha reso l'opzione interessante per la maggior parte dei programmatori. Nelle versioni recenti di questi linguaggi, tuttavia, i nuovi costrutti di linguaggio, ad esempio espressioni lambda e inferenza dei tipi, rendono la programmazione funzionale molto più semplice e produttiva.
Per altre informazioni sulla programmazione funzionale, vedere Programmazione funzionale rispetto alla programmazione imperativa.
Linguaggi di programmazione funzionale specifici di dominio
Anche se i linguaggi di programmazione funzionale generali non sono stati ampiamente adottati, alcuni linguaggi di programmazione funzionale specifici di dominio hanno avuto un successo migliore. Ad esempio, i fogli di stile CSS (Cascading Style Sheets) vengono usati per determinare l'aspetto di molte pagine Web e i fogli di stile XSLT (Extensible Stylesheet Language Transformations) vengono usati ampiamente nella manipolazione dei dati XML. Per altre informazioni su XSLT, vedere Trasformazioni XSLT.
Terminologia
L'elenco seguente definisce alcuni termini correlati alle trasformazioni funzionali.
funzione di ordine superiore (prima classe)
Funzione che può essere considerata come oggetto a livello di codice. Ad esempio, una funzione di ordine superiore può essere passata ad altre funzioni o restituita da altre funzioni. In C# e Visual Basic, i delegati e le espressioni lambda sono funzionalità del linguaggio che supportano funzioni di ordine superiore. Per scrivere una funzione di ordine superiore, è necessario dichiarare uno o più argomenti che accettano delegati e usare spesso espressioni lambda per la chiamata. Molti degli operatori di query standard sono funzioni di ordine superiore.
Per altre informazioni, vedere Panoramica operatori query standard (C#) e Panoramica operatori query standard (Visual Basic).
espressione lambda
Essenzialmente funzione anonima inline utilizzabile in tutti i casi in cui è previsto un tipo delegato. Si tratta di una definizione semplificata di espressioni lambda, ma è adeguata ai fini di questa esercitazione.
Per altre informazioni, vedere Espressioni lambda (Guida alla programmazione di C#) ed Espressioni lambda (Visual Basic).
raccolta
Set strutturato di dati, in genere di tipo uniforme. Per essere compatibile con LINQ una raccolta deve implementare le interfacce IEnumerable o IQueryable (o una delle controparti generiche IEnumerator<T> o IQueryable<T>).
tupla (tipi anonimi)
Concetto matematico. Corrisponde a una sequenza finita di oggetti, ognuno di un tipo specifico, Una tupla è anche nota come elenco ordinato. I tipi anonimi costituiscono un'implementazione del linguaggio di questo concetto e consentono di dichiarare un tipo di classe senza nome e contemporaneamente di creare un'istanza di un oggetto di tale tipo.
Per altre informazioni, vedere Tipi anonimi (Guida alla programmazione di C#) e Tipi anonimi (Visual Basic).
inferenza dei tipi (tipizzazione implicita)
Capacità di un compilatore di determinare il tipo di una variabile anche in mancanza di una dichiarazione di tipo esplicita.
Per altre informazioni, vedere Variabili locali tipizzate in modo implicito (Guida alla programmazione di C#) e Inferenza del tipo locale (Visual Basic).
esecuzione posticipata e valutazione lazy
Azione che consiste nel posticipare la valutazione di un'espressione finché il valore risolto non è effettivamente necessario. L'esecuzione posticipata è supportata nelle raccolte.
Per altre informazioni su C#, vedere Introduzione a query LINQ (C#) ed Esecuzione differita e valutazione lazy in LINQ to XML (C#).
Per altre informazioni su Visual Basic, vedere Operazioni di query di base (Visual Basic) ed Esecuzione differita e valutazione lazy in LINQ to XML (Visual Basic).
Queste funzionalità del linguaggio saranno usate negli esempi di codice di tutta questa sezione.