Un Design Pattern si definisce, nell’ambito dell’ingegneria del software, come “una soluzione progettuale generale che può essere applicata ad una problematica ricorrente“. Più semplicemente, quando si parla di design pattern si fa riferimento ad un modello logico che può essere utilizzato per risolvere un problema comune, che si verifica generalmente durante le fasi di progettazione o di sviluppo di un software.

I design pattern orientati agli oggetti sono ideati per semplificare le relazioni tra oggetti distinti, essi sono realizzati ad alto livello, in modo del tutto indipendente rispetto alle eventuali classi applicative coinvolte.

Un anti-pattern rappresenta invece la denuncia di una soluzione sbagliata (ma in apparenza ragionevole) precedentemente fornita ad un problema.

Categorizzazione

Ad ogni pattern, in fase di rilascio, devono essere associate una serie di informazioni che ne descrivono il comportamento, tali informazioni dovranno essere rilasciate dallo sviluppatore del pattern assieme a quest’ultimo. Tra le diverse informazioni da allegare ad un pattern troviamo:

  • Nome, esplicativo ed evocativo, deve identificare chiaramente il pattern;
  • Contesto, descrizione delle situazioni in cui il problema ricorre e delle condizioni utili a risolverlo;
  • Problema, definizione del problema e scopo della soluzione;
  • Forze, elementi che mettono in evidenza le difficoltà del problema, gli scopi e i vincoli;
  • Soluzione, descrizione del procedimento che porta alla generazione della soluzione, questa viene spesso descritta mediante un diagramma UML della classi o tramite altri diagrammi che rappresentano l’evoluzione del procedimento di soluzione;
  • Esempi, la soluzione fornita dal pattern ad un determinato problema non deve essere legata ad uno specifico linguaggio di programmazione, tuttavia ad esso devono essere allegate una o più implementazioni d’esempio scritte in linguaggi differenti;
    Contesto risultate, descrizione del risultato finale, dei benefici e delle conseguenze, il contesto risultante mostra come sono state bilanciate le forze presenti nel sistema;
  • Ragionamento, evidenzia le motivazioni che rendono valida la soluzione, queste possono includere dimostrazioni e/o esperimenti;
    Pattern in relazione, elenco di pattern simili o di pattern che possono precedere/seguire il pattern corrente;
  • Usi conosciuti, alcuni esempi d’uso quotidiano che prevedono l’utilizzo del pattern in questione.

I meta-pattern vengono utilizzati per categorizzare e catalogare i singoli pattern.

L’informatico austriaco Wolfgang Pree ha identificato due elementi base utili a questa classificazione:

  1. Hook Method, sono metodi astratti che determiniamo il comportamento specifico delle sottoclassi. Questi rappresentano i “punti caldi” del sistema, i punti su cui si può intervenire per personalizzare e adattare lo schema risolutivo del pattern al caso corrente;
  2. Template Method, metodi che coordinano il funzionamento di più Hook Method. Questi sono i “punti freddi”, gli elementi di invariabilità del pattern.

Gli Hook Method e i Template Method possono relazionarsi in diversi modi:

  • Unification, template e hook sono presenti nella stessa classe del framework;
  • Separation, hook e template sono presenti in classi diverse indicate rispettivamente come hook class e template class;
  • Connettion e recursive connection, hook e template sono contenuti in classi tra loro in relazione.