Post

Visualizzazione dei post con l'etichetta design patterns

I pattern di concorrenza: accesso a risorse condivise

Immagine
  Introduzione Definiremo alcuni concetti relativi all'accesso di risorse condivise, considereremo alcune situazioni critiche che possono presentarsi e analizzeremo le soluzioni esistenti in letteratura. Processo Definiamo in questa sede un Processo  come una sequenza di istruzioni svolte da un calcolatore per eseguire un programma P. Un processore è un dispositivo in grado di eseguire tali azioni. Un processore può alternare nel tempo l'esecuzione di istruzioni di programmi diversi, viceversa l'esecuzione di un programma può essere sospesa e ripresa più volte, anche su processori diversi. Il processo può dunque essere complessivamente svolto in tempi diversi e su processori diversi. Nota L'interruzione di un processo è un'operazione di solito in carico al sistema operativo, ma per i linguaggi interpretati o semi interpretati può anche essere gestito indirettamente dall'ambiente di run-time in cui avviene l'esecuzione. In ogni istante t un...

Behavioral Patterns

Immagine
Introduzione I behavioral patterns sono design patterns che si focalizzano su come gli oggetti di un sistema comunicano tra loro e svolgono le proprie funzioni. Si suddividono principalmente in Class Behavioral patterns, che usano l'ereditarietà per distribuire le funzioni alle varie sottoclassi,  ed i Behavioral Object patterns, che invece usano la composizione. Nel secondo caso ci un oggetto conterrà i riferimenti a uno o più (eventualmente tutti) gli altri oggetti con cui collabora.  Ne esamineremo i principali riassumendone le caratteristiche ed il funzionamento. Chain of Responsibility E' un   Behavioral Object pattern e riguarda la possibilità di inviare dei comandi ad un oggetto ma dando la possibilità di "evadere" quei comandi anche ad altri oggetti. In questo schema abbiamo in genere una gerarchia di oggetti,  in cui ad un nodo perviene un messaggio, ossia la richiesta di eseguire una certa funzione. Quel nodo potrebbe essere ...

Structural Patterns

Immagine
Pattern strutturali Ci sono vari modi conosciuti in letteratura in cui classi o oggetti possono combinarsi per ottenere nuovi oggetti, sia a livello statico/strutturale ossia a inerente le classi, che dinamicamente, a livello di istanza/oggetto. Ne presenterò i principali, sintetizzandone le caratteristiche.   Adapter  Anche detto wrapper , modifica l'interfaccia di una classe per renderla compatibile con l'interfaccia richiesta da un client esistente.  In questo pattern distinguiamo:  un client A, una classe o funzione che  utilizza un servizio avente una certa interfaccia IService una classe di servizi definita da una interfaccia IService un servizio B esistente "da adattare", che espone una interfaccia diversa da IService una classe "Adapter" che espone l'interfaccia IService utilizzando un oggetto di tipo B (in questo caso parliamo di object adapter ) o derivando dalla classe B (in questo caso parliamo di class adapter ) Abbiamo dunque due tipi di ad...

Creational Patterns

Immagine
Creational patterns Introduzione I Creational patterns sono un sottoinsieme dei design patterns che si prefigge di consentire il cambio dei tipi concreti utilizzati nelle classi senza bisogno di dover riscriverne il codice.  E' possibile che i tipi effettivi da usare siano stabiliti a design time o dinamicamente a run-time, e in quest'ultimo caso non sarà necessaria una ricompilazione. Quando una classe A crea imperativamente istanze di classi di tipo B, ad esempio per invocarne dei metodi o perché alcuni membri di A sono proprio di tipo B, si crea una dipendenza molto forte di A nei confronti di B, e rende una successiva sostituzione di B con una classe diversa, ad esempio derivata da B, impossibile a meno di cambiare il codice dei metodi di A che creano le istanze di B. Questa dipendenza palesemente viola il principio OCP (open/closed principle), che afferma che le entità dovrebbero essere aperte alle estensioni, ma chiuse alle modifiche, infatti in questo caso non c'è mo...