Design Patterns Applied

annuncio pubblicitario
Design Patterns Applied
Andrea Saltarello
Software Architect – Managed Designs S.r.l.
http://blogs.ugidotnet.org/pape
Sponsor
Parliamo di…
• Architettura e OOD
• Design Pattern
• Enterprise Application design
Cosa è il Design?
• E’ la fase di progettazione di un sistema.
• La progettazione è la fase nella quale
vengono presi in considerazione tutti i
requisiti non funzionali (HA, scalabilità,
integrabilità, …) del sistema:
– l’analisi si concentra su cosa debba fare il sistema
– il design si concentra su come debba farlo
• Dobbiamo concepire l’architettura del
nostro sistema.
Cosa è l’Architettura?
Secondo la definizione ANSI/IEEE Std
1471-2000:
“L’organizzazione basilare di un sistema, rappresentato
dalle sue componenti, dalle relazioni che esistono tra
di loro e con l’ambiente circostante, e dai principi che
governano la sua progettazione e evoluzione."
Object Oriented Design 101
Come procedere? Secondo l’autorevole “Gangs of
Four”:
You must find pertinent objects, factor them into classes at
the right granularity, define class interfaces and inheritance
hierarchies, and estabilish key relationships among them.
In pratica, dobbiamo rielaborare il frutto dell’analisi
tenendo in considerazione le possibilità offerte
dall’orientamento all’oggetto. Un esempio? I
Design Pattern! 
Design Patterns Defined
"Each pattern describes a problem which
occurs over and over again in our
environment, and then describes the core
solution to that problem, in such a way that
you can use the solution a million times over,
without ever doing it the same way twice.“
Christoper Alexander
A Pattern Language, 1977
OOD: Design Patterns
I pattern costituiscono soluzioni
sperimentate a problemi concreti,
utilizzabili in contesti applicativi differenti.
Possiamo pensare ad un pattern come alla
descrizione, soluzione ed applicazione di
un problema comune fattorizzato in una
soluzione elegante.
Design Patterns 101
Proviamo ad ipotizzare un pattern:
dobbiamo isolare un problema ricorrente,
e formulare una soluzione generalmente
valida.
Facile! Pronti? Via!
Quanti interisti ci sono in sala? 
Serie A, stagione 2004/2005
CHIEVO-INTER
2-2
X
INTER-PALERMO
1-1
X
ATALANTA-INTER
2-3
2
INTER-PARMA
2-2
X
ROMA-INTER
3-3
X
INTER-UDINESE
3-1
1
MILAN-INTER
0-0
X
LECCE-INTER
2-2
X
INTER-LAZIO
1-1
X
FIORENTINA-INTER
1-1
X
INTER-BOLOGNA
2-2
X
CAGLIARI-INTER
3-3
X
INTER-JUVENTUS
2-2
X
Ecco il problema
ricorrente! 
Ora dobbiamo
formalizzare il
pattern
Design Patterns defined
Un pattern è contraddistinto da quattro
elementi:
• Nome: è utile per descrivere la sua funzionalità in una
o due parole.
• Problema: descrive la classe di problemi affrontata
dal pattern
• Soluzione: descrive in modo astratto come il pattern
risolve il problema. Descrive gli elementi che
compongono il design, le loro responsabilità e le
collaborazioni
• Conseguenze: sono importanti per poter valutare i
costi-benefici dell'utilizzo del pattern
“Utopia” pattern defined
Proviamo a formulare il pattern
• Nome: Utopia
• Problema: subirne sistematicamente uno in
meno degli altri
• Soluzione: Difensori decenti, attenzione e
all’occorrenza tanti calci nel…  [diagramma]
• Conseguenze: l’applicazione del pattern può
comportare la vittoria di Scudetto/Champion’s
League, in particolar modo in combinazione a
CooperativePlay
Design Patterns unleashed
Il Testo di riferimento è:
Design Patterns: Elements of Reusable
Object-Oriented Software di Erich Gamma,
Richard Helm, Ralph Johnson e John
Vlissides
Sono loro la “Gang of Four”
Design Patterns applied
I design pattern ci aiutano a risolvere
problemi di tutti i giorni. Esempi:
• Ricordate VB6? La default instance si ottiene
con Singleton
• Ricordate ADODB? La dipendenza dal provider
si elimina con Factory Method
Design Patterns applied: Singleton
Problema: Ensure a class has only one
instance and provide a global point of
access to it.
Design Patterns applied: Factory method
Problema: Define an interface for creating
an object, but let subclasses decide which
class to instantiate. Factory Method lets a
class defer instantiation to subclasses.
Dice il saggio…
Non dobbiamo pensare ai pattern come
a dogmi, bensì come alle centurie di
Nostradamus: vanno interpretati 
Design Patterns applied
Basta con gli esempi sintetici: mettiamo i
pattern alla prova in una applicazione
reale!
Ipotizziamo una applicazione enterprise con
i “soliti” requisiti:
• DB-independent (tecnologia e struttura)
• GUI-independent (almeno Win e Web)
Enterprise application design
Per soddisfare i requisiti, optiamo per una
architettura a 3 livelli:
• Concentrare la logica applicativa nel
business layer rende agevole
implementare GUI eterogenee
• Isolare l’accesso ai dati in un DAL (Data
Access Layer) permette di disaccoppiare
la business logic dal DB
OOD: Business Entities
Per disaccoppiare l’applicazione dalla
struttura del DB, modelliamo come classi
le strutture dati gestite.
Ci ispiriamo al pattern Domain Model [P of
EAA, 116]
“Domain Model” pattern
An object model of the domain that incorporates
both behavior and data.
At its worst business logic can be very complex.
Rules and logic describe many different cases
and slants of behavior, and it's this complexity
that objects were designed to work with. A
Domain Model creates a web of interconnected
objects, where each object represents some
meaningful individual, whether as large as a
corporation or as small as a single line on an
order form.
OOD: il data layer
Il DAL incapsula l’accesso al database, al
fine di disaccoppiare la business logic
dalla tecnologia di storage. Utilizziamo il
pattern Table Data Gateway [P of EAA,
144]
“Table Data Gateway” pattern
An object that acts as a Gateway to a database
table. One instance handles all the rows in the
table.
A Table Data Gateway holds all the SQL for
accessing a single table or view: selects, inserts,
updates, and deletes. Other code calls its
methods for all interaction with the database.
“Table Data Gateway” (TDG) revised
La nostra applicazione disporrà di un DAL
specifico per ogni DBMS supportato; definiamo
quindi un TDG astratto (es: interfaccia) che sarà
implementato dai DAL.
La business logic riceverà un riferimento al DAL
attivo, che sarà attivato da una Abstract
Factory [GoF, 87]
La formulazione accademica di TDG riceve in
ingresso i valori dei campi come parametri
indipendenti: per rinforzare l’indipendenza dalla
struttura del DB, noi utilizzeremo come
parametri istanze delle business entities
Domain Model strikes back
Che succede se chiediamo al DAL una
ricerca per codice/chiave e l’elemento
corrispondente non esiste nel DB?
Restituire un null non è una soluzione,
perché “rompe” il polimorfismo.
Usiamo il pattern Special Case [P of EAA,
496]
“Special Case” pattern
A subclass that provides special behavior for
particular cases.
Nulls are awkward things in object-oriented
programs because they defeat polymorphism.
(…) Instead of returning null, or some odd value,
return a Special Case that has the same
interface as what the caller expects
DAL: un approccio futuristico
Se avessimo a disposizione un ORM
(ObjectSpaces… Se ci sei, batti un colpo!
) potremmo usare il pattern Adapter
[GoF, 139] per trasformarne l’interfaccia in
quella del DAL/TDG.
OOD: Business Layer
Per prima cosa, dobbiamo esporre alla GUI
le funzionalità OLTP offerte dallo strato
dati.
In pratica, implementiamo un Mapper [P of
EAA, 473] che funga da Gateway [P of
EAA, 466] verso il DAL
OOD: Biz Logic vs. DAL
Un modo interessante per disaccoppiare le
classi di business dal corrispettivo DAL
consiste nell’usare il pattern Inversion of
Control (IoC), ossia una applicazione del
pattern Plugin [P of EAA, 499]
“Inversion of Control” pattern
IoC è anche definito Dependency
Injection, e consiste nel far pubblicare ad
una classe una API che permetta al
contesto di esecuzione di impostarne a
runtime le dipendenze. E’ utile per:
• Iniettare mock object
• Utilizzare light container per configurare
l’applicazione
Pattern vs. Idiomi
• Un pattern insiste sul paradigma
• Un idioma insiste sulla tecnologia
Es: Observer vs. Delegate/eventi
Riferimenti
Docs:
• IoC:
http://www.martinfowler.com/articles/injection.html
Pattern:
• GoF
http://www.dofactory.com
• P of EAA
http://www.martinfowler.com/eaaCatalog/index.html
Tool:
• NSpring:
http://sourceforge.net/projects/nspring
Links
http://www.ugidotnet.org
http://forum.ugidotnet.org
http://mobile.ugidotnet.org
Scarica