4

Mar

Null-checks e 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.

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.

by Totem's .NET Blog on 3/4/2011