Anti pattern se lo conosci lo eviti

Post on 13-Jan-2017

133 views 3 download

Transcript of Anti pattern se lo conosci lo eviti

L'Anti-Pattern:se lo conosci lo eviti

Giorgio VinciSenior Consultantg.vinci@k-tech.it

Simone FedericiJava Architect

s.federici@k-tech.it

Jug Roma 9° Meeting25 Gennaio 2006

Eventi precedenti18 novembre 2006 Novara30 Settembre 2006 Verona26 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

GRASPGeneral 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

GRASPInformation 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

GRASPCreator, 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

GRASPIndirection, 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 FactoryMettiamo 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 perL'auto apprendimento del programma a

giocare a scacchiIgnorando 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()ReginaTorre

CavalloAlfiere

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 Expertpotremmo arrivare a disegnare una classeche 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 codeCut and Paste programming

Golden HammerInput Kludge

Coding by exceptionBlind faithHard 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 ProgrammingPrincipi/Pattern GRASP

Design Pattern GOFAntipatterns

Code ConventionJava BluePrints

Conoscere i tools

www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 26

Structural Analysis

TangleButterfly

BreakableHub

Implementation Dependency

www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 27

FindBugsImpossibili CastClonableEmpty Fileinstanceof sempre falselogica Sempre falsecompareToException DroppateDate (parametri esempio mesi 0-11)Iteretor bad use hasNext() next()HARDCODED_ABSOLUTE_FILENAMENo SerializableOVERWRITTEN_INCREMENTSystem.exit(...) (DM_EXIT)equals() used to compare array and nonarrayequals() comparing different interfaceExplicit invocation of finalizer()Initialization circularityapparent infinite recursive loopStore of non serializable object into HttpSessionNull pointer dereference in methodRead of unwritten fieldConfusing method names Method may fail to close database resourceMethod may fail to close stream Redundant comparison of non-null value to nullInvalid syntax for regular expressionSQL_BAD_PREPARED_STATEMENT_ACCESSPossible double check of fieldA thread was created using the default empty run methodInconsistent synchronization Mismatched notify()

www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 28

CheckStyleJalopy

J2EE TaskCorrettezza degli EJB

Task Code conventionTask customizzabili

www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 29

Controlli automaticiNei processi di build automatici

è possibile aggiungere i plugin di findbugs e checkstyle

Maven2ANT

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 AnalysisJdependfindbugs

checkstylejalopy/jacobe

MavenAnt

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 LuglioVerona 30 SettembrePisa 14 OttobreNovara 18 NovembrePalermo 24 NovembreCagliari 25 NovembreRoma 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.itwww.javaday.itwww.jugroma.itroma.javaday.it

www.javaportal.it s.federici@k-tech.it & g.vinci@k-tech.it 35

Referenceswww.javaportal.it

www.antipatterns.comwww.ugolandini.net

http://c2.com/cgi/wiki?AntiPatternsCataloghttp://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/