Ogni design ha un suo pattern, tutti hanno però un modello: che sia una tazza, un ap­par­ta­men­to o un abito. A nessuno verrebbe mai in mente l’idea di applicare il manico dentro una tazza, eccetto forse ai pro­dut­to­ri di articoli a scopo di di­ver­ti­men­to. Se seguite un corso di ceramica e volete rea­liz­za­re un vaso con il manico, la forma vi è co­no­sciu­ta in linea di massima, e quindi potremmo dire che questa forma è già presente nella vostra testa come uno schema pro­get­tua­le.

Con i programmi in­for­ma­ti­ci si verifica qualcosa di simile: de­ter­mi­na­ti processi tendono sempre a ripetersi, per questo è nata l’idea di creare dei modelli. Nella nostra guida sco­pri­re­te come questi schemi pro­get­tua­li (chiamati design pattern) possono sem­pli­fi­ca­re il lavoro di pro­gram­ma­zio­ne.

Cosa sono i design pattern?

Il termine “design pattern” è da at­tri­buir­si all’ar­chi­tet­to sta­tu­ni­ten­se Chri­sto­pher Alexander, che mise insieme in una raccolta tutti i modelli riu­ti­liz­za­bi­li. Il suo obiettivo era coin­vol­ge­re gli utenti futuri di edifici nella fase di pro­get­ta­zio­ne. Quest’idea è stata poi ripresa da diversi in­for­ma­ti­ci. La co­sid­det­ta Gang of Four (GoF), composta da Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides ha rap­pre­sen­ta­to un punto di svolta nei software design pattern con il libro “Design Patterns – Elements of Reusable Object-Oriented Software” (it. “Design Patterns: Elementi per il riuso di software ad oggetti) pub­bli­ca­to nel 1994.

Di cosa si tratta allora? Per ri­pren­de­re il nostro esempio di prima, per ogni tazza sono necessari sempre gli stessi elementi di base: un fondo, un corpo centrale e un manico, non importa se diventerà una tazza per caffè americano, espresso o tè. Qualcosa di simile si verifica durante la pro­gram­ma­zio­ne: i cicli do-while sono sempre inseriti all’inizio e alla fine; una con­di­zio­ne richiede sempre una decisione su cosa accade in caso di con­cor­dan­za e in caso di non con­cor­dan­za; un calcolo riporta il risultato della com­bi­na­zio­ne di variabili e, tra le varie cose, da tanti piccoli passaggi di pro­gram­ma­zio­ne nasce l’ese­cu­zio­ne del programma che ha sempre le stesse ca­rat­te­ri­sti­che per compiti precisi. Gli schemi pro­get­tua­li de­scri­vo­no come risolvere un problema.

Qui di seguito vi pre­sen­tia­mo un esempio molto semplice di software design pattern, in questo caso di factory method:

class tazze
{
private $tazzaMake;
private $tazzaModel;
public function __construct($make, $model)
{
$this->tazzaMake = $make;
$this->tazzaModel = $model;
}
public function getMakeAndModel()
{
return $this->tazzaMake .'' .$this->tazzaModel;
}
}
class TazzeMateriale
{
public static function create($make, $model)
{
return new Tazza($make, $model);
}
}
$espresso = TazzeMateriale::create('Tazza', 'Espresso'); // Oggetto creato
print_r($espresso->getMakeAndModel()); // Risultato "Tazza Espresso"

Lo stesso vale per i legami e i processi applicati in modo ciclico per risolvere compiti precisi nell’ese­cu­zio­ne dei programmi. L’esempio di codice si può ampliare a pia­ci­men­to, anche in altri settori, per prodotti del tutto diversi o altri processi. Ed è na­tu­ral­men­te solo un elemento di un software molto più ampio. Quindi gli schemi pro­get­tua­li devono essere con­si­de­ra­ti come modelli che si sono affermati nella pratica.

Che tipo di design pattern esistono?

I tipi di schemi pro­get­tua­li rap­pre­sen­ta­no i prin­ci­pa­li campi di ap­pli­ca­zio­ne dei software design pattern in essi as­sem­bla­ti.

Modelli strut­tu­ra­li

I co­sid­det­ti struc­tu­ral patterns sono degli schemi pre­im­po­sta­ti per i legami tra le classi. Con essi si mira a un’astra­zio­ne che possa co­mu­ni­ca­re anche con altre soluzioni; la parola chiave è pro­gram­ma­zio­ne di in­ter­fac­ce.

Modelli com­por­ta­men­ta­li

Con i be­ha­vio­ral pattern si modella il com­por­ta­men­to del software. Questi pattern sem­pli­fi­ca­no processi complessi di comando e controllo. Si può scegliere tra algoritmi e re­spon­sa­bi­li­tà di oggetti.

Modelli crea­zio­na­li

I crea­tio­nal patterns per­met­to­no di creare oggetti che rap­pre­sen­ta­no in modo sem­pli­fi­ca­to istanze precise, in­di­pen­den­te­men­te dal modo in cui i singoli oggetti sono creati e rap­pre­sen­ta­ti in un software.

Nel corso degli anni si sono aggiunti altri tipi di schemi pro­get­tua­li, che non rientrano in nessuna delle tre categorie citate. Di questi fanno parte i modelli di mappatura re­la­zio­na­li a oggetti, per me­mo­riz­za­re oggetti e relativi legami in una banca dati re­la­zio­na­le.

Pro e contro relativi all’utilizzo dei design pattern

Vantaggi

La pos­si­bi­li­tà di attingere a soluzioni valide va di pari passo con un risparmio di tempo e costi. I team di svi­lup­pa­to­ri non devono co­stan­te­men­te ripartire da zero per trovare una soluzione per un nuovo programma in caso di problemi già par­zial­men­te risolti. Di solito, i singoli schemi vengono de­no­mi­na­ti in base a un vo­ca­bo­la­rio comune di termini tecnici, sem­pli­fi­can­do in questo modo sia la di­scus­sio­ne tra svi­lup­pa­to­ri, sia la co­mu­ni­ca­zio­ne con l’utente de­sti­na­ta­rio della soluzione finale. Si sem­pli­fi­ca anche la do­cu­men­ta­zio­ne di un software, con­si­de­ra­to che possono essere uti­liz­za­te com­po­nen­ti già do­cu­men­ta­te in pre­ce­den­za. Tutti questi vantaggi aiutano nella fase di ma­nu­ten­zio­ne e ulteriore sviluppo di un programma.

Svantaggi

L’utilizzo degli schemi pro­get­tua­li richiede un ampio bagaglio di co­no­scen­ze pregresse. Inoltre, la di­spo­ni­bi­li­tà di design pattern può anche far credere che gli schemi pro­get­tua­li presenti possano risolvere quasi tutti i problemi. Detto in parole povere: questo può limitare la crea­ti­vi­tà e la curiosità di trovare soluzioni nuove (e migliori).

Quali sono i design pattern più noti?

Esistono più di settanta schemi pro­get­tua­li, ordinati in diverse categorie. Alcuni software design pattern im­por­tan­ti sono ad esempio (in grassetto nella spie­ga­zio­ne viene riportata per alcuni anche la de­no­mi­na­zio­ne in italiano):

Modelli crea­zio­na­li

  • Builder Pattern: il co­strut­to­re nella categoria dei pattern crea­zio­na­li separa lo sviluppo di oggetti (complessi) dalle loro rap­pre­sen­ta­zio­ni.
  • Factory Pattern: come pattern, il factory method crea un oggetto at­tra­ver­so il richiamo ad un metodo invece che a un co­strut­to­re.
  • Singleton Pattern: come pattern, il singleton fa in modo che per ogni classe esista solo un’unica istanza. Per di più un singleton è di­spo­ni­bi­le a livello globale.

Modelli strut­tu­ra­li

  • Composite Pattern: un pattern strut­tu­ra­le composto, chiamato in inglese composite, rivolto prin­ci­pal­men­te alle strutture dinamiche, per es. per l’or­ga­niz­za­zio­ne o la com­pres­sio­ne di dati.
  • Decorator Pattern: il co­sid­det­to decorator integra le classi esistenti di ulteriori fun­zio­na­li­tà o re­spon­sa­bi­li­tà.
  • Facade Pattern: il modello facciata rap­pre­sen­ta un’in­ter­fac­cia verso altri sistemi, sot­to­si­ste­mi o sub­si­ste­mi.

Modelli com­por­ta­men­ta­li

  • Observer Pattern: l’os­ser­va­to­re trasmette alle strutture le modifiche apportate a un oggetto, che dipendono dall’oggetto iniziale.
  • Strategy Pattern: la strategia definisce una famiglia di algoritmi in­ter­cam­bia­bi­li.
  • Visitor Pattern: il vi­si­ta­to­re permette di isolare le ope­ra­zio­ni ese­gui­bi­li, in modo da compiere nuove ope­ra­zio­ni senza mo­di­fi­ca­re le classi in­te­res­sa­te.
In sintesi

I design pattern mettono a di­spo­si­zio­ne modelli pre­im­po­sta­ti con i quali risolvere un problema esplicito, at­tin­gen­do da un progetto af­fi­da­bi­le. Il modello si co­strui­sce su un software design già esistente e coinvolge l’utente nella soluzione futura del processo di pro­get­ta­zio­ne. Inoltre, gli schemi pro­get­tua­li non sono legati a un lin­guag­gio di pro­gram­ma­zio­ne e sono quindi ap­pli­ca­bi­li a livello uni­ver­sa­le.

Vai al menu prin­ci­pa­le