L'Anti-Pattern:
se lo conosci lo eviti
Giorgio Vinci
Senior Consultant
g.vinci@k-tech.it
Simone Federici
Java Architect
s.federici@k-tech.it
Jug Roma 9° Meeting
25 Gennaio 2006
Eventi precedenti
18 novembre 2006 Novara
30 Settembre 2006 Verona
26 Giugno JC 2006 Milano
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 2
AGENDA
●Introduzione
●GRASP
●Anti Pattern di Progetto
●I Mostri
●Come fare per difendersi
●Ringraziamenti
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 3
Spaghetti Code
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 4
Antipatterns Map
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 5
L'antipattern:
L'antipattern si può definire "pattern" in quanto è una soluzione progettuale generale a un
problema ricorrente ed è costituito da un nome, un problema ed una soluzione.
La differenza tra un normale pattern (o "Pattern Migliorativo") ed un Anti-Pattern è che il
primo è caratterizzato da una soluzione fondamentalmente buona/positiva, mentre il
secondo è caratterizzato da una falsa soluzione o da una soluzione fondamentalmente
negativa.
Verranno illustrati i principali Anti-Pattern, con le relative soluzioni alternative, all'interno del:
Project management, Design, Object-oriented programming e Developing.
Seguendo questa presentazione sarà possibile evitare la maggior parte degli Anti-Pattern ed
utilizzare invece un approccio sano alla progettazione e sviluppo del software. Laddove non
fosse possibile "risolvere" l'Anti-Pattern, sarà fondamentale essere in grado di evidenziarlo e
monitorarlo come criticità di progetto.
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 6
OBIETTIVI
Sottolineare l'importanza di una buona conoscenza dei
pattern e degli antipatterns, al fine di aver un approccio
sano alla progettazione e allo sviluppo del software
Lo speech è rivolto a:
Project Manager, Analisti, Architetti, Programmatori
perché la valenza dell'antipattern è trasversale al ruolo.
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 7
AGENDA
●Introduzione
●GRASP
●Anti Pattern di Progetto
●I Mostri
●Come fare per difendersi
●Ringraziamenti
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 8
GRASP
General Responsibility Assignment Software
Pattern (or Principles)
●Information Expert
●Low Coupling
●High Cohesion
●Creator
●Controller
●Polymorphism
●Pure Fabrication
●Indirection
●Don't Talk to Strangers: (Law of Demeter)
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 9
GRASP
Information Expert
Low Coupling e High Cohesion
Dobbiamo distribuire le responsabilità a gli oggetti del
nostro dominio.
Information Expert ci dice di assegnare le responsabilità
all'oggetto più esperto, che possiede le informazioni.
Il basso accoppiamento ci dice di legare i componenti tra
loro il MINIMO indispensabile.
L'alta coesione ci dice che ogni Oggetto deve delle
responsabilità “COESE” tra loro, che abbiano un motivo
in comune per appartenere ad esso.
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 10
GRASP
Creator, Controller
Polymorphism
Quale è il principio generale per l'assegnazione
della responsabilità di creazione degli oggetti?
Come far comunicare l'UI con la BL?
A chi assegnare tale responsabilità?
La logica condizionale if-then-else spesso rende
difficile l'estensione dell'applicazione. Come
fare?
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 11
GRASP
Indirection, Pure Fabrication,
Don't Talk to Stranger
Non vogliamo accoppiare direttamente due oggetti,
posso delegare le responsabilità ad un oggetto tra loro?
Non riesco a non violare Low Coupling e High Coesion
con gli oggetti appartenenti al dominio del problema,
come fare?
Come evitare che oggetti disegnati secondo la Low
Coupling diventino accoppiati nell'implementazione?
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 12
AGENDA
●Introduzione
●GRASP
●Anti Pattern di Progetto
●I Mostri
●Come fare per difendersi
●Ringraziamenti
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 13
SCACCHIERA
Un caso reale... o quasi.
Immaginiamo di dover realizzare il gioco degli scacchi.
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 14
Gas Factory
Mettiamo in piedi un sistema di intelligenza
artificiale.
Creiamo un pannello di controllo per una
gestione parametrica dell'intera
applicazione.
E aggiungiamo la possibilità di giocare in
rete...
Tutte cose bellissime ma che
non ci erano state chieste!!!
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 15
Reinventing
the wheel
Mi invento un mio metodo per
L'auto apprendimento del programma a
giocare a scacchi
Ignorando l'esistenza di Reti Neurali,
Apprendimento Bayesiano ecc...
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 16
Abstract Inversion
Un interfaccia troppo povera rischia di
nascondere alcune funzionalità.
Scacchiera
+trasformazione()
+arrocco()
Pezzo
<<interface>>
+muovi()
+mangia()
+...()
Pedone
+trasformazione()
Regina
Torre
Cavallo
Alfiere
Re
+arrocco()
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 17
Interface bloat
"In medio stat virtus"
Un interfaccia troppo ricca comporta che la maggior parte degli oggetti non
saranno in grado di implementare molte delle funzionalità.
Oltre a violare il principio di alta coesione.
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 18
Re-Coupling
Abbiamo introdotto una
dipendenza non
necessaria
Assegnando
correttamente le
responsabilità evitiamo
un eccessivo
accoppiamento
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 19
Magic Pushbutton
All'interno dei metodi Drag&Drop della
nostra interfaccia grafica andiamo a
“cablare” la logica di business.
Il metodo del listener conterrà:
- verifica validità della mossa
- movimento del pezzo
- eventuale rimozione di pezzo avversario
...
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 20
Poltergeist
Ad ogni
invocazione
della UI
generiamo un
opportuno
controller che
si occupa di
interfacciarsi
con i business
object
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 21
God Object
Secondo il principio
dell'Information Expert
potremmo arrivare a
disegnare una classe
che si occupa di tutto...
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 22
AGENDA
●Introduzione
●GRASP
●Anti Pattern di Progetto
●I Mostri
●Come fare per difendersi
●Ringraziamenti
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 23
I MOSTRI
Spaghetti code
Cut and Paste programming
Golden Hammer
Input Kludge
Coding by exception
Blind faith
Hard code
Busy waiting or spinning
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 24
AGENDA
●Introduzione
●GRASP
●Anti Pattern di Progetto
●I Mostri
●Come fare per difendersi
●Ringraziamenti
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 25
LA MIGLIOR DIFESA è
L'ATTACCO
(Trovalo prima che lui trovi te)
Object Oriented Programming
Principi/Pattern GRASP
Design Pattern GOF
Antipatterns
Code Convention
Java BluePrints
Conoscere i tools
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 26
Structural Analysis
Tangle
Butterfly
Breakable
Hub
Implementation Dependency
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 27
FindBugs
Impossibili Cast
Clonable
Empty File
instanceof sempre false
logica Sempre false
compareTo
Exception Droppate
Date (parametri esempio mesi 0-11)
Iteretor bad use hasNext() next()
HARDCODED_ABSOLUTE_FILENAME
No Serializable
OVERWRITTEN_INCREMENT
System.exit(...) (DM_EXIT)
equals() used to compare array and nonarray
equals() comparing different interface
Explicit invocation of finalizer()
Initialization circularity
apparent infinite recursive loop
Store of non serializable object into HttpSession
Null pointer dereference in method
Read of unwritten field
Confusing method names
Method may fail to close database resource
Method may fail to close stream
Redundant comparison of non-null value to null
Invalid syntax for regular expression
SQL_BAD_PREPARED_STATEMENT_ACCESS
Possible double check of field
A thread was created using the default empty run method
Inconsistent synchronization
Mismatched notify()
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 28
CheckStyle
Jalopy
J2EE Task
Correttezza degli EJB
Task Code convention
Task customizzabili
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 29
Controlli automatici
Nei processi di build automatici
è possibile aggiungere i plugin di findbugs
e checkstyle
Maven2
ANT
E' possibile anche lanciare jalopy
(prima di un rilascio)
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 30
TOOLS
Structural Analysis
Jdepend
findbugs
checkstyle
jalopy/jacobe
Maven
Ant
Plugin per gli IDE
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 31
AGENDA
●Introduzione
●GRASP
●Anti Pattern di Progetto
●I Mostri
●Come fare per difendersi
●Ringraziamenti
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 32
Le tappe JavaDay 2006!
Torino 7 Luglio
Verona 30 Settembre
Pisa 14 Ottobre
Novara 18 Novembre
Palermo 24 Novembre
Cagliari 25 Novembre
Roma 02 Dicembre
http://www.javaday.it
http://roma.javaday.it
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 33
Le tappe JavaDay 2007!
?
http://www.javaday.it
http://roma.javaday.it
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 34
Ringraziamenti
www.javaportal.it
www.javaday.it
www.jugroma.it
roma.javaday.it
www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 35
References
www.javaportal.it
www.antipatterns.com
www.ugolandini.net
http://c2.com/cgi/wiki?AntiPatternsCatalog
http://en.wikipedia.org/wiki/Antipattern
http://java.sun.com/reference/blueprints/
http://java.sun.com/docs/codeconv/
http://findbugs.sourceforge.net/
http://checkstyle.sourceforge.net/
http://jalopy.sourceforge.net/
http://www.tiobe.com/jacobe.htm
http://freshmeat.net/projects/structuralanalysisforjava/
http://www.clarkware.com/software/JDepend.html
http://ant.apache.org/
http://maven.apache.org/

Anti pattern se lo conosci lo eviti

  • 1.
    L'Anti-Pattern: se lo conoscilo eviti Giorgio Vinci Senior Consultant g.vinci@k-tech.it Simone Federici Java Architect s.federici@k-tech.it Jug Roma 9° Meeting 25 Gennaio 2006 Eventi precedenti 18 novembre 2006 Novara 30 Settembre 2006 Verona 26 Giugno JC 2006 Milano
  • 2.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 2 AGENDA ●Introduzione ●GRASP ●Anti Pattern di Progetto ●I Mostri ●Come fare per difendersi ●Ringraziamenti
  • 3.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 3 Spaghetti Code
  • 4.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 4 Antipatterns Map
  • 5.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 5 L'antipattern: L'antipattern si può definire "pattern" in quanto è una soluzione progettuale generale a un problema ricorrente ed è costituito da un nome, un problema ed una soluzione. La differenza tra un normale pattern (o "Pattern Migliorativo") ed un Anti-Pattern è che il primo è caratterizzato da una soluzione fondamentalmente buona/positiva, mentre il secondo è caratterizzato da una falsa soluzione o da una soluzione fondamentalmente negativa. Verranno illustrati i principali Anti-Pattern, con le relative soluzioni alternative, all'interno del: Project management, Design, Object-oriented programming e Developing. Seguendo questa presentazione sarà possibile evitare la maggior parte degli Anti-Pattern ed utilizzare invece un approccio sano alla progettazione e sviluppo del software. Laddove non fosse possibile "risolvere" l'Anti-Pattern, sarà fondamentale essere in grado di evidenziarlo e monitorarlo come criticità di progetto.
  • 6.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 6 OBIETTIVI Sottolineare l'importanza di una buona conoscenza dei pattern e degli antipatterns, al fine di aver un approccio sano alla progettazione e allo sviluppo del software Lo speech è rivolto a: Project Manager, Analisti, Architetti, Programmatori perché la valenza dell'antipattern è trasversale al ruolo.
  • 7.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 7 AGENDA ●Introduzione ●GRASP ●Anti Pattern di Progetto ●I Mostri ●Come fare per difendersi ●Ringraziamenti
  • 8.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 8 GRASP General Responsibility Assignment Software Pattern (or Principles) ●Information Expert ●Low Coupling ●High Cohesion ●Creator ●Controller ●Polymorphism ●Pure Fabrication ●Indirection ●Don't Talk to Strangers: (Law of Demeter)
  • 9.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 9 GRASP Information Expert Low Coupling e High Cohesion Dobbiamo distribuire le responsabilità a gli oggetti del nostro dominio. Information Expert ci dice di assegnare le responsabilità all'oggetto più esperto, che possiede le informazioni. Il basso accoppiamento ci dice di legare i componenti tra loro il MINIMO indispensabile. L'alta coesione ci dice che ogni Oggetto deve delle responsabilità “COESE” tra loro, che abbiano un motivo in comune per appartenere ad esso.
  • 10.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 10 GRASP Creator, Controller Polymorphism Quale è il principio generale per l'assegnazione della responsabilità di creazione degli oggetti? Come far comunicare l'UI con la BL? A chi assegnare tale responsabilità? La logica condizionale if-then-else spesso rende difficile l'estensione dell'applicazione. Come fare?
  • 11.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 11 GRASP Indirection, Pure Fabrication, Don't Talk to Stranger Non vogliamo accoppiare direttamente due oggetti, posso delegare le responsabilità ad un oggetto tra loro? Non riesco a non violare Low Coupling e High Coesion con gli oggetti appartenenti al dominio del problema, come fare? Come evitare che oggetti disegnati secondo la Low Coupling diventino accoppiati nell'implementazione?
  • 12.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 12 AGENDA ●Introduzione ●GRASP ●Anti Pattern di Progetto ●I Mostri ●Come fare per difendersi ●Ringraziamenti
  • 13.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 13 SCACCHIERA Un caso reale... o quasi. Immaginiamo di dover realizzare il gioco degli scacchi.
  • 14.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 14 Gas Factory Mettiamo in piedi un sistema di intelligenza artificiale. Creiamo un pannello di controllo per una gestione parametrica dell'intera applicazione. E aggiungiamo la possibilità di giocare in rete... Tutte cose bellissime ma che non ci erano state chieste!!!
  • 15.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 15 Reinventing the wheel Mi invento un mio metodo per L'auto apprendimento del programma a giocare a scacchi Ignorando l'esistenza di Reti Neurali, Apprendimento Bayesiano ecc...
  • 16.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 16 Abstract Inversion Un interfaccia troppo povera rischia di nascondere alcune funzionalità. Scacchiera +trasformazione() +arrocco() Pezzo <<interface>> +muovi() +mangia() +...() Pedone +trasformazione() Regina Torre Cavallo Alfiere Re +arrocco()
  • 17.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 17 Interface bloat "In medio stat virtus" Un interfaccia troppo ricca comporta che la maggior parte degli oggetti non saranno in grado di implementare molte delle funzionalità. Oltre a violare il principio di alta coesione.
  • 18.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 18 Re-Coupling Abbiamo introdotto una dipendenza non necessaria Assegnando correttamente le responsabilità evitiamo un eccessivo accoppiamento
  • 19.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 19 Magic Pushbutton All'interno dei metodi Drag&Drop della nostra interfaccia grafica andiamo a “cablare” la logica di business. Il metodo del listener conterrà: - verifica validità della mossa - movimento del pezzo - eventuale rimozione di pezzo avversario ...
  • 20.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 20 Poltergeist Ad ogni invocazione della UI generiamo un opportuno controller che si occupa di interfacciarsi con i business object
  • 21.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 21 God Object Secondo il principio dell'Information Expert potremmo arrivare a disegnare una classe che si occupa di tutto...
  • 22.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 22 AGENDA ●Introduzione ●GRASP ●Anti Pattern di Progetto ●I Mostri ●Come fare per difendersi ●Ringraziamenti
  • 23.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 23 I MOSTRI Spaghetti code Cut and Paste programming Golden Hammer Input Kludge Coding by exception Blind faith Hard code Busy waiting or spinning
  • 24.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 24 AGENDA ●Introduzione ●GRASP ●Anti Pattern di Progetto ●I Mostri ●Come fare per difendersi ●Ringraziamenti
  • 25.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 25 LA MIGLIOR DIFESA è L'ATTACCO (Trovalo prima che lui trovi te) Object Oriented Programming Principi/Pattern GRASP Design Pattern GOF Antipatterns Code Convention Java BluePrints Conoscere i tools
  • 26.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 26 Structural Analysis Tangle Butterfly Breakable Hub Implementation Dependency
  • 27.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 27 FindBugs Impossibili Cast Clonable Empty File instanceof sempre false logica Sempre false compareTo Exception Droppate Date (parametri esempio mesi 0-11) Iteretor bad use hasNext() next() HARDCODED_ABSOLUTE_FILENAME No Serializable OVERWRITTEN_INCREMENT System.exit(...) (DM_EXIT) equals() used to compare array and nonarray equals() comparing different interface Explicit invocation of finalizer() Initialization circularity apparent infinite recursive loop Store of non serializable object into HttpSession Null pointer dereference in method Read of unwritten field Confusing method names Method may fail to close database resource Method may fail to close stream Redundant comparison of non-null value to null Invalid syntax for regular expression SQL_BAD_PREPARED_STATEMENT_ACCESS Possible double check of field A thread was created using the default empty run method Inconsistent synchronization Mismatched notify()
  • 28.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 28 CheckStyle Jalopy J2EE Task Correttezza degli EJB Task Code convention Task customizzabili
  • 29.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 29 Controlli automatici Nei processi di build automatici è possibile aggiungere i plugin di findbugs e checkstyle Maven2 ANT E' possibile anche lanciare jalopy (prima di un rilascio)
  • 30.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 30 TOOLS Structural Analysis Jdepend findbugs checkstyle jalopy/jacobe Maven Ant Plugin per gli IDE
  • 31.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 31 AGENDA ●Introduzione ●GRASP ●Anti Pattern di Progetto ●I Mostri ●Come fare per difendersi ●Ringraziamenti
  • 32.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 32 Le tappe JavaDay 2006! Torino 7 Luglio Verona 30 Settembre Pisa 14 Ottobre Novara 18 Novembre Palermo 24 Novembre Cagliari 25 Novembre Roma 02 Dicembre http://www.javaday.it http://roma.javaday.it
  • 33.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 33 Le tappe JavaDay 2007! ? http://www.javaday.it http://roma.javaday.it
  • 34.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 34 Ringraziamenti www.javaportal.it www.javaday.it www.jugroma.it roma.javaday.it
  • 35.
    www.javaportal.it s.federici@k-tech.it &g.vinci@k-tech.it 35 References www.javaportal.it www.antipatterns.com www.ugolandini.net http://c2.com/cgi/wiki?AntiPatternsCatalog http://en.wikipedia.org/wiki/Antipattern http://java.sun.com/reference/blueprints/ http://java.sun.com/docs/codeconv/ http://findbugs.sourceforge.net/ http://checkstyle.sourceforge.net/ http://jalopy.sourceforge.net/ http://www.tiobe.com/jacobe.htm http://freshmeat.net/projects/structuralanalysisforjava/ http://www.clarkware.com/software/JDepend.html http://ant.apache.org/ http://maven.apache.org/