Nel corso degli anni la complessità dello sviluppo software è andata crescendo di pari passo alle architetture, librerie e framework disponibili.

I problemi alla base dello sviluppo software rimangono peró sempre gli stessi. Per questo motivo risulta utile classificare e condividere le migliori soluzioni o best practice in modo da farle diventare patrimonio condiviso che ogni sviluppatore può utilizzare per risolvere problemi ricorrenti.

Un po’ di storia:

Il termine fu introdotto da un libro di Christopher Alexander applicato all’architettura. In seguito proprio l’opera di Alexander ispirò la nascita di un nuovo settore dell’ingegneria del software dedicato all’applicazione del concetto di design pattern alla realizzazione del software, soprattutto object-oriented. Una grande spinta in questa direzione fu data da un altro libro del 1995: “Design Patterns: Elementi per il riuso di software ad oggetti” scritto di Erich GammaRichard HelmRalph Johnson e John Vlissides denominati la “banda dei quattro” (Gang of Four o Gof).

Cos’è un design pattern:

Un Design Pattern si può definire come una soluzione progettuale generale ad un problema ricorrente incontrato durante la fase di progettazione o sviluppo di un sistema software.

Costituiscono quindi delle soluzioni codificate a problemi comuni riutilizzabili in maniera slegata dal singolo progetto, dominio o linguaggio utilizzato.

I design pattern sono definiti da:

  • Nome e classificazione: il nome deve rappresentare in maniera concisa l’essenza del pattern. La classificazione lo distingue in funzione delle problematiche che affronta
  • Problema: definisce la problematica che si propone di risolvere
  • Applicabilità: descrive in quale contesto può essere applicato
  • Struttura: descrive gli elementi costitutivi che lo compongono e come sono in relazione tra di loro
  • Partecipanti: classi ed oggetti che lo compongono e relative responsabilità
  • Conseguenze: gli obiettivi raggiunti applicandolo
  • Implementazione: le tecniche per realizzarlo
  • Esempio: frammenti di codice dell’implementazione attraverso uno specifico linguaggio
  • Usi conosciuti: esempi di applicazione a casi reali
  • Relazione con gli altri pattern: correlazione con altri pattern conosciuti

Essi possono essere classificati in base al tipo di problema che si propongono di risolvere in:

  • Creazionali: affrontano problematiche inerenti la creazione degli oggetti (Ex: Singleton)
  • Strutturali risolvono problematiche inerenti la struttura delle classi e degli oggetti (Ex: Adapter)
  • Comportamentali: forniscono soluzione alle più comuni tipologie di interazione tra gli oggetti (Ex: Observer)

Un esempio: il Singleton

Uno dei pattern creazionali più famosi è il Singleton che ha lo scopo di garantire che una determinata classe venga creata in una singola istanza condivisa da ogni oggetto che vi accede.

Nome e classificazione: Singleton, è un pattern creazionale

Problema: in molti contesti esiste l’esigenza che una classe possieda un’unica istanza e un punto di accesso univoco.

Struttura: di seguito il diagramma UML:

Applicabilità: può essere utilizzato quando:

  • deve esistere una sola istanza di una classe con un unico punto di accesso noto agli utilizzatori
  • l’unica istanza deve poter essere estesa attraverso definizione di sottoclassi ed i client che vi accedono non devono essere modificati in funzione di ciò

Partecipanti: La classe che implementa le logiche Singleton che contiene:

  • un attributo statico che se diverso da NULL conterrà l’istanza di classe
  • un metodo statico che permetta ai client di accedere alla sua unica istanza

Conseguenze:

  • controllo degli accessi
  • riduzione dello spazio dei nomi ovvero non è necessario definire variabili globali
  • possibilità di definire delle sottoclassi che costituiscono l’unica istanza

Implementazione ed Esempio: la strategia è quella di creare un costruttore privato in modo che non sia possibile istanziare la classe al di fuori della stessa e fornire un metodo getter statico per creare l’oggetto alla prima chiamata e restituirlo alle successive.

Di seguito l’implementazione della versione classica in linguaggio Java:

Pattern correlati: altri pattern utilizzano il singleton per risolvere specifici problemi di creazione associati alla necessità di avere un’unica istanza.

Perché é utile conoscerli e rischi

Di primo acchito si potrebbe pensare che i concetti legati al Design Pattern siano “accademia” ma attraverso una riflessione più approfondita ci si accorge che la loro conoscenza e corretto utilizzo permette di:

  • Utilizzare soluzioni efficaci e validate dalla comunità informatica a problemi ricorrenti (“Don’t reinvent the wheel!”)
  • Utilizzare un linguaggio comune e condiviso legato alla progettazione dei sistemi software
  • Aumentare l’astrazione e quindi diminuire la necessità di modifiche o refactor al variare dei requisiti
  • Aumentare la comprensibilità e quindi la qualità del software
  • Comprendere i meccanismi di base utilizzati dalla maggior parte delle librerie e framework piú diffusi in ambito sviluppo software.

Dall’altro lato un loro abuso può favorire l’over ingegnerizzazione. Il consiglio è quindi di utilizzarli con cognizione di causa solo nei casi realmente necessari.

Negli ultimi anni la proliferazione di librerie e framework per lo sviluppo rapido del software (che li sfruttano abbondantemente) ha messo in secondo piano il loro impiego diretto. Ciononostante la diffusione planetaria li rende degli standard de facto che, anche se utilizzati in maniera indiretta, ne rende indispensabile la conoscenza da ogni informatico che si rispetti.