SlideShare a Scribd company logo
1 of 18
70k linee di codice, tangle  architetturali e le sfide del refactoring Paolo Predonzani (paolo.predonzani@manydesigns.com)
“ Refactoring is a disciplined technique for restructuring an existing body of code, altering its internal structure without changing its external behavior.” (www.refactoring.org)
Motivazioni per refactoring 'quotidiano' ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Cosa faremmo senza 'find usages'?
'Find usages' a livello di package Package A Package B Package A Package B Questa è una 'layered architecture'
Motivazioni per refactoring architetturale ,[object Object],[object Object],[object Object]
DSM (Dependency Structure Matrix) con IntelliJ IDEA
I package sono ordinati in base alle dipendenze principali I tangle sono evidenziati con bordo rosso Dipendenze circolari sono evidenziate  in rosso Il numero indica quante dipendenze ci sono. L'indicazione “...” vuol dire “molti”
Le dipendenze problematiche sono sopra la diagonale
Esplorare una  specifica dipendenza
Dopo numerose fattorizzazioni... le dipendenze sono semplificate e organizzate
class A public void f(B b) { ... } class B public void g(A a) { ... }
class A public void f(B b) { ... } class B public void g(A a) { ... } Signature di A Signature di B
class A public void f() { B b = ... ... } class B public void g() { A a = ... ... }
class A public void f() { B b = ... ... } class B public void g() { A a = ... ... } Signature di A Signature di B Body di A Body di B
interface A void f(); interface B void g(); class ImplA implements A public void f() { B b = ... ... } class ImplB implements B public void g() { A a = ... ... }
Package A Package B Package ImplA Package ImplB Package Builder API Implementation Builder
Package A Package B Package ImplA Package ImplB Package Builder API Implementation Builder

More Related Content

Similar to 70k linee di codice, tangle architetturali e le sfide del refactoring

Design Pattern Strutturali
Design Pattern StrutturaliDesign Pattern Strutturali
Design Pattern StrutturaliRiccardo Cardin
 
Reactive programming principles
Reactive programming principlesReactive programming principles
Reactive programming principlesRiccardo Cardin
 
Aspect Oriented Programming
Aspect Oriented ProgrammingAspect Oriented Programming
Aspect Oriented ProgrammingAndrea Bozzoni
 
Sviluppo Rapido Di Applicazioni Con Grails
Sviluppo Rapido Di Applicazioni Con GrailsSviluppo Rapido Di Applicazioni Con Grails
Sviluppo Rapido Di Applicazioni Con GrailsAlberto Brandolini
 
Codemotion 2012 creare un proprio linguaggio di programmazione
Codemotion 2012 creare un proprio linguaggio di programmazioneCodemotion 2012 creare un proprio linguaggio di programmazione
Codemotion 2012 creare un proprio linguaggio di programmazioneGabriele Guizzardi
 
Database Project in Visual Studio 2010
Database Project in Visual Studio 2010Database Project in Visual Studio 2010
Database Project in Visual Studio 2010Gian Maria Ricci
 
Two months of Kotlin
Two months of KotlinTwo months of Kotlin
Two months of KotlinErik Minarini
 
Entity Framework 4 vs NHibernate 3
Entity Framework 4 vs NHibernate 3Entity Framework 4 vs NHibernate 3
Entity Framework 4 vs NHibernate 3Martino Bordin
 
Un plug-in Eclipse per il supporto all'Extract Class Refactoring
Un plug-in Eclipse per il supporto all'Extract Class RefactoringUn plug-in Eclipse per il supporto all'Extract Class Refactoring
Un plug-in Eclipse per il supporto all'Extract Class RefactoringFabio Palomba
 
Community Tour 2009 Windows Azure Overview
Community Tour 2009 Windows Azure OverviewCommunity Tour 2009 Windows Azure Overview
Community Tour 2009 Windows Azure OverviewFabio Cozzolino
 
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
 

Similar to 70k linee di codice, tangle architetturali e le sfide del refactoring (12)

Design Pattern Strutturali
Design Pattern StrutturaliDesign Pattern Strutturali
Design Pattern Strutturali
 
Reactive programming principles
Reactive programming principlesReactive programming principles
Reactive programming principles
 
Aspect Oriented Programming
Aspect Oriented ProgrammingAspect Oriented Programming
Aspect Oriented Programming
 
Sviluppo Rapido Di Applicazioni Con Grails
Sviluppo Rapido Di Applicazioni Con GrailsSviluppo Rapido Di Applicazioni Con Grails
Sviluppo Rapido Di Applicazioni Con Grails
 
Codemotion 2012 creare un proprio linguaggio di programmazione
Codemotion 2012 creare un proprio linguaggio di programmazioneCodemotion 2012 creare un proprio linguaggio di programmazione
Codemotion 2012 creare un proprio linguaggio di programmazione
 
Database Project in Visual Studio 2010
Database Project in Visual Studio 2010Database Project in Visual Studio 2010
Database Project in Visual Studio 2010
 
Two months of Kotlin
Two months of KotlinTwo months of Kotlin
Two months of Kotlin
 
Entity Framework 4 vs NHibernate 3
Entity Framework 4 vs NHibernate 3Entity Framework 4 vs NHibernate 3
Entity Framework 4 vs NHibernate 3
 
Diagrammi delle Classi
Diagrammi delle ClassiDiagrammi delle Classi
Diagrammi delle Classi
 
Un plug-in Eclipse per il supporto all'Extract Class Refactoring
Un plug-in Eclipse per il supporto all'Extract Class RefactoringUn plug-in Eclipse per il supporto all'Extract Class Refactoring
Un plug-in Eclipse per il supporto all'Extract Class Refactoring
 
Community Tour 2009 Windows Azure Overview
Community Tour 2009 Windows Azure OverviewCommunity Tour 2009 Windows Azure Overview
Community Tour 2009 Windows Azure Overview
 
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
 

More from Paolo Predonzani

Wiki-like collaborative development for seamless customer involvement
Wiki-like collaborative development for seamless customer involvementWiki-like collaborative development for seamless customer involvement
Wiki-like collaborative development for seamless customer involvementPaolo Predonzani
 
How to put 100k lines of code into the (Google) cloud: storms and rainbows
How to put 100k lines of code into the (Google) cloud: storms and rainbowsHow to put 100k lines of code into the (Google) cloud: storms and rainbows
How to put 100k lines of code into the (Google) cloud: storms and rainbowsPaolo Predonzani
 
Portofino 4: Creare Webapp da Database Esistenti in 30 Secondi
Portofino 4: Creare Webapp da Database Esistenti in 30 SecondiPortofino 4: Creare Webapp da Database Esistenti in 30 Secondi
Portofino 4: Creare Webapp da Database Esistenti in 30 SecondiPaolo Predonzani
 
Come Incorporare un Interprete Groovy in un Applicativo Java
Come Incorporare un Interprete Groovy in un Applicativo JavaCome Incorporare un Interprete Groovy in un Applicativo Java
Come Incorporare un Interprete Groovy in un Applicativo JavaPaolo Predonzani
 
Come Incorporare un Interprete Groovy in Java
Come Incorporare un Interprete Groovy in JavaCome Incorporare un Interprete Groovy in Java
Come Incorporare un Interprete Groovy in JavaPaolo Predonzani
 
Model Driven Engineering - ManyDesigns Portofino
Model Driven Engineering - ManyDesigns PortofinoModel Driven Engineering - ManyDesigns Portofino
Model Driven Engineering - ManyDesigns PortofinoPaolo Predonzani
 

More from Paolo Predonzani (7)

Wiki-like collaborative development for seamless customer involvement
Wiki-like collaborative development for seamless customer involvementWiki-like collaborative development for seamless customer involvement
Wiki-like collaborative development for seamless customer involvement
 
How to put 100k lines of code into the (Google) cloud: storms and rainbows
How to put 100k lines of code into the (Google) cloud: storms and rainbowsHow to put 100k lines of code into the (Google) cloud: storms and rainbows
How to put 100k lines of code into the (Google) cloud: storms and rainbows
 
Portofino 4: Creare Webapp da Database Esistenti in 30 Secondi
Portofino 4: Creare Webapp da Database Esistenti in 30 SecondiPortofino 4: Creare Webapp da Database Esistenti in 30 Secondi
Portofino 4: Creare Webapp da Database Esistenti in 30 Secondi
 
Come Incorporare un Interprete Groovy in un Applicativo Java
Come Incorporare un Interprete Groovy in un Applicativo JavaCome Incorporare un Interprete Groovy in un Applicativo Java
Come Incorporare un Interprete Groovy in un Applicativo Java
 
Come Incorporare un Interprete Groovy in Java
Come Incorporare un Interprete Groovy in JavaCome Incorporare un Interprete Groovy in Java
Come Incorporare un Interprete Groovy in Java
 
Logging
LoggingLogging
Logging
 
Model Driven Engineering - ManyDesigns Portofino
Model Driven Engineering - ManyDesigns PortofinoModel Driven Engineering - ManyDesigns Portofino
Model Driven Engineering - ManyDesigns Portofino
 

70k linee di codice, tangle architetturali e le sfide del refactoring

  • 1. 70k linee di codice, tangle architetturali e le sfide del refactoring Paolo Predonzani (paolo.predonzani@manydesigns.com)
  • 2. “ Refactoring is a disciplined technique for restructuring an existing body of code, altering its internal structure without changing its external behavior.” (www.refactoring.org)
  • 3.
  • 4. Cosa faremmo senza 'find usages'?
  • 5. 'Find usages' a livello di package Package A Package B Package A Package B Questa è una 'layered architecture'
  • 6.
  • 7. DSM (Dependency Structure Matrix) con IntelliJ IDEA
  • 8. I package sono ordinati in base alle dipendenze principali I tangle sono evidenziati con bordo rosso Dipendenze circolari sono evidenziate in rosso Il numero indica quante dipendenze ci sono. L'indicazione “...” vuol dire “molti”
  • 9. Le dipendenze problematiche sono sopra la diagonale
  • 10. Esplorare una specifica dipendenza
  • 11. Dopo numerose fattorizzazioni... le dipendenze sono semplificate e organizzate
  • 12. class A public void f(B b) { ... } class B public void g(A a) { ... }
  • 13. class A public void f(B b) { ... } class B public void g(A a) { ... } Signature di A Signature di B
  • 14. class A public void f() { B b = ... ... } class B public void g() { A a = ... ... }
  • 15. class A public void f() { B b = ... ... } class B public void g() { A a = ... ... } Signature di A Signature di B Body di A Body di B
  • 16. interface A void f(); interface B void g(); class ImplA implements A public void f() { B b = ... ... } class ImplB implements B public void g() { A a = ... ... }
  • 17. Package A Package B Package ImplA Package ImplB Package Builder API Implementation Builder
  • 18. Package A Package B Package ImplA Package ImplB Package Builder API Implementation Builder