REFACTORING
APPLIED:
Pratica avanzata del Refactoring
www.luca.minudel.it
1
Sponsor
2
Obiettivi
Refactoring, perché?
Quali prerequisiti per il Refactoring?
Come comprendere e reagire ai feedback
del codice?
3
Premessa
Refactoring è il processo per modificare
un sistema software in modo tale da
migliorare la struttura interna del codice
senza alterarne il comportamento esterno.
M. Fowler
4
Premessa
Introduzione al Refactoring:
http://www.agileday.it/slides/BrunoBossola.zip
5
REFACTORING, PERCHÉ?
Riconoscere situazioni e problemi che si
risolvono con il Refactoring
6
Il Refactoring è Disegno
Il Disegno classico... non si fa o... si fa con un
processo diviso in “Fasi”
Il Refactoring si fa continuamente: mentre si
scrive il codice
7
Il Refactoring è Disegno
Il Disegno classico up-front:
raccolta dei Requisiti e definizione Specifiche
il Disegno “up-front”
e poi Implementazione (in fretta: c’è poco tempo)
Il Refactoring continuo:
TDD: Rosso->Verde->Refactoring
Implementa->problemi dal codice?->Refactoring
8
Quando e quanto Refactoring
(Disegno) fare?
Per dominare la complessità
il sistema da realizzare ci sembra molto complesso
Per permettere l’evoluzione
il cliente desidera poter aggiungere o modificare
funzionalità senza rifare tutto
la software house vuole ridurre i costi di manutenzione o
adattare il sistema a più clienti
Quanto?
9
Refactoring Vs Design
disegno up-front e refactoring possono
coesistere
i principi del disegno valgono ancora ed è
necessario conoscerli
10
Refactoring Vs Design
Quali i vantaggi del Refactoring?
ci sono requisiti importanti che il cliente scopre
dopo...
ci sono cose a cui il team di sviluppo non
aveva pensato!
quando il progetto è lungo i bisogni del cliente
possono cambiare... e con loro i requisiti
-> Adattarsi velocemente ai cambiamenti
11
Refactoring Vs Design
Quali i vantaggi del Refactoring?
è difficile “indovinare” il disegno migliore al primo colpo
non si riesce a decidere come implementare alcune
funzionalità
implementando una funzionalità il disegno… degenera
a volte ci sono pezzi di codice che... non si sa più cosa
fanno o come funzionano
altre volte si può migliorare il disegno... cancellando parti
di codice
12
-> Migliorare grazie ai feedback del codice
Cos’è
buon Refactoring (Design) ?
Il codice diventa più
Flessibile
riesco a fare una modifica intervenendo localmente in
parti isolate del codice
Robusto
faccio una singola modifica del codice e questa incide
solo sul codice strettamente/logicamente correlato
Riusabile
riesco facilmente ad estrarre dal codice le funzionalità
per riutilizzarle
13
Cos’è
buon Refactoring?
Il codice diventa più semplice ...
da capire
da analizzare
da modificare
da testare
14
Cos’è
buon Refactoring?
È secondario mah… anche per l’utente
potrebbero esserci benefici :-D
Estrema semplicità ->
meno errori sui dati
meno errori run-time (o fermi macchina)
programmi più veloci
niente spreco di risorse
15
Refactoring (Design):
Quali problemi risolve?
per correggere un bug ci vuole troppo
tempo!
aggiungere una nuova funzionalità è...
un’impresa difficile e rischiosa!!!
è diventato impossibile stimare tempi e
costi degli interventi richiesti dal cliente???
i clienti continuano a chiedere modifiche,
il programma è a “fine corsa”, nessuno ha
il coraggio di rifarlo.
16
Azioni concrete:
17
REFACTORING
QUALI PREREQUISITI?
Dotarsi del necessario per applicare il Refactoring
in continuo miglioramento
18
Refactoring del 1° tipo
Le “code smell” che possono essere
individuate automaticamente con le
metriche OO
metodi/classi lunghe
lunghe liste di parametri
liste di switch/if
generalizzazione speculativa
!
vedi oometrics4refactoring.html
19
Refactoring del 1° tipo,
VS.NET & Vil
Command:
C:\Programmi\...\refactoringmetrics.cmd
Arguments:
$(TargetDir)*$(TargetExt) $(SolutionDir)
vil /nologo /a=%1 /m=loc,locals /s=loc
... /sc=imp /h
... /title="Membri troppo lunghi"
... /outhtmlshort=%2_locmembri.tmp
vil ...
cd /d %2
echo ^<br^> ^<br^> ^<br^> > _s.tmp
copy _locmembri.tmp+_s.tmp+...
... oometrics4refactoring.html > nul
20
oometrics4refactoring.html
Refactoring del 1° tipo & TDD
21
Refactoring del 2° tipo
Le “code smell” che richiedono “naso”
codice duplicato
cambiamenti divergenti
shotgun surgery
feature envy
generalizzazione speculativa
commenti
22
Refactoring del 2° tipo:
fare pratica!
23
Refactoring del 2° tipo:
la preparazione
Programmazione OO
Disegno
Architettura
24
Refactoring del 2° tipo:
la preparazione
Programmazione OO
Cos'è il paradigma di programmazione OO? (cosa lo distingue dal
paradigma di progr. procedurale, di progr. modulare/data hiding, di
astrazione dei dati)
Quando definire una classe base o quando definire un'interfaccia?
Quando usare l'ereditarietà e quando il contenimento (riferimento,
puntatore)?
Quando usare l'ereditarietà e quando usare un “flag” per discriminare
diversi tipi?
Quando usare il polimorfismo run-time (funzioni virtuali) e quando il
polimorfismo compile-time (template/generics)?
Le funzioni (namespace, classi, costruttori, operatori, conversioni,
overloading, funzioni virtuali, membri statici, visibilità, eccezioni,
const/readonly...) del linguaggio che astrazioni definiscono e a cosa 25
servono?
Refactoring del 2° tipo:
la preparazione
Disegno
Cos'è il disegno e che differenza c'è con l'analisi?
Quando serve fare disegno?
Come si usano le schede CRC?
Secondo quali criteri un disegno è buono (rigidità, fragilità, immobilità; alta
coesione-basso accoppiamento)?
Quali sono i casi di buon disegno da prendere come esempio o da
conoscere?
- I Design Pattern
- ISO OSI Reference Model, TCP/IP Reference Model
- Protocollo HTTP
- Stili, paradigmi e principi dell'interazione utente (HCI)
Quali principi guidano il Design (LSP Liskov Substitution Principle, OCP
Open Close Principle, DIP Dependency Inversion Principle, SRP Single
Responsibility Principle, ISP Interface Segregation Principle,
REP/CCP/CRP/ADP/SDP/SAP Packaging Principles, The Martin Metrics)? 26
Che diagrammi di modellazione si usano per descrivere un Disegno (UML)?
Refactoring del 2° tipo:
la preparazione
Architettura
Cos'è l'architettura e cosa la distingue dal disegno?
Cos'è l'architettura e cosa la distingue dall'infrastruttura?
Da quali requisiti dipende e che obiettivi ha l'architettura di un sistema?
Quali sono i principali Enterprise Application Patterns (multi-tiers, ...)?
Quali sono i principali modelli di strutturazione (repository, C/S, abstractlayered) e controllo (Centralizzed call-return manager; event-driven
broadcast, interrupt driven) di una architettura?
27
Refactoring e Design Pattern?
Refactoring to Patterns
di Joshua Kerievsky
Addison Wesley Professional
http://industriallogic.com/xp/refactoring
applicare i Pattern per migliorare del
codice già scritto (con il refactoring)
dà ottimi risultati…
…migliori che applicare i Pattern nel
disegno iniziale
28
Azioni concrete:
29
COMPRENDERE & REAGIRE
AI FEEDBACK DEL CODICE
Esempio "Live" di Refactoring del 2° tipo
applicato al codice dell'interazione utente
!
30
Concludendo: i 3 punti chiave
Individuare i casi in cui applicare il
Refactoring da maggiore beneficio (ROI)
Riconoscere nel codice i difetti che il
Refactoring risolve e i benefici che comporta
Applicare il Refactoring con continuità e
formarsi sul design OO
31
Call to Action!
Fare pratica
al lavoro: selezionare i progetti con maggiore
ROI per il Refactoring (feedback Vil e Svi/PM)
su progetti propri/open-source
per esercizio: aggiungere all’esempio il
controllo della navigazione:
http://www.ugidotnet.org/articles/articles_read.aspx?ID=90
Formarsi
Refactoring
Programmazione e disegno OO
32
Prossime letture!
http://www.refactoring.com/
http://c2.com/cgi/wiki?CodeSmell
http://wiki.java.net/bin/view/People/SmellsToRefactorings
http://industriallogic.com/xp/refactoring
http://www.sei.cmu.edu/str/descriptions/oodesign.html
http://www.objectmentor.com/resources/ voce “Object Oriented Design”
www.martinfowler.com/ieeeSoftware/whoNeedsArchitect.pdf
http://martinfowler.com/books.html#eaa
http://www.extremeprogramming.org/
http://www.uml.org/
http://msdn.microsoft.com/msdnmag/issues/04/04/ExtremeProgramming/
http://www.microsoft.com/learning/books/professional/
33
Domande
Risposte
&
34
Fine
35
Scarica

REFACTORING APPLIED: