SlideShare uma empresa Scribd logo
1 de 18
Baixar para ler offline
XPUG Marche – 3° Meeting




                           Design Pattern
                                in pratica




                                     Stefano Leli
                                    Roberto Sileoni
“Once you understand the design pattern and
have had an 'Aha!' experience with them, you
won't ever think about object-oriented design
              in the same way ”




                         Gamma, Helm, Johnson, Vlissides
Design Pattern
Un design pattern può essere definito come una soluzione progettuale
  generale a un problema ricorrente


Serve a …
• Progettare e implementare software flessibile e capace di evolvere
• Dominare la complessità di un Sistema Software


Ogni Design Pattern ha:
• un nome
• un campo di applicabilità
• uno schema di soluzione
• una descrizione delle conseguenze della sua applicazione.
Storia
Termine coniato nel 1977 da Christopher Alexander

Introdotti nell'ingegneria informatica da Gamma, Helm, Johnson
   e Vlissides (Gang of Four) attraverso il libro Design Patterns:
   Elements of Reusable Object-Oriented Software

Si suddividono in:
• Crezionali: astraggono il processo di istanziazione
• Strutturali: si occupa della composizione degli oggetti
• Comportamentali: sgestiscono le responsabilità tra oggetti
Codice Iniziale:
un cocktail bar
Cocktail Bar
Cocktail Bar
                              public interface Cocktail
                              {
                                   double Cost {get;}
                                   string Description {get;}
                              }




public class Daiquiri : Cocktail                   public class Mojito : Cocktail
{                                                  {
     public double Cost                                 public double Cost
     {                                                  {
          get {return 4.5;}                                  get {return 5;}
     }                                                  }

    public string Description                           public string
    {                                              Description
         get{return "Daiquiri";}                        {
    }                                                        get{return "Mojito";}
}                                                       }
                                                   }
Cocktail Bar
public class Bill
{
      List<Cocktail> cocktails;

     public Bill()
     {
          cocktails = new List<Cocktail>();
     }

     public void AddCocktail(Cocktail cocktail)
     {
                cocktails.Add(cocktail);
     }

     public string GenerateReport()
     {
          string report = "";
          foreach (Cocktail cocktail in cocktails)
                report += cocktail.Description + ":t" + cocktail.Cost;

           report += "nTOTALE:t" + this.Calculate() + "n";
           return report;
     }

     public double Calculate()
     {
          double cal = 0;
          foreach (Cocktail cocktail in cocktails)
                cal += cocktail.Cost;
          return cal;
     }
}
Iniziano le nuove richieste:
         Gli Extra
Nuove Richieste: Gli extra
Si vogliono poter aggiungere degli extra al cocktail ed in particolare:
 - Absolut: aggiunta di alcol extra (+ 2 Euro)
 - On the Rocks: aggiunta di ghiaccio (+ 0,5 Euro)
 - Double: cocktail doppio (+ 80%)



Gli extra sono applicabili a tutti i cocktail e combinabili tra loro:

  - Mojito Absolute On the Rocks
  - Daiquiri Double
Dibattito
Pattern Decorator
Intento: Aggiungere responsabilità addizionali agli oggetti in maniera dinamica

Motivazione: supponiamo in una GUI di avere un oggetto di tipo TextView e vogliamo aggiungervi responsabilità come
    bordi, scrollbar, ecc. Potremmo decidere di farlo tramite ereditarietà, ma in tal modo il meccanismo sarebbe statico
    (il client non può controllare quando e come aggiungere un bordo). Il decorator rende l’estensione trasparente
    all’interfaccia del componente che decora

Applicabilità: Il Decorator andrebbe usato:
•    Per aggiungere responsabilità ad oggetti dinamicamente e trasparentemente;
•    Per aggiungere responsabilità che possono essere eliminate;
•    Quando l’estensione tramite subclassing si rivela poco pratica (es. un cospicuo   numero di estensioni produrrebbe
     un’esplosione delle sottoclassi per supportare ogni combinazione).

Struttura:
Decorator in Cocktail Bar
Ancora richieste:
 Cocktail Light
Nuove Richieste: Cocktail Light

Il marketing decide che gli "astemi" vanno premiati e decidono di scontare le
versioni analcoliche dei cocktail (-0,5 Euro).

Per fare questo si potrebeb creare un nuovo extra (decorator) chiamato Light

A questo punto iniziano i problemi
  - I decorator cominciano ad essere tanti e di difficile gestione.
  - Sorgono delle inconguenza (Absolut Light Daiquiri???).




                            Come Fare?
Dibattito
Pattern Factory
Intento: definire un’interfaccia per la creazione di un oggetto, delegando alle sottoclassi la decisione su quali classi
     istanziare.

Motivazione: consideriamo un framework che presenta documenti multipli agli utenti. Le classi chiave sono Application
    e Document, entrambe astratte. Per creare un’applicazione per disegnare, occorre creare le classi
    DrawingApplication e DrawingDocument. Il pattern sposta all’esterno del framework la conoscenza di quale
    sottoclasse di documenti creare.

Applicabilità: il pattern può essere utilizzato quando:
•     Una classe non può conoscere in anticipo la classe di oggetti che deve creare;
•     Una classe desidera che le proprie sottoclassi specifichino gli oggetti che creano;
•     Una classe delega responsabilità ad una delle proprie sottoclassi, e occorre localizzare la conoscenza della classe a
     cui delegare

Struttura:
Domande?

Mais conteúdo relacionado

Semelhante a Design Pattern In Pratica

PyPaPi Qt Java Framework
PyPaPi Qt Java FrameworkPyPaPi Qt Java Framework
PyPaPi Qt Java FrameworkTiziano Lattisi
 
Regole e princìpi e tecniche di programmazione
Regole e princìpi e tecniche di programmazioneRegole e princìpi e tecniche di programmazione
Regole e princìpi e tecniche di programmazioneAndrea Colleoni
 
Html5 e css3 nuovi strumenti per un nuovo web
Html5 e css3 nuovi strumenti per un nuovo webHtml5 e css3 nuovi strumenti per un nuovo web
Html5 e css3 nuovi strumenti per un nuovo webMassimo Bonanni
 
Distribuire una libreria Java per usarla come dipendenza gradle
Distribuire una libreria Java per usarla come dipendenza gradleDistribuire una libreria Java per usarla come dipendenza gradle
Distribuire una libreria Java per usarla come dipendenza gradlePaolo Montalto
 
Qt Lezione4 Parte1: creare un custom widget plugin
Qt Lezione4 Parte1: creare un custom widget pluginQt Lezione4 Parte1: creare un custom widget plugin
Qt Lezione4 Parte1: creare un custom widget pluginPaolo Sereno
 
DDAY2014 - Performance in Drupal 8
DDAY2014 - Performance in Drupal 8DDAY2014 - Performance in Drupal 8
DDAY2014 - Performance in Drupal 8DrupalDay
 
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...Davide Cerbo
 
Design Pattern Strutturali
Design Pattern StrutturaliDesign Pattern Strutturali
Design Pattern StrutturaliRiccardo Cardin
 
Lezione 8: Design Pattern Comportamentali
Lezione 8: Design Pattern ComportamentaliLezione 8: Design Pattern Comportamentali
Lezione 8: Design Pattern ComportamentaliAndrea Della Corte
 
MongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDBMongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDBStefano Dindo
 
Docker vs Virtualizzazioni
Docker vs VirtualizzazioniDocker vs Virtualizzazioni
Docker vs VirtualizzazioniGiuliano Latini
 
Integrazione continua con TFS Build
Integrazione continua con TFS BuildIntegrazione continua con TFS Build
Integrazione continua con TFS BuildGian Maria Ricci
 
Introduzione a WebGL
Introduzione a WebGLIntroduzione a WebGL
Introduzione a WebGLnigerpunk
 
Tesi Marco Ventura
Tesi Marco VenturaTesi Marco Ventura
Tesi Marco Venturaguest335584
 
20050621 Ridurre il Costo del Cambiamento Applicando il Design Object Oriente...
20050621 Ridurre il Costo del Cambiamento Applicando il Design Object Oriente...20050621 Ridurre il Costo del Cambiamento Applicando il Design Object Oriente...
20050621 Ridurre il Costo del Cambiamento Applicando il Design Object Oriente...Francesco Cirillo
 
DotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptDotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptSinergia Totale
 
Flavio atzeni smau mi 2013
Flavio atzeni smau  mi 2013Flavio atzeni smau  mi 2013
Flavio atzeni smau mi 2013Paradisi63
 

Semelhante a Design Pattern In Pratica (20)

PyPaPi Qt Java Framework
PyPaPi Qt Java FrameworkPyPaPi Qt Java Framework
PyPaPi Qt Java Framework
 
Regole e princìpi e tecniche di programmazione
Regole e princìpi e tecniche di programmazioneRegole e princìpi e tecniche di programmazione
Regole e princìpi e tecniche di programmazione
 
Html5 e css3 nuovi strumenti per un nuovo web
Html5 e css3 nuovi strumenti per un nuovo webHtml5 e css3 nuovi strumenti per un nuovo web
Html5 e css3 nuovi strumenti per un nuovo web
 
VS Package @ CD2008
VS Package @ CD2008VS Package @ CD2008
VS Package @ CD2008
 
Distribuire una libreria Java per usarla come dipendenza gradle
Distribuire una libreria Java per usarla come dipendenza gradleDistribuire una libreria Java per usarla come dipendenza gradle
Distribuire una libreria Java per usarla come dipendenza gradle
 
Qt Lezione4 Parte1: creare un custom widget plugin
Qt Lezione4 Parte1: creare un custom widget pluginQt Lezione4 Parte1: creare un custom widget plugin
Qt Lezione4 Parte1: creare un custom widget plugin
 
DDAY2014 - Performance in Drupal 8
DDAY2014 - Performance in Drupal 8DDAY2014 - Performance in Drupal 8
DDAY2014 - Performance in Drupal 8
 
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...
 
Design Pattern Strutturali
Design Pattern StrutturaliDesign Pattern Strutturali
Design Pattern Strutturali
 
Lezione 8: Design Pattern Comportamentali
Lezione 8: Design Pattern ComportamentaliLezione 8: Design Pattern Comportamentali
Lezione 8: Design Pattern Comportamentali
 
MongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDBMongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDB
 
Docker vs Virtualizzazioni
Docker vs VirtualizzazioniDocker vs Virtualizzazioni
Docker vs Virtualizzazioni
 
Diagrammi delle Classi
Diagrammi delle ClassiDiagrammi delle Classi
Diagrammi delle Classi
 
Integrazione continua con TFS Build
Integrazione continua con TFS BuildIntegrazione continua con TFS Build
Integrazione continua con TFS Build
 
Introduzione a WebGL
Introduzione a WebGLIntroduzione a WebGL
Introduzione a WebGL
 
Tesi Marco Ventura
Tesi Marco VenturaTesi Marco Ventura
Tesi Marco Ventura
 
Yagwto
YagwtoYagwto
Yagwto
 
20050621 Ridurre il Costo del Cambiamento Applicando il Design Object Oriente...
20050621 Ridurre il Costo del Cambiamento Applicando il Design Object Oriente...20050621 Ridurre il Costo del Cambiamento Applicando il Design Object Oriente...
20050621 Ridurre il Costo del Cambiamento Applicando il Design Object Oriente...
 
DotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptDotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScript
 
Flavio atzeni smau mi 2013
Flavio atzeni smau  mi 2013Flavio atzeni smau  mi 2013
Flavio atzeni smau mi 2013
 

Mais de Stefano Leli

Agile quackery a brief history of the worst ways to cure everything
Agile quackery   a brief history of the worst ways to cure everythingAgile quackery   a brief history of the worst ways to cure everything
Agile quackery a brief history of the worst ways to cure everythingStefano Leli
 
Agile goes Hollywood - Un approccio empirico alle trasformazioni agili
Agile goes Hollywood - Un approccio empirico alle trasformazioni agiliAgile goes Hollywood - Un approccio empirico alle trasformazioni agili
Agile goes Hollywood - Un approccio empirico alle trasformazioni agiliStefano Leli
 
Succeding with feature teams
Succeding with feature teamsSucceding with feature teams
Succeding with feature teamsStefano Leli
 
La tua prima kanban board
La tua prima kanban boardLa tua prima kanban board
La tua prima kanban boardStefano Leli
 
Agile retrospective,an example
Agile retrospective,an exampleAgile retrospective,an example
Agile retrospective,an exampleStefano Leli
 
User stories writing - Codemotion 2013
User stories writing   - Codemotion 2013User stories writing   - Codemotion 2013
User stories writing - Codemotion 2013Stefano Leli
 
User Stories Writing
User Stories WritingUser Stories Writing
User Stories WritingStefano Leli
 
Codice legacy, usciamo dal pantano! @iad11
Codice legacy, usciamo dal pantano! @iad11Codice legacy, usciamo dal pantano! @iad11
Codice legacy, usciamo dal pantano! @iad11Stefano Leli
 
Il project manager e lo sviluppo agile. Separati in casa?
Il project manager e lo sviluppo agile. Separati in casa?Il project manager e lo sviluppo agile. Separati in casa?
Il project manager e lo sviluppo agile. Separati in casa?Stefano Leli
 
Codice legacy, usciamo dal pantano!
Codice legacy, usciamo dal pantano!Codice legacy, usciamo dal pantano!
Codice legacy, usciamo dal pantano!Stefano Leli
 
Workshop Su Refactoring
Workshop Su RefactoringWorkshop Su Refactoring
Workshop Su RefactoringStefano Leli
 
Intoduzione Alle Metodologie Agili
Intoduzione Alle Metodologie AgiliIntoduzione Alle Metodologie Agili
Intoduzione Alle Metodologie AgiliStefano Leli
 

Mais de Stefano Leli (12)

Agile quackery a brief history of the worst ways to cure everything
Agile quackery   a brief history of the worst ways to cure everythingAgile quackery   a brief history of the worst ways to cure everything
Agile quackery a brief history of the worst ways to cure everything
 
Agile goes Hollywood - Un approccio empirico alle trasformazioni agili
Agile goes Hollywood - Un approccio empirico alle trasformazioni agiliAgile goes Hollywood - Un approccio empirico alle trasformazioni agili
Agile goes Hollywood - Un approccio empirico alle trasformazioni agili
 
Succeding with feature teams
Succeding with feature teamsSucceding with feature teams
Succeding with feature teams
 
La tua prima kanban board
La tua prima kanban boardLa tua prima kanban board
La tua prima kanban board
 
Agile retrospective,an example
Agile retrospective,an exampleAgile retrospective,an example
Agile retrospective,an example
 
User stories writing - Codemotion 2013
User stories writing   - Codemotion 2013User stories writing   - Codemotion 2013
User stories writing - Codemotion 2013
 
User Stories Writing
User Stories WritingUser Stories Writing
User Stories Writing
 
Codice legacy, usciamo dal pantano! @iad11
Codice legacy, usciamo dal pantano! @iad11Codice legacy, usciamo dal pantano! @iad11
Codice legacy, usciamo dal pantano! @iad11
 
Il project manager e lo sviluppo agile. Separati in casa?
Il project manager e lo sviluppo agile. Separati in casa?Il project manager e lo sviluppo agile. Separati in casa?
Il project manager e lo sviluppo agile. Separati in casa?
 
Codice legacy, usciamo dal pantano!
Codice legacy, usciamo dal pantano!Codice legacy, usciamo dal pantano!
Codice legacy, usciamo dal pantano!
 
Workshop Su Refactoring
Workshop Su RefactoringWorkshop Su Refactoring
Workshop Su Refactoring
 
Intoduzione Alle Metodologie Agili
Intoduzione Alle Metodologie AgiliIntoduzione Alle Metodologie Agili
Intoduzione Alle Metodologie Agili
 

Design Pattern In Pratica

  • 1. XPUG Marche – 3° Meeting Design Pattern in pratica Stefano Leli Roberto Sileoni
  • 2. “Once you understand the design pattern and have had an 'Aha!' experience with them, you won't ever think about object-oriented design in the same way ” Gamma, Helm, Johnson, Vlissides
  • 3. Design Pattern Un design pattern può essere definito come una soluzione progettuale generale a un problema ricorrente Serve a … • Progettare e implementare software flessibile e capace di evolvere • Dominare la complessità di un Sistema Software Ogni Design Pattern ha: • un nome • un campo di applicabilità • uno schema di soluzione • una descrizione delle conseguenze della sua applicazione.
  • 4. Storia Termine coniato nel 1977 da Christopher Alexander Introdotti nell'ingegneria informatica da Gamma, Helm, Johnson e Vlissides (Gang of Four) attraverso il libro Design Patterns: Elements of Reusable Object-Oriented Software Si suddividono in: • Crezionali: astraggono il processo di istanziazione • Strutturali: si occupa della composizione degli oggetti • Comportamentali: sgestiscono le responsabilità tra oggetti
  • 7. Cocktail Bar public interface Cocktail { double Cost {get;} string Description {get;} } public class Daiquiri : Cocktail public class Mojito : Cocktail { { public double Cost public double Cost { { get {return 4.5;} get {return 5;} } } public string Description public string { Description get{return "Daiquiri";} { } get{return "Mojito";} } } }
  • 8. Cocktail Bar public class Bill { List<Cocktail> cocktails; public Bill() { cocktails = new List<Cocktail>(); } public void AddCocktail(Cocktail cocktail) { cocktails.Add(cocktail); } public string GenerateReport() { string report = ""; foreach (Cocktail cocktail in cocktails) report += cocktail.Description + ":t" + cocktail.Cost; report += "nTOTALE:t" + this.Calculate() + "n"; return report; } public double Calculate() { double cal = 0; foreach (Cocktail cocktail in cocktails) cal += cocktail.Cost; return cal; } }
  • 9. Iniziano le nuove richieste: Gli Extra
  • 10. Nuove Richieste: Gli extra Si vogliono poter aggiungere degli extra al cocktail ed in particolare: - Absolut: aggiunta di alcol extra (+ 2 Euro) - On the Rocks: aggiunta di ghiaccio (+ 0,5 Euro) - Double: cocktail doppio (+ 80%) Gli extra sono applicabili a tutti i cocktail e combinabili tra loro: - Mojito Absolute On the Rocks - Daiquiri Double
  • 12. Pattern Decorator Intento: Aggiungere responsabilità addizionali agli oggetti in maniera dinamica Motivazione: supponiamo in una GUI di avere un oggetto di tipo TextView e vogliamo aggiungervi responsabilità come bordi, scrollbar, ecc. Potremmo decidere di farlo tramite ereditarietà, ma in tal modo il meccanismo sarebbe statico (il client non può controllare quando e come aggiungere un bordo). Il decorator rende l’estensione trasparente all’interfaccia del componente che decora Applicabilità: Il Decorator andrebbe usato: • Per aggiungere responsabilità ad oggetti dinamicamente e trasparentemente; • Per aggiungere responsabilità che possono essere eliminate; • Quando l’estensione tramite subclassing si rivela poco pratica (es. un cospicuo numero di estensioni produrrebbe un’esplosione delle sottoclassi per supportare ogni combinazione). Struttura:
  • 15. Nuove Richieste: Cocktail Light Il marketing decide che gli "astemi" vanno premiati e decidono di scontare le versioni analcoliche dei cocktail (-0,5 Euro). Per fare questo si potrebeb creare un nuovo extra (decorator) chiamato Light A questo punto iniziano i problemi - I decorator cominciano ad essere tanti e di difficile gestione. - Sorgono delle inconguenza (Absolut Light Daiquiri???). Come Fare?
  • 17. Pattern Factory Intento: definire un’interfaccia per la creazione di un oggetto, delegando alle sottoclassi la decisione su quali classi istanziare. Motivazione: consideriamo un framework che presenta documenti multipli agli utenti. Le classi chiave sono Application e Document, entrambe astratte. Per creare un’applicazione per disegnare, occorre creare le classi DrawingApplication e DrawingDocument. Il pattern sposta all’esterno del framework la conoscenza di quale sottoclasse di documenti creare. Applicabilità: il pattern può essere utilizzato quando: • Una classe non può conoscere in anticipo la classe di oggetti che deve creare; • Una classe desidera che le proprie sottoclassi specifichino gli oggetti che creano; • Una classe delega responsabilità ad una delle proprie sottoclassi, e occorre localizzare la conoscenza della classe a cui delegare Struttura: