SlideShare a Scribd company logo
1 of 43
Download to read offline
OOP... Object Whaaat?
A story of engineers, bricks and gears




                                         by Diego Giorgini - @ogeidix
Quello che ci hanno insegnato a scuola non è tutto
quello che serve per vincere la sfida...
La nostra sfida è costruire progetti complessi
Ma come?
Ma come? ...ok, nel software?


Programmazione procedurale e strutturata
Paradigma di programmazione che prevede l’utilizzo chiamate a blocchi di codice detti
subroutine o anche sottoprogrammi.
Le subroutine possono inoltre essere associate a strutture dati così da mantenere allineata
la struttura del programma con quella dei dati.
                                                                         [tratta da wikipedia]
Ma come? ...ok, nel software?


Programmazione procedurale e strutturata
Paradigma di programmazione che prevede l’utilizzo chiamate a blocchi di codice detti
subroutine o anche sottoprogrammi.
Le subroutine possono inoltre essere associate a strutture dati così da mantenere allineata
la struttura del programma con quella dei dati.
                                                                         [tratta da wikipedia]


Programmazione ad oggetti
La programmazione orientata agli oggetti (Object Oriented Programming, in breve OOP) è
uno stile di programmazione che deriva da quello classico procedurale, e può essere
considerato una sua estensione. Consiste essenzialmente nella creazione di strutture
dati gerarchiche e combina i dati insieme alle operazioni che li manipolano
                                                                   [tratta da un sito internet]
Ma come? ...ok, nel software?
Gli obiettivi che riusciamo a raggiungere


   Scomposizione del problema in sotto problemi
   Suddivisione del lavoro in più sviluppatori
   Modularizzazione del progetto
Gli obiettivi che riusciamo a raggiungere


   Scomposizione del problema in sotto problemi
   Suddivisione del lavoro in più sviluppatori
   Modularizzazione del progetto



           Sono gli stessi obiettivi raggiunti
          dalla programmazione procedurale!
Gli obiettivi che riusciamo a raggiungere


   Scomposizione del problema in sotto problemi
   Suddivisione del lavoro in più sviluppatori
   Modularizzazione del progetto



           Sono gli stessi obiettivi raggiunti
          dalla programmazione procedurale!

Stiamo facendo programmazione procedurale con
              una sintassi diversa
Gli obiettivi che riusciamo a raggiungere


   Scomposizione del problema in sotto problemi
   Suddivisione del lavoro in più sviluppatori
   Modularizzazione del progetto
Gli obiettivi che riusciamo a raggiungere


   Scomposizione del problema in sotto problemi
   Suddivisione del lavoro in più sviluppatori
   Modularizzazione del progetto


            sono comunque ottimi:
Gli obiettivi che riusciamo a raggiungere


   Scomposizione del problema in sotto problemi
   Suddivisione del lavoro in più sviluppatori
   Modularizzazione del progetto


            sono comunque ottimi:
                 per realizzare un progetto definito
Gli obiettivi che riusciamo a raggiungere


   Scomposizione del problema in sotto problemi
   Suddivisione del lavoro in più sviluppatori
   Modularizzazione del progetto


            sono comunque ottimi:
                 per realizzare un progetto definito
                 per un progetto che resta fisso nel tempo
Gli obiettivi che riusciamo a raggiungere


   Scomposizione del problema in sotto problemi
   Suddivisione del lavoro in più sviluppatori
   Modularizzazione del progetto


            sono comunque ottimi:
                 per realizzare un progetto definito
                 per un progetto che resta fisso nel tempo


   Purtroppo non stiamo costruendo un palazzo
Gli obiettivi che riusciamo a raggiungere


   Scomposizione del problema in sotto problemi
   Suddivisione del lavoro in più sviluppatori
   Modularizzazione del progetto
Gli obiettivi che riusciamo a raggiungere


   Scomposizione del problema in sotto problemi
   Suddivisione del lavoro in più sviluppatori
   Modularizzazione del progetto


Le necessità dello sviluppo software includono però:
Gli obiettivi che riusciamo a raggiungere


   Scomposizione del problema in sotto problemi
   Suddivisione del lavoro in più sviluppatori
   Modularizzazione del progetto


Le necessità dello sviluppo software includono però:
   Flessibilità di fronte al cambiamento
   Riuso reale del codice
   Mantenere il sistema aperto alla crescita
Le necessità dello sviluppo software richiedono

  Non moduli statici
Le necessità dello sviluppo software richiedono

  Non moduli statici




                            ma entità dinamiche
Entità dinamiche



   L’attenzione è sul comportamento dinamico

   Il progetto è il risultato della
   collaborazione di diverse entità
Entità dinamiche


Permettono di modificare il comportamento
del sistema inserendo nuove entità con
comportamenti differenti



Il sistema è flessibile a nuove
richieste senza bisogno di
modificare quanto realizzato
Entità dinamiche

   “Il tuo design è corretto se ogni nuova
   modifica al progetto richiede meno codice
   della modifica precedente”
                             Matteo Vaccari - @xpmatteo
Progettare entità dinamiche


Il diagramma delle classi? Statico!

Il comportamento viene descritto dal
diagramma di collaborazione
Progettare entità dinamiche

Una automobile          ... statica
Class diagram:
                                  1          1    Volante
           Centralina             1          3

                 1      1                         Pedale
                 2          1 1


        Ruota                            1       Cruscotto
                        2
                                      1..*
          RuotaMotrice                             Luci
Progettare entità dinamiche

Una automobile            ... statica - dinamica
                                                  Collaboration diagram:
                                                             1: Accensione delle frecce
    FrecciaDx:Luce                          1.1 turn_on

                                                                 :Volante
      Stop:Luce           2.1 turn_on
                                                2: Frenata                       1.2 turning_right

                          2.2 brake
                                                 Freno:Pedale
     :Centralina
            2.2.1 brake

                                        2.2.1 braking

    RuotaMDx:RuotaMotrice                                     :Cruscotto
Progettare entità dinamiche

Una automobile               ... statica - dinamica

Class diagram:
                  riceve
                  informazioni da                comunica dati alle
     Centralina                       Pedale                                Luci

Comanda delle                                               ricevono dati dal




                  comunica dati al               riceve dati dal
  RuotaMotrice                       Cruscotto                           Volante
Progettiamo il comportamento delle entità



1. Devono essere educate tra di loro

2. Devono essere educate verso il programmatore

3. Devono essere predisposte per la collaborazione
Progettiamo il comportamento delle entità




1. Devono essere educate tra di loro
Educazione verso gli altri oggetti


  Keep it shy

  “The best code is very shy.
  Like a four-year old hiding behind a mother’s
  skirt, code shouldn’t reveal too much of itself
  and shouldn’t be too nosy into others affairs”
                                     Andy Hunt & Dave Thomas
Educazione verso gli altri oggetti


 Tell the other guy
 oppure “Tell, Don’t Ask” o “Send messages”

 Non devono preoccuparsi di sapere con chi
 stanno parlando o come sarà svolta la richiesta
 che hanno invocato.
 Devono limitarsi a comunicare “gentilmente” il
 loro bisogno al vicino.
Progettiamo il comportamento delle entità




2. Devono essere educate verso il programmatore
Educazione verso i programmatori


 Ask for things

 Nel progetto sono presenti:
  1. aree di codice logico (business logic)
  2. aree di codice di inizializzazione (new keywords)
Educazione verso i programmatori


 Ask for things

 Nel progetto sono presenti:
  1. aree di codice logico (business logic)
  2. aree di codice di inizializzazione (new keywords)
 Se queste due aree sono intersecate abbiamo:
  1. dipendenze nascoste al programmatore
  2. difficoltà nel realizzare test di unità
Educazione verso i programmatori


 Avoid global state
 Utilizzare uno stato globale mutabile porta a:
  1. Difficoltà di debugging e test
  2. API che mentono al programmatore
Educazione verso i programmatori


 Avoid global state
 Utilizzare uno stato globale mutabile porta a:
  1. Difficoltà di debugging e test
  2. API che mentono al programmatore
 Attenzione a:
  1. Singleton = AntiPattern
  2. Hidden global state (Random, Date, Time)
  3. *VM Global State VS Application global state
  4. Global state IS TRANSITIVE!
Progettiamo il comportamento delle entità




3. Devono essere predisposte per la collaborazione
Predisposizione al cambiamento


 DRY, Don’t Repeat Yourself

 Every piece of knowledge must have a single,
 unambiguous, and authoritative representation
 within a system.
                                  Andy Hunt & Dave Thomas
Predisposizione al cambiamento


 Anti If Campaign

 1. Difficile da leggere
 2. Difficile da testare
 3. Freno alla crescita
    del progetto

 La maggior parte degli if può essere rimossa
 tramite Polimorfismo
Predisposizione al cambiamento


 Design Pattern

 Dividendo le responsabilità di comportamento
 permettono al sistema di evolvere secondo
 differenti direzioni.

 Permettono di intervenire su di un particolare
 aspetto della struttura del sistema in modo
 indipendente dagli altri aspetti.
Predisposizione al cambiamento


 Composition instead of Inheritance

 Be careful about runaway subclassing

 ... IT’S AGAIN STATIC!
Come realizzare ciò in modo sistematico


     Refactoring = rimozione delle duplicazioni
       attraverso l’individuazione degli smell



 Message chains Uncommunicative name Magic numbers
Primitive obsession Inconsistent names      Duplicated code
    Comments       Type embedded in name Duplicated flow
   Long method          Long method       Embedded expressions
     Long class       Long parameter list     Conditionals
Bibliografia e approfondimenti


 1. UML Tutorial: Collaboration Diagrams - Robert C. Martin
 2. Keep it DRY, Shy, and Tell the Other Guy - Dave Thomas
 3. Clean Code Talks - Misko Hevery
 4. Design Patterns - Gang of four


                               Grazie dell’attenzione

Diego Giorgini
tweet me @ogeidix                                                                   http://www.fruktarbo.com




     Questo slide sono rilasciate Creative Commons BY 3.0   http://creativecommons.org/licenses/by/3.0/

More Related Content

Viewers also liked

Udzungwa_Vidunda_WWFTPO_Nov2006
Udzungwa_Vidunda_WWFTPO_Nov2006Udzungwa_Vidunda_WWFTPO_Nov2006
Udzungwa_Vidunda_WWFTPO_Nov2006Ahmed Ndossa
 
L'État plateforme & Identité numérique (DISIC 2014 11-12)
L'État plateforme & Identité numérique (DISIC 2014 11-12)L'État plateforme & Identité numérique (DISIC 2014 11-12)
L'État plateforme & Identité numérique (DISIC 2014 11-12)Yves Buisson
 
introduction to big data frameworks
introduction to big data frameworksintroduction to big data frameworks
introduction to big data frameworksAmal Targhi
 
Dating Sweet Things To Say To Your Boyfriend
Dating Sweet Things To Say To Your Boyfriend
Dating Sweet Things To Say To Your Boyfriend
Dating Sweet Things To Say To Your Boyfriend scrawnyhitch8504
 
Brexit? And the future of business
Brexit? And the future of businessBrexit? And the future of business
Brexit? And the future of businessOgilvy Health
 

Viewers also liked (10)

Udzungwa_Vidunda_WWFTPO_Nov2006
Udzungwa_Vidunda_WWFTPO_Nov2006Udzungwa_Vidunda_WWFTPO_Nov2006
Udzungwa_Vidunda_WWFTPO_Nov2006
 
New look: ensuring that user needs are met in library space
New look: ensuring that user needs are met in library spaceNew look: ensuring that user needs are met in library space
New look: ensuring that user needs are met in library space
 
L'État plateforme & Identité numérique (DISIC 2014 11-12)
L'État plateforme & Identité numérique (DISIC 2014 11-12)L'État plateforme & Identité numérique (DISIC 2014 11-12)
L'État plateforme & Identité numérique (DISIC 2014 11-12)
 
introduction to big data frameworks
introduction to big data frameworksintroduction to big data frameworks
introduction to big data frameworks
 
Facebook for the workplace (1)
Facebook for the workplace (1)Facebook for the workplace (1)
Facebook for the workplace (1)
 
Certificates
CertificatesCertificates
Certificates
 
El español en américa
El español en américaEl español en américa
El español en américa
 
Salman_Khan_CV
Salman_Khan_CVSalman_Khan_CV
Salman_Khan_CV
 
Dating Sweet Things To Say To Your Boyfriend
Dating Sweet Things To Say To Your Boyfriend
Dating Sweet Things To Say To Your Boyfriend
Dating Sweet Things To Say To Your Boyfriend
 
Brexit? And the future of business
Brexit? And the future of businessBrexit? And the future of business
Brexit? And the future of business
 

Similar to OOP... Object Whaaat?

Loosely Coupled Complexity - Unleash the power of your domain model
Loosely Coupled Complexity - Unleash the power of your domain modelLoosely Coupled Complexity - Unleash the power of your domain model
Loosely Coupled Complexity - Unleash the power of your domain modelFrancesca1980
 
Java Programming Language
Java Programming LanguageJava Programming Language
Java Programming LanguagePasquale Paola
 
Sviluppo di applicazioni modulari e interoperabilità tra le applicazioni
Sviluppo di applicazioni modulari e interoperabilità tra le applicazioniSviluppo di applicazioni modulari e interoperabilità tra le applicazioni
Sviluppo di applicazioni modulari e interoperabilità tra le applicazioniCodemotion
 
Inversion of Control @ CD2008
Inversion of Control @ CD2008Inversion of Control @ CD2008
Inversion of Control @ CD2008Mauro Servienti
 
Introduzione al Domain Driven Design (DDD)
Introduzione al Domain Driven Design (DDD)Introduzione al Domain Driven Design (DDD)
Introduzione al Domain Driven Design (DDD)DotNetMarche
 
Una fugace occhiata al Test Driven Development (2006)
Una fugace occhiata al Test Driven Development  (2006)Una fugace occhiata al Test Driven Development  (2006)
Una fugace occhiata al Test Driven Development (2006)Roberto Bettazzoni
 
Le 7 sfide da affrontare nella migrazione da monolite a miniservizi
Le 7 sfide da affrontare nella migrazione da monolite a miniserviziLe 7 sfide da affrontare nella migrazione da monolite a miniservizi
Le 7 sfide da affrontare nella migrazione da monolite a miniserviziLuca Acquaviva
 
Idiomatic Domain Driven Design
Idiomatic Domain Driven DesignIdiomatic Domain Driven Design
Idiomatic Domain Driven DesignAndrea Saltarello
 
Domain Driven Design e CQRS
Domain Driven Design e CQRSDomain Driven Design e CQRS
Domain Driven Design e CQRSManuel Scapolan
 
AgileDay 2006 - Essere agili nel diventare agili
AgileDay 2006 - Essere agili nel diventare agiliAgileDay 2006 - Essere agili nel diventare agili
AgileDay 2006 - Essere agili nel diventare agiliLuca Minudel
 
Blomming Lean Startup @ Better Software 2011
Blomming Lean Startup @ Better Software 2011Blomming Lean Startup @ Better Software 2011
Blomming Lean Startup @ Better Software 2011Nicola Junior Vitto
 
Meetup ASP.NET Core Angular
Meetup ASP.NET Core AngularMeetup ASP.NET Core Angular
Meetup ASP.NET Core Angulardotnetcode
 
How I did it (in .NET): idiomatic Domain Driven Design
How I did it (in .NET): idiomatic Domain Driven DesignHow I did it (in .NET): idiomatic Domain Driven Design
How I did it (in .NET): idiomatic Domain Driven DesignAndrea Saltarello
 
Wpc2019 - Distruggere DevOps, la storia di un vero team
Wpc2019 - Distruggere DevOps, la storia di un vero teamWpc2019 - Distruggere DevOps, la storia di un vero team
Wpc2019 - Distruggere DevOps, la storia di un vero teamAlessandro Alpi
 
Acadevmy - AngularDay 2018 - Change Detection, Zone.js ed altri mostri
Acadevmy - AngularDay 2018 - Change Detection, Zone.js ed altri mostriAcadevmy - AngularDay 2018 - Change Detection, Zone.js ed altri mostri
Acadevmy - AngularDay 2018 - Change Detection, Zone.js ed altri mostriFrancesco Sciuti
 
Case study: un approccio modulare in un progetto legacy
Case study: un approccio modulare in un progetto legacyCase study: un approccio modulare in un progetto legacy
Case study: un approccio modulare in un progetto legacyMariano Fiorentino
 
Delphi & Dintorni Webinar - Padroneggiare i principi SOLID con Delphi
Delphi & Dintorni Webinar - Padroneggiare i principi SOLID con DelphiDelphi & Dintorni Webinar - Padroneggiare i principi SOLID con Delphi
Delphi & Dintorni Webinar - Padroneggiare i principi SOLID con DelphiMarco Breveglieri
 

Similar to OOP... Object Whaaat? (20)

Loosely Coupled Complexity - Unleash the power of your domain model
Loosely Coupled Complexity - Unleash the power of your domain modelLoosely Coupled Complexity - Unleash the power of your domain model
Loosely Coupled Complexity - Unleash the power of your domain model
 
Java Programming Language
Java Programming LanguageJava Programming Language
Java Programming Language
 
Sviluppo di applicazioni modulari e interoperabilità tra le applicazioni
Sviluppo di applicazioni modulari e interoperabilità tra le applicazioniSviluppo di applicazioni modulari e interoperabilità tra le applicazioni
Sviluppo di applicazioni modulari e interoperabilità tra le applicazioni
 
Inversion of Control @ CD2008
Inversion of Control @ CD2008Inversion of Control @ CD2008
Inversion of Control @ CD2008
 
Introduzione al Domain Driven Design (DDD)
Introduzione al Domain Driven Design (DDD)Introduzione al Domain Driven Design (DDD)
Introduzione al Domain Driven Design (DDD)
 
Una fugace occhiata al Test Driven Development (2006)
Una fugace occhiata al Test Driven Development  (2006)Una fugace occhiata al Test Driven Development  (2006)
Una fugace occhiata al Test Driven Development (2006)
 
Le 7 sfide da affrontare nella migrazione da monolite a miniservizi
Le 7 sfide da affrontare nella migrazione da monolite a miniserviziLe 7 sfide da affrontare nella migrazione da monolite a miniservizi
Le 7 sfide da affrontare nella migrazione da monolite a miniservizi
 
Idiomatic Domain Driven Design
Idiomatic Domain Driven DesignIdiomatic Domain Driven Design
Idiomatic Domain Driven Design
 
m-v-vm @ UgiAlt.Net
m-v-vm @ UgiAlt.Netm-v-vm @ UgiAlt.Net
m-v-vm @ UgiAlt.Net
 
Domain Driven Design e CQRS
Domain Driven Design e CQRSDomain Driven Design e CQRS
Domain Driven Design e CQRS
 
AgileDay 2006 - Essere agili nel diventare agili
AgileDay 2006 - Essere agili nel diventare agiliAgileDay 2006 - Essere agili nel diventare agili
AgileDay 2006 - Essere agili nel diventare agili
 
Blomming Lean Startup @ Better Software 2011
Blomming Lean Startup @ Better Software 2011Blomming Lean Startup @ Better Software 2011
Blomming Lean Startup @ Better Software 2011
 
Software Testing Forum 2012 - Polarion e TRS SpA
Software Testing Forum 2012 - Polarion e TRS SpASoftware Testing Forum 2012 - Polarion e TRS SpA
Software Testing Forum 2012 - Polarion e TRS SpA
 
Meetup ASP.NET Core Angular
Meetup ASP.NET Core AngularMeetup ASP.NET Core Angular
Meetup ASP.NET Core Angular
 
How I did it (in .NET): idiomatic Domain Driven Design
How I did it (in .NET): idiomatic Domain Driven DesignHow I did it (in .NET): idiomatic Domain Driven Design
How I did it (in .NET): idiomatic Domain Driven Design
 
Wpc2019 - Distruggere DevOps, la storia di un vero team
Wpc2019 - Distruggere DevOps, la storia di un vero teamWpc2019 - Distruggere DevOps, la storia di un vero team
Wpc2019 - Distruggere DevOps, la storia di un vero team
 
Acadevmy - AngularDay 2018 - Change Detection, Zone.js ed altri mostri
Acadevmy - AngularDay 2018 - Change Detection, Zone.js ed altri mostriAcadevmy - AngularDay 2018 - Change Detection, Zone.js ed altri mostri
Acadevmy - AngularDay 2018 - Change Detection, Zone.js ed altri mostri
 
Case study: un approccio modulare in un progetto legacy
Case study: un approccio modulare in un progetto legacyCase study: un approccio modulare in un progetto legacy
Case study: un approccio modulare in un progetto legacy
 
Delphi & Dintorni Webinar - Padroneggiare i principi SOLID con Delphi
Delphi & Dintorni Webinar - Padroneggiare i principi SOLID con DelphiDelphi & Dintorni Webinar - Padroneggiare i principi SOLID con Delphi
Delphi & Dintorni Webinar - Padroneggiare i principi SOLID con Delphi
 
Manuale Agile Stelnet
Manuale Agile StelnetManuale Agile Stelnet
Manuale Agile Stelnet
 

OOP... Object Whaaat?

  • 1. OOP... Object Whaaat? A story of engineers, bricks and gears by Diego Giorgini - @ogeidix
  • 2. Quello che ci hanno insegnato a scuola non è tutto quello che serve per vincere la sfida...
  • 3. La nostra sfida è costruire progetti complessi
  • 5. Ma come? ...ok, nel software? Programmazione procedurale e strutturata Paradigma di programmazione che prevede l’utilizzo chiamate a blocchi di codice detti subroutine o anche sottoprogrammi. Le subroutine possono inoltre essere associate a strutture dati così da mantenere allineata la struttura del programma con quella dei dati. [tratta da wikipedia]
  • 6. Ma come? ...ok, nel software? Programmazione procedurale e strutturata Paradigma di programmazione che prevede l’utilizzo chiamate a blocchi di codice detti subroutine o anche sottoprogrammi. Le subroutine possono inoltre essere associate a strutture dati così da mantenere allineata la struttura del programma con quella dei dati. [tratta da wikipedia] Programmazione ad oggetti La programmazione orientata agli oggetti (Object Oriented Programming, in breve OOP) è uno stile di programmazione che deriva da quello classico procedurale, e può essere considerato una sua estensione. Consiste essenzialmente nella creazione di strutture dati gerarchiche e combina i dati insieme alle operazioni che li manipolano [tratta da un sito internet]
  • 7. Ma come? ...ok, nel software?
  • 8. Gli obiettivi che riusciamo a raggiungere Scomposizione del problema in sotto problemi Suddivisione del lavoro in più sviluppatori Modularizzazione del progetto
  • 9. Gli obiettivi che riusciamo a raggiungere Scomposizione del problema in sotto problemi Suddivisione del lavoro in più sviluppatori Modularizzazione del progetto Sono gli stessi obiettivi raggiunti dalla programmazione procedurale!
  • 10. Gli obiettivi che riusciamo a raggiungere Scomposizione del problema in sotto problemi Suddivisione del lavoro in più sviluppatori Modularizzazione del progetto Sono gli stessi obiettivi raggiunti dalla programmazione procedurale! Stiamo facendo programmazione procedurale con una sintassi diversa
  • 11. Gli obiettivi che riusciamo a raggiungere Scomposizione del problema in sotto problemi Suddivisione del lavoro in più sviluppatori Modularizzazione del progetto
  • 12. Gli obiettivi che riusciamo a raggiungere Scomposizione del problema in sotto problemi Suddivisione del lavoro in più sviluppatori Modularizzazione del progetto sono comunque ottimi:
  • 13. Gli obiettivi che riusciamo a raggiungere Scomposizione del problema in sotto problemi Suddivisione del lavoro in più sviluppatori Modularizzazione del progetto sono comunque ottimi: per realizzare un progetto definito
  • 14. Gli obiettivi che riusciamo a raggiungere Scomposizione del problema in sotto problemi Suddivisione del lavoro in più sviluppatori Modularizzazione del progetto sono comunque ottimi: per realizzare un progetto definito per un progetto che resta fisso nel tempo
  • 15. Gli obiettivi che riusciamo a raggiungere Scomposizione del problema in sotto problemi Suddivisione del lavoro in più sviluppatori Modularizzazione del progetto sono comunque ottimi: per realizzare un progetto definito per un progetto che resta fisso nel tempo Purtroppo non stiamo costruendo un palazzo
  • 16. Gli obiettivi che riusciamo a raggiungere Scomposizione del problema in sotto problemi Suddivisione del lavoro in più sviluppatori Modularizzazione del progetto
  • 17. Gli obiettivi che riusciamo a raggiungere Scomposizione del problema in sotto problemi Suddivisione del lavoro in più sviluppatori Modularizzazione del progetto Le necessità dello sviluppo software includono però:
  • 18. Gli obiettivi che riusciamo a raggiungere Scomposizione del problema in sotto problemi Suddivisione del lavoro in più sviluppatori Modularizzazione del progetto Le necessità dello sviluppo software includono però: Flessibilità di fronte al cambiamento Riuso reale del codice Mantenere il sistema aperto alla crescita
  • 19. Le necessità dello sviluppo software richiedono Non moduli statici
  • 20. Le necessità dello sviluppo software richiedono Non moduli statici ma entità dinamiche
  • 21. Entità dinamiche L’attenzione è sul comportamento dinamico Il progetto è il risultato della collaborazione di diverse entità
  • 22. Entità dinamiche Permettono di modificare il comportamento del sistema inserendo nuove entità con comportamenti differenti Il sistema è flessibile a nuove richieste senza bisogno di modificare quanto realizzato
  • 23. Entità dinamiche “Il tuo design è corretto se ogni nuova modifica al progetto richiede meno codice della modifica precedente” Matteo Vaccari - @xpmatteo
  • 24. Progettare entità dinamiche Il diagramma delle classi? Statico! Il comportamento viene descritto dal diagramma di collaborazione
  • 25. Progettare entità dinamiche Una automobile ... statica Class diagram: 1 1 Volante Centralina 1 3 1 1 Pedale 2 1 1 Ruota 1 Cruscotto 2 1..* RuotaMotrice Luci
  • 26. Progettare entità dinamiche Una automobile ... statica - dinamica Collaboration diagram: 1: Accensione delle frecce FrecciaDx:Luce 1.1 turn_on :Volante Stop:Luce 2.1 turn_on 2: Frenata 1.2 turning_right 2.2 brake Freno:Pedale :Centralina 2.2.1 brake 2.2.1 braking RuotaMDx:RuotaMotrice :Cruscotto
  • 27. Progettare entità dinamiche Una automobile ... statica - dinamica Class diagram: riceve informazioni da comunica dati alle Centralina Pedale Luci Comanda delle ricevono dati dal comunica dati al riceve dati dal RuotaMotrice Cruscotto Volante
  • 28. Progettiamo il comportamento delle entità 1. Devono essere educate tra di loro 2. Devono essere educate verso il programmatore 3. Devono essere predisposte per la collaborazione
  • 29. Progettiamo il comportamento delle entità 1. Devono essere educate tra di loro
  • 30. Educazione verso gli altri oggetti Keep it shy “The best code is very shy. Like a four-year old hiding behind a mother’s skirt, code shouldn’t reveal too much of itself and shouldn’t be too nosy into others affairs” Andy Hunt & Dave Thomas
  • 31. Educazione verso gli altri oggetti Tell the other guy oppure “Tell, Don’t Ask” o “Send messages” Non devono preoccuparsi di sapere con chi stanno parlando o come sarà svolta la richiesta che hanno invocato. Devono limitarsi a comunicare “gentilmente” il loro bisogno al vicino.
  • 32. Progettiamo il comportamento delle entità 2. Devono essere educate verso il programmatore
  • 33. Educazione verso i programmatori Ask for things Nel progetto sono presenti: 1. aree di codice logico (business logic) 2. aree di codice di inizializzazione (new keywords)
  • 34. Educazione verso i programmatori Ask for things Nel progetto sono presenti: 1. aree di codice logico (business logic) 2. aree di codice di inizializzazione (new keywords) Se queste due aree sono intersecate abbiamo: 1. dipendenze nascoste al programmatore 2. difficoltà nel realizzare test di unità
  • 35. Educazione verso i programmatori Avoid global state Utilizzare uno stato globale mutabile porta a: 1. Difficoltà di debugging e test 2. API che mentono al programmatore
  • 36. Educazione verso i programmatori Avoid global state Utilizzare uno stato globale mutabile porta a: 1. Difficoltà di debugging e test 2. API che mentono al programmatore Attenzione a: 1. Singleton = AntiPattern 2. Hidden global state (Random, Date, Time) 3. *VM Global State VS Application global state 4. Global state IS TRANSITIVE!
  • 37. Progettiamo il comportamento delle entità 3. Devono essere predisposte per la collaborazione
  • 38. Predisposizione al cambiamento DRY, Don’t Repeat Yourself Every piece of knowledge must have a single, unambiguous, and authoritative representation within a system. Andy Hunt & Dave Thomas
  • 39. Predisposizione al cambiamento Anti If Campaign 1. Difficile da leggere 2. Difficile da testare 3. Freno alla crescita del progetto La maggior parte degli if può essere rimossa tramite Polimorfismo
  • 40. Predisposizione al cambiamento Design Pattern Dividendo le responsabilità di comportamento permettono al sistema di evolvere secondo differenti direzioni. Permettono di intervenire su di un particolare aspetto della struttura del sistema in modo indipendente dagli altri aspetti.
  • 41. Predisposizione al cambiamento Composition instead of Inheritance Be careful about runaway subclassing ... IT’S AGAIN STATIC!
  • 42. Come realizzare ciò in modo sistematico Refactoring = rimozione delle duplicazioni attraverso l’individuazione degli smell Message chains Uncommunicative name Magic numbers Primitive obsession Inconsistent names Duplicated code Comments Type embedded in name Duplicated flow Long method Long method Embedded expressions Long class Long parameter list Conditionals
  • 43. Bibliografia e approfondimenti 1. UML Tutorial: Collaboration Diagrams - Robert C. Martin 2. Keep it DRY, Shy, and Tell the Other Guy - Dave Thomas 3. Clean Code Talks - Misko Hevery 4. Design Patterns - Gang of four Grazie dell’attenzione Diego Giorgini tweet me @ogeidix http://www.fruktarbo.com Questo slide sono rilasciate Creative Commons BY 3.0 http://creativecommons.org/licenses/by/3.0/