In questo quarto capitolo dedicato al linguaggio F# ci concentreremo sulle tecniche necessarie alla creazione di librerie (o moduli, come vengono frequentemente chiamate), analizzandone contestualmente i pregi e le principali ragioni d’utilizzo, successivamente studieremo qualche esempio pratico di applicazione reale.

Un concetto fondamentale nella realizzazione di una buona libreria è l’astrazione (concetto di cui abbiamo già parlato all’interno della guida dedicata al paradigma OO): una libreria è un servizio offerto da una programmatore ad un altro ed è strutturata in modo tale che quest’ultimo si possa concentrare sul cosa fornisce la libreria e non sul come lo fornisce.

Consideriamo ad esempio la libreria standard dedicata al tipo Set e ai suoi metodi, tutti sappiamo che in matematica un set di elementi non è altro che un insieme contenente elementi appartenente al medesimo tipo, non ordinati e privi di duplicati, tuttavia non sappiamo esattamente come queste regole siano state implementate dai programmatori (ovviamente siamo perfettamente liberi di esaminare il contenuto della libreria e scoprirlo). Ignorando il come e sfruttando il cosa saremo più liberi di concentrarci sui nostri programmi.

La pratica dell’astrazione consiste nel presentare il sistema, ad esempio un pezzo di codice sorgente o uno scambio di dati, in maniera ridotta ai soli dettagli considerati essenziali all’interesse specifico, ad esempio raggruppando il codice in una funzione o formalizzando un protocollo di comunicazione. In sintesi: “L’astrazione è la possibilità di disegnare una scatola intorno ad una parte del sistema”.

Guida introduttiva all’Object Orientation

Un ulteriore vantaggio offerto dalle librerie riguarda la stabilità nel tempo, l’implementazione delle operazioni contenute all’interno della libreria potrà variare nel tempo (restando tuttavia fedele all’interfaccia promessa) senza arrecare così alcun danno agli utilizzatori.

In F# i tipi di dato astratto possono essere salvati utilizzando i file di “signatures” e i moduli:

  • Le interfacce sono mantenute all’interno di file con formato “file.fsi”;
  • L’implementazione delle interfacce avviene invece all’interno di file con formato “file.fs”.

I diversi file sono poi collegati dal compilatore e inseriti all’interno dei file di libreria: “file.dll”. La compilazione di una nuova libreria può essere eseguita mediante riga di comando, inserendo le istruzioni riportate in seguito, oppure sfruttando gli automatismi offerti dagli ambienti di sviluppo (come Visual Studio), questi saranno oggetti di studio nella prossima pagina.

Comandi per la compilazione di una libreria:

fsc -a Signature.fsi Library.fs

L’esecuzione del precedente comando porta alla generazione (in caso di esito positivo) di un file denominato “Library.dll”. Per compilare un programma utilizzando la libreria appena creata (sempre da riga di comando) dovremmo eseguire il seguente comando:

fsc ... -r Library.dll ...

Riepilogo

Piccolo riepilogo riguardante le diverse tipologie di file trattate:

  • file.fsi, file F# contenente la segnatura dei tipi e dei metodi. Viene creato dal programmatore;
  • file.fs, file F# contenente l’implementazione dei tipi e dei metodi. Viene creato dal programmatore;
  • file.dll, libreria finale. Viene creato dal compilatore.