Interfacce in JavaScript
Nonostante JavaScript possa essere considerato un linguaggio orientato agli oggetti non presenta uno degli aspetti fondamentali di questa tecnica di programmazione. Vediamo di cosa si tratta e di come sopperire a questa mancanza del linguaggio.
Uno degli aspetti che mi sono sempre piaciuti all'interno del panorama della programmazione ad oggetti sono senza dubbio le interfacce. Esse rappresentano lo strumento principe per quanto riguarda la progettazione di codice all'interno di applicazioni di medie e grande dimensioni e permettono di astrarsi rispetto all'implementazione pratica di un determinato algoritmo. Le interfacce definiscono quali metodi sono obbligatori all'interno di una determinata classe e grazie ad esse è possibile avere la certezza che richiamando uno di questi metodi da qualche altro componente dell'applicazione si avrà il risultato sperato. E' come se rappresentassero un contratto che una classe ha fatto con il resto dell'applicazione. Grazie alle interfacce le classi esterne non vengono a conoscenza dell'implementazione dell'algoritmo (in pura ottica di disaccoppiamento di funzionalità) ma sono "sicure" che effettivamente il metodo esiste e può essere invocato. Questo controllo viene effettuato in fase di compilazione per i linguaggi appunto compilati (per esempio Java) o in run-time per i linguaggi interpretati (per esempio Python o PHP).
Una volta definito molto brevemente cosa rappresentano le interfacce nei linguaggi di programmazione moderni possiamo concentrarci sull'aspetto core di questo articolo. JavaScript nonostante presenti molti aspetti comuni agli altri linguaggi orientati agli oggetti non presenta nessun componente che permetta di definire interfacce. Questo "buco" è stato però in qualche modo riempito tramite alcune tecniche abbastanza esotiche in quanto si trattano di veri e propri trucchi per sopperire ad una mancanza importante del linguaggio in sè.
Tra le diverse tecniche che ho analizzato quella che mi è sembrata più interessante e più utilizzabile in termini pratici è quella proposta all'interno del libro Pro JavaScript Design Patterns scritto da Harmes/Diaz ed edito da APress (che consiglio a tutti di leggere) e implementata da Coglan all'interno del suo framework JS.Class (sito ufficiale). La soluzione proposta prevede l'utilizzo di un particolare oggetto JavaScript (JS.Interface) da utilizzare per definire le interfacce e di un metodo statico (JS.Interface.ensure) per effettuare il controllo (implicito in tutti gli altri linguaggi OOP) che un determinato oggetto rispetti il contratto definito con l'interfaccia. Ovviamente per poter usufruire di questa funzionalità è necessario che i successivi oggetti siano creati con gli strumenti offerti dallo stesso framework e non utilizzando un metodo di definizione delle classi "standard" di JavaScript.
Il mio consiglio è quindi quello di non focalizzarsi sui semplici strumenti offerti da aJavaScript per implementare una logica ad oggetti in quanto abbiamo visto come il linguaggio sia carente, ma di affidarsi ad un framework (quello proposto in questo articolo ma anche tanti altri presenti sul web) almeno per gestire alcuni aspetti di basso livello come appunto le interfacce.