
Design Patterns
di Claudio De Sio Cesari
L'applicazione dell'Object Orientation ai processi di sviluppo software complessi, comporta non poche difficoltà. Uno dei momenti maggiormente critici nel ciclo di sviluppo, è quello in cui si passa dalla fase di analisi a quella di progettazione. In tali situazioni bisogna fare delle scelte di design, particolarmente delicate dal momento che potrebbero pregiudicare il funzionamento e la data di rilascio del software. In tale contesto (ma non solo) si inserisce il concetto di design pattern, importato nell'ingegneria del software direttamente dall'architettura. Infatti la prima definizione di pattern fu data da Cristopher Alexander, un importante architetto austriaco (insegnante all'università di Berkley - California) che iniziò a formalizzare tale concetto sin dagli anni '60. Nel suo libro "Pattern Language: Towns, Buildings, Construction" (Oxford University Press, 1977) Alexander definisce un pattern come una soluzione architetturale che può risolvere problemi in contesti eterogenei.
La formalizzazione del concetto di Design Pattern (pattern di progettazione), è ampiamente attribuita alla cosiddetta Gang of Four (brevemente GOF). La gang dei quattro, è costituita da Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides, che nonostante provenissero da tre continenti diversi, in 4 anni di confronti catalogarono la prima serie di 23 pattern, che costituiscono il nucleo fondamentale della tecnica. Nel 1994 vede la luce il libro considerato la guida di riferimento per la comunità dei pattern: "Design Patterns: elements of reusable object oriented software" (Addison-Wesley). Altri autori in seguito hanno pubblicato testi che estendono il numero dei pattern noti...
Definizione di Design Pattern
I Design Patterns rappresentano soluzioni di progettazione generiche applicabili a problemi ricorrenti, all'interno di contesti eterogenei. Consapevoli che l'asserzione precedente potrebbe non risultare chiara al lettore che non ha familiarità con determinate situazioni, cercheremo di descrivere il concetto presentando, oltre che alla teoria, anche alcuni esempi di pattern. In questo modo si potranno meglio apprezzare sia i concetti sia l'applicabilità.
L'idea di base però, è piuttosto semplice. È risaputo che la bontà della progettazione è direttamente proporzionale all'esperienza del progettista. Un progettista esperto, risolve i problemi che si presentano, utilizzando soluzioni che in passato hanno già dato buoni risultati. I Gof non hanno fatto altro che confrontare le loro (ampie) esperienze nel trovare soluzioni progettuali, scoprendo così delle intersezioni abbastanza evidenti. Siccome queste intersezioni sono anche soluzioni che risolvono frequentemente problemi, in contesti eterogenei, possono essere dichiarate e formalizzate come Design Pattern. In questo modo, si mettono a disposizione soluzioni a problemi comuni, anche ai progettisti che non hanno una esperienza ampia come quella dei Gof. Quindi, stiamo parlando di una vera e propria rivoluzione!
Gof Book: formalizzazione e classificazione
I Gof hanno catalogato i pattern utilizzando un formalismo ben preciso. Ogni pattern infatti, viene presentato tramite il nome, il problema a cui può essere applicato, la soluzione (non in un caso particolare), le conseguenze. In particolare ogni pattern viene descritto tramite l'elenco degli elementi a loro parere maggiormente caratterizzanti:
Nome e classificazione: importante per il vocabolario utilizzato nel progetto
Scopo: breve descrizione di cosa fa il pattern e suo fondamento logico
Nomi alternativi (se ve ne sono): molti pattern sono conosciuti con più nomi
Motivazione: descrizione di uno scenario che illustra un problema di progettazione e la soluzione offerta
Applicabilità: quando può essere applicato il pattern
Struttura (o modello): rappresentazione grafica delle classi del pattern mediante una notazione (in questa sede si utilizzerà UML, ma sul libro al cui nascita è antecedente alla nascita di UML, vengono utilizzati OMT di Rumbaugh, e i diagrammi di iterazione di Booch)
Partecipanti: le classi/oggetti con le proprie responsabilità
Collaborazioni: come collaborano i partecipanti per poter assumersi le responsabilità
Conseguenze: pro e contro dell'applicazione del pattern
Implementazione: come si può implementare il pattern
Codice d'esempio: frammenti di codice che aiutano nella comprensione del pattern (in questa sede si utilizzerà Java, ma sul libro al cui nascita è antecedente alla nascita di Java, vengono utilizzati C++ e SmallTalk)
Pattern correlati: relazioni con altri pattern
Utilizzi noti: esempi di utilizzo reale del pattern in sistemi esistenti
I 23 pattern presentati nel libro dei Gof sono classificati in tre categorie principali, basandosi sullo scopo del pattern:
Pattern creazionali: propongono soluzioni per creare oggetti
Pattern strutturali: propongono soluzioni per la composizione strutturale di classi e oggetti
Pattern comportamentali: propongono soluzioni per gestire il modo in cui vengono suddivise le responsabilità delle classi e degli oggetti
Inoltre viene anche fatta una distinzione sulla base del raggio d'azione del pattern:
Class pattern: offrono soluzioni tramite classi e sottoclassi in relazioni statiche tra loro
Object Pattern: offrono soluzioni dinamiche basate sugli oggetti
Possiamo riassumere i 23 pattern del libro dei Gof tramite questa tabella:
| Scopo |
||||
|---|---|---|---|---|
|
|
Creazionale |
Strutturale |
Comportamentale |
|
| Raggio D'azione |
Class
|
Factory Method |
Adapter (class) |
Interpreter |
| Object |
Abstract
Factory |
Adapter
(object) |
Chain
of responsability |
|