RSS Feed

Metodi di estensione, null-checks e programmazione funzionale

March 3rd, 2011 by totem in C#, LINQ, Programmazione funzionale



Se vi capita spesso di dover controllare se una certa variabile di tipo reference contiene un valore nullo (null o Nothing), allora questo articolo è quello che fa per voi. Usare i metodi di estensione per evitare di nidificare decine di if, switch e condizioni varie è veramente un'ottima idea. Se ci fate caso, questo approccio è decisamente più funzionale che imperativo, ed il trend degli ultimi anni per quanto riguarda .NET è proprio una tendenza spiccata verso il paradigma funzionale. Pensateci un attimo: già le espressioni lambda del fw3.5 e successivamente i metodi anonimi del fw4.0 sono state delle grandi aggiunte, ma più di tutti LINQ si fa sentire vigorosamente con la mole di estensioni che mette a disposizione. Certe volte non mi sembra nemmeno di scrivere in C# XD.

Ecco un esempio. Qualche settimana fa stavo scrivendo una libreria con metodi di estensione che uso spesso (per stringhe e collezioni generics). Trovandomi a dover scrivere il codice per la funzione ToProperCase, sono venuto fuori con questo:

public static String ToProperCase(this String instance)
{
    if (String.IsNullOrEmpty(instance))
        return instance;

    return instance.Trim()
       .Split(' ')
       .Where(word => !String.IsNullOrEmpty(word))
       .Select(word => word.Length > 1 ?
                       Char.ToUpper(word[0]) + word.Substring(1).ToLower() :
                       word.ToUpper())
       .Aggregate("", (accumulator, word) => accumulator + word + ' ')
       .Trim();
}

Notate come abbia usato LINQ pesantemente. Il proper case è una formattazione delle stringhe in cui ogni parola ha l'iniziale maiuscola. Nel codice sopra, Trim() elimina gli spazi in testa e in coda alla stringa, Split() spezza la stringa in parti separate da uno spazio, Where() filtra i risultati scartando le stringhe vuote, Select() trasforma ogni parola imponendo il carattere iniziale maiuscolo, Aggregate() aggrega ogni parola in una stringa completa, usando come separatore ancora lo spazio e infine Trim() elimina il carattere spazio incluso alla fine della stringa dal passo precedente.

Se volete altri esempi di programmazione funzionale in C# vi consiglio di leggere anche questo articolo e le altre due pubblicazioni dello stesso autore sempre su c-sharpcorner.