Un plug-in Eclipse per il supporto all'Extract Class Refactoring

92
“UN PLUG-IN ECLIPSE PER IL SUPPORTO ALL’EXTRACT CLASS REFACTORING” RELATORE: Chiar.mo Prof. Rocco OLIVETO CANDIDATO: Fabio PALOMBA Matricola: 134553 Anno Accademico 2010/2011 UNIVERSITÀ DEGLI STUDI DEL MOLISE FACOLTÀ DI SCIENZE MM.FF.NN CORSO DI LAUREA IN INFORMATICA Tesi di Laurea in Ingegneria del Software

description

Progettazione ed implementazione di un plug-in per la piattaforma Eclipse IDE che consente il supporto all'Extract Class Refactoring.

Transcript of Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Page 1: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

“UN PLUG-IN ECLIPSE PER IL SUPPORTO ALL’EXTRACT CLASS REFACTORING”

RELATORE: Chiar.mo Prof. Rocco OLIVETO

CANDIDATO:Fabio PALOMBAMatricola: 134553

Anno Accademico 2010/2011

UNIVERSITÀ DEGLI STUDI DEL MOLISE

FACOLTÀ DI SCIENZE MM.FF.NN CORSO DI LAUREA IN INFORMATICA

Tesi di Laurea in

Ingegneria del Software

Page 2: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Sommario

Background- L’Ingegneria del Software...- Qualità del codice e Antipattern...- L’Antipattern Blob e l’Extract Class Refactoring...

Il progetto A.R.I.ES.Automated Refactoring in Eclipse

Un approccio basato su grafi per l’Extract Classrefactoring...

Page 3: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

L’INGEGNERIA DELSOFTWARE

Background

Page 4: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Un’affermazione generica degli scopi è sufficiente per cominciare a scrivere programmi...

I mutamenti nei requisiti di un progetto si gestiscono

facilmente grazie alla flessibilità del software...

Alcuni miti del cliente

Page 5: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Un’affermazione generica degli scopi è sufficiente per cominciare a scrivere programmi...

I mutamenti nei requisiti di un progetto si gestiscono

facilmente grazie alla flessibilità del software...

Falso

Alcuni miti del cliente

Page 6: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

- L’Ingegneria del Software è la branca dell’Informatica che si occupa di definire metodi a supporto dello sviluppo del software per garantire

Page 7: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

- L’Ingegneria del Software è la branca dell’Informatica che si occupa di definire metodi a supporto dello sviluppo del software per garantire

il giusto prodotto...

Page 8: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

- L’Ingegneria del Software è la branca dell’Informatica che si occupa di definire metodi a supporto dello sviluppo del software per garantire

il giusto prodotto...

...al giusto costo....

Page 9: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

- L’Ingegneria del Software è la branca dell’Informatica che si occupa di definire metodi a supporto dello sviluppo del software per garantire

il giusto prodotto...

...al giusto costo....

...nei tempi giusti...

Page 10: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

- L’Ingegneria del Software è la branca dell’Informatica che si occupa di definire metodi a supporto dello sviluppo del software per garantire

il giusto prodotto...

...al giusto costo....

...nei tempi giusti...

...e con la giusta qualità...

Page 11: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Il ciclo di sviluppo indica tutte le attività

da seguire per arrivare alla consegna del

prodotto al cliente...

Ciclo di sviluppo ≠ Ciclo di vita

Page 12: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Ciclo di sviluppo ≠ Ciclo di vita

...Il ciclo di vita comprende la fase di

manutenzione...

Page 13: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Ciclo di sviluppo ≠ Ciclo di vita

...Il ciclo di vita comprende la fase di

manutenzione...

Page 14: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Lehman’s Laws

“Un sistema usato in ambienti reali necessariamente DEVE cambiare o

diventare progressivamente meno utile in quell’ambiente”

Cambiamento continuo...

Page 15: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Lehman’s Laws

“Quando un sistema cambia, la sua struttura tende a diventare più complessa. Risorse extra devono essere utilizzate per preservare e semplificare la struttura”

Entropia crescente...

Page 16: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Manutenzione del software

altri fattori tecnici influenzano le difficoltà

Page 17: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

software non progettato per modifiche future

Manutenzione del software

altri fattori tecnici influenzano le difficoltà

Page 18: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

software non progettato per modifiche future

mancanza di documentazione

Manutenzione del software

altri fattori tecnici influenzano le difficoltà

Page 19: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

software non progettato per modifiche future

mancanza di documentazione

Manutenzione del software

altri fattori tecnici influenzano le difficoltà

SOFTWARE DI BASSA QUALITÀ

Page 20: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Background

QUALITÀ DEL CODICEE ANTIPATTERN

Page 21: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Design Patterns

“Una soluzione progettuale generale ad un problema

ricorrente”

- Un modello da applicare per risolvere un problema...

- Non è un componente software riusabile...

Page 22: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Antipattern

Come un sistema dovrebbe essere

Come un sistema può diventare

Page 23: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Antipattern

Come un sistema dovrebbe essere

Come un sistema può diventare

Si può monitorare la qualità di un sistema?

Si può migliorare la qualità di un sistema?

Page 24: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Coesione

“Il grado di interdipendenzatra gli oggetti all’interno di

una singola classe”

Page 25: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Coesione

“Il grado di interdipendenzatra gli oggetti all’interno di

una singola classe”

Alta coesione è desiderabile

Page 26: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

“Il grado di interdipendenzatra due classi”

Accoppiamento

Page 27: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

“Il grado di interdipendenzatra due classi”

Accoppiamento

Basso accoppiamento è desiderabile

Page 28: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Antipattern

Come un sistema dovrebbe essere

Come un sistema può diventare

Si può migliorare la qualità di un sistema?

Page 29: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Antipattern

Come un sistema dovrebbe essere

Come un sistema può diventare

Si può monitorare la qualità di un sistema?

Si può migliorare la qualità di un sistema?

Page 30: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Refactoring?

Migliorare i requisiti non funzionali

Obiettivo

Apportare modifiche per semplificare la struttura del sistema

Mantenere il comportamento del sistema inalterato

Page 31: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Antipattern

Come un sistema dovrebbe essere

Come un sistema può diventare

Si può monitorare la qualità di un sistema?

Page 32: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Antipattern

Come un sistema dovrebbe essere

Come un sistema può diventare

Si può monitorare la qualità di un sistema?

Si può migliorare la qualità di un sistema?

Page 33: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

L’ANTIPATTERN BLOB E L’EXTRACT CLASS

REFACTORING

Background

Page 34: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Object-Oriented Programming

Object-Oriented programming è

Responsability-based...

Page 35: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Class

Class

Class

ClassClassClassClass

Spesso i programmatoriaggiungono responsabilità non

corrette ad una classe...

...facendola diventare troppo complessa e

con bassa coesione...

Page 36: Un plug-in Eclipse per il supporto all'Extract Class Refactoring
Page 37: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

BLOB

Page 38: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Dividere la classe avente troppe responsabilità in più classi

Input

Coesione = 0.2

BLOBOutput

Coesione = 0.5 Coesione = 0.4

Class C Class C1 Class C2

Extract Class Refactoring

Page 39: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

In che modo?

Input

Coesione = 0.2

Output

Coesione = 0.5 Coesione = 0.4

Class C Class C1 Class C2

BLOB

Extract Class Refactoring

Page 40: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Bavota et al.JSS 2011

Bavota et al.ASE 2010

graph theory

Fokaefs et al.ICSM 2009clustering graph theory

Stato dell’arte

Page 41: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Bavota et al.JSS 2011

Bavota et al.ASE 2010

graph theory

Fokaefs et al.ICSM 2009clustering graph theory

Stato dell’arte

Nessun tool disponibile

Page 42: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Bavota et al.JSS 2011

Bavota et al.ASE 2010

graph theory

Fokaefs et al.ICSM 2009clustering graph theory

Stato dell’arte

NESSUN METODO DI IDENTIFICAZIONE DI BLOB

Page 43: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Bavota et al.JSS 2011

Bavota et al.ASE 2010

graph theory

Fokaefs et al.ICSM 2009clustering graph theory

Stato dell’arte

NESSUN METODO DI IDENTIFICAZIONE DI BLOB

Page 44: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Il progetto A.R.I.ES.

Page 45: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Bavota et al.ASE 2010

Page 46: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Bavota et al.ASE 2010

Chiusura transitiva della matrice method-by-method

Page 47: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Bavota et al.ASE 2010

Chiusura transitiva della matrice method-by-method

Output: Catene di metodi fortemente correlate

Page 48: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

m1 m2 m3

m1

m2

m3

Costruzione della matrice Method-by-Method (1)

Passo 1: Calcolo della somiglianza strutturale

VCM: Variable-based Cohesion

between Methods

ci,j

m1 m2 m3

m1

m2

m3

Page 49: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Costruzione della matrice Method-by-Method (2)

Passo 2: Calcolo della somiglianza strutturale

CCM: Call-based Cohesionbetween Methods

m1 m2 m3

m1

m2

m3

ci,j

m1 m2 m3

m1

m2

m3

Page 50: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Costruzione della matrice Method-by-Method (3)

Passo 3: Calcolo della somiglianza semantica

m1 m2 m3

m1

m2

m3

m1 m2 m3

m1

m2

m3

ci,j

m1 m2 m3

m1

m2

m3 CSM: Conceptual Similarity

between Methods

Page 51: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

ci,j

m1 m2 m3

m1

m2

m3

m1 m2 m3

m1

m2

m3

m1 m2 m3

m1

m2

m3

m1 m2 m3

m1

m2

m3

wvcm

wccm

wcsm

VCM

CCM

CSM

*

Passo 4: La matrice Method-by-Method

*

*

*

Page 52: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

m1 m2 m3

m1

m2

m3

Passo 5: Filtraggio della matrice e chiusura transitiva

0,3 0,6

0,80,3

0,6 0,8

minCoupling = 0,4

Filtraggio della matrice Method-by-Method

Page 53: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

m1 m2 m3

m1

m2

m3

Passo 5: Filtraggio della matrice e chiusura transitiva

0,3 0,6

0,80,3

0,6 0,8

minCoupling = 0,4

Filtraggio della matrice Method-by-Method

Page 54: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

m1 m2 m3

m1

m2

m3

Passo 5: Filtraggio della matrice e chiusura transitiva

0,3 0,6

0,80,3

0,6 0,8

minCoupling = 0,4

Filtraggio della matrice Method-by-Method

Page 55: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

m1 m2 m3

m1

m2

m3

Passo 5: Filtraggio della matrice e chiusura transitiva

0,6

0,8

0,6 0,8

0

Filtraggio della matrice Method-by-Method

minCoupling = 0,4

0

0

Page 56: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

DU

UU

CU

IU0.6

0.7

Candidate Chain C1

Candidate Chain C2

Trivial Chain T1

UUIU DU

Candidate Class C1

DTIT UT CT

Candidate Class C2

EU

Method-by-method Relationships before Filtering Method-by-method Relationships after Filtering Proposed Refactoring

0.7

EU

0.7

0.2

IT

0.1

0.60.1

0.6

UT

DT

CT

0.7

0.6

0.3

0.6

0.3

0.1

DU

UU

CU

IU0.6

0.7

0.7

EU

0.7

IT0.6

0.6

UT

DT

CT

0.7

0.6

0.3

0.6

0.3

CU

method-by-method matrix after transitive closure proposed refactoring

Passo 6: Fusione delle trivial-chains

Page 57: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Automated Refactoring in Eclipse

Page 58: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Automated Refactoring in Eclipse

Page 59: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Automated Refactoring in Eclipse

Identificazione automatica di Blob

Page 60: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Automated Refactoring in Eclipse

Identificazione automatica di Blob

Analisi dei Blob

Page 61: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Automated Refactoring in Eclipse

Identificazione automatica di Blob

Analisi dei Blob

Extract Class Refactoring

Page 62: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Automated Refactoring in Eclipse

Identificazione automatica di Blob

Analisi dei Blob

Extract Class Refactoring

Page 63: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Check Quality

Passo 1: Calcolo delle metriche a livello di progetto

LCOM: Lack of Cohesion in Methods

C3: Conceptual Cohesion of Classes

MPC: Message Passing Coupling

Page 64: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Lack of Cohesion in Methods

- Ii insieme delle variabili d’istanza

Page 65: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Conceptual Cohesion of Classes

Definita

Message Passing Coupling

Data la classe C,

Page 66: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Check Quality

Passo 2: Estrazione degli outliers

Page 67: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Check Quality

Passo 2: Estrazione degli outliers

Una classe è outlier se non è in linea con la qualità media

del sistema

Page 68: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Check Quality

Passo 2: Estrazione degli outliers

Una classe è outlier se non è in linea con la qualità media

del sistema

Migliorando la qualità degli outliers superiori, migliora la qualità dell’intero sistema

Page 69: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Check Quality

A.R.I.ES. Check Quality

Page 70: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Automated Refactoring in Eclipse

Identificazione automatica di Blob

Analisi dei Blob

Extract Class Refactoring

Page 71: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Automated Refactoring in Eclipse

Identificazione automatica di Blob

Analisi dei Blob

Extract Class Refactoring

Page 72: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Passo 3: Analisi della classe identificata

Analyzer

Topic Map

Page 73: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Passo 3: Analisi della classe identificata

Rappresentazione degli argomenti della classe

Analyzer

Topic Map

Page 74: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Passo 3: Analisi della classe identificata

Rappresentazione degli argomenti della classe

L’ideale sarebbe avere classi che gestiscono un singolo

argomento

Analyzer

Topic Map

Page 75: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Analyzer

A.R.I.ES. Analyzer

Page 76: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Automated Refactoring in Eclipse

Identificazione automatica di Blob

Analisi dei Blob

Extract Class Refactoring

Page 77: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Automated Refactoring in Eclipse

Identificazione automatica di Blob

Analisi dei Blob

Extract Class Refactoring

Page 78: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Extract Class Refactoring

A.R.I.ES. Extract Class Refactoring

Page 79: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Extract Class Refactoring

A.R.I.ES. Extract Class Refactoring

Proposte ottenute dall’algoritmo di estrazione

basato su grafi

Page 80: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Extract Class Refactoring

A.R.I.ES. Extract Class Refactoring

Proposte ottenute dall’algoritmo di estrazione

basato su grafi

Personalizzazione della proposta

Page 81: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Extract Class Refactoring

A.R.I.ES. Extract Class Refactoring

Page 82: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Extract Class Refactoring

Preview della qualità raggiunta con l’estrazione

A.R.I.ES. Extract Class Refactoring

Page 83: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

conclusionisviluppi futuri

Page 84: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Bavota et al.ASE 2010

Conclusioni

Page 85: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Bavota et al.ASE 2010

Conclusioni

Nessun tool che implementa il metodo

Page 86: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Nessun metodo di identificazione di Blob

Bavota et al.ASE 2010

Conclusioni

Nessun tool che implementa il metodo

Page 87: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Bavota et al.ASE 2010

Conclusioni

Palomba et al.ICSE 2012 (in revision)

Page 88: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Sviluppi futuri

Class C1 Class C2

methodA()...methodN()

Package P1Package P2

classA()

...classN()

Move Method Refactoring

Move Class Refactoring

methodM()...

classM()...

classW()

Page 89: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Sviluppi futuri

Class C1 Class C2

methodA()...methodN()

Package P1Package P2

classA()

...classN()

Move Method Refactoring

Move Class Refactoring

methodM()...

classM()...

classW()

Page 90: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Sviluppi futuri

Class C1 Class C2

methodA()...methodN()

Package P1Package P2

classA()

...classN()

Move Method Refactoring

Move Class Refactoring

methodM()...

classM()...

classW()

Page 91: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Sviluppi futuri

Class C1 Class C2

methodA()...methodN()

Package P1Package P2

classA()

...classN()

Move Method Refactoring

Move Class Refactoring

methodM()...

classM()...

classW()

Page 92: Un plug-in Eclipse per il supporto all'Extract Class Refactoring

Grazie!

Questions and/orcomments

Fabio Palomba [email protected]