20050621 Ridurre il Costo del Cambiamento Applicando il Design Object Oriented @JavaConference2005 Milano-IT [ITA]
1. Ridurre il costo del
cambiamento applicando il
Design Object-Oriented
Francesco Cirillo
Chief Executive Officer
XPLabs S.R.L.
Java Conference 2005
2. Introduzione
– Il nostro obiettivo...
– L'obiettivo del Design Tradizionale
– L'obiettivo del Design Emergente
– Metodo
● Guidati dal cambiamento
● Approccio responsibility-driven
– Per 50 min, dimenticatevi dell'esistenza dei
framework :)
– Libro e reviewer
Java Conference 2005
20. Sembra una buona
soluzione, invece...
– Voglio separare la logica della scrittura in
HTML o PDF da quella della
organizzazione del layout...
– (=e se domani dovesse cambiare solo il
layout...)
Java Conference 2005
22. Oggetti tristi...
– Ci sono altri oggetti tristi nel nostro
sistema?
Java Conference 2005
23. E se...
– ...il nostro cliente ci chiedesse di
considerare per gli impiegati anche gli
straordinari
● dalle 18.00 si applica un moltiplicatore
1,5
– ...o cambiare la politica di remunerazione di
commerciali e/o manager?
Java Conference 2005
26. Ecco i datastore...
public class Contratto { public class Strisciata {
public Contratto(double importo) public Strisciata(int ingresso,
{ int uscita) {
this.importo = importo; this.ingresso = ingresso;
} this.uscita = uscita;
}
public double importo() {
return importo; public int ingresso() {
} return ingresso;
}
private double importo;
} public int uscita() {
return uscita;
}
private int ingresso;
private int uscita;
}
Java Conference 2005
28. Il commerciale sa
fare tutto...
public class Commerciale... {
...
public double calcolaRetribuzione() {
double compenso = 1000.0;
for (int i = 0; i < contratti.size(); i++) {
Contratto contratto = (Contratto) contratti.get(i);
compenso += (contratto.importo()*3.0)/100.0;
}
return compenso;
}
...
}
Java Conference 2005
29. L'impiegato sa
fare tutto...
public class Impiegato... {
...
public int calcolaRetribuzione() {
double compenso;
int lavoro = 0;
for (int i = 0; i < strisciate.size(); i++) {
Strisciata strisciata = (Strisciata) strisciate.get(i);
lavoro += (strisciata.uscita() - strisciata.ingresso());
}
compenso += lavoro * 30.0;
return compenso;
}
...
}
Java Conference 2005
31. Un oggetto felice!
public class Contratto {
public Contratto(double importo) {
this.importo = importo;
}
public double compenso() {
return importo()*3.0/100.0;
}
private double importo() {
return importo;
}
private double importo;
}
Java Conference 2005
32. Un oggetto felice!
public class Strisciata {
public Strisciata(int ingresso, int uscita) {
this.ingresso = ingresso;
this.uscita = uscita;
}
public int lavoro() {
return uscita() - ingresso();
}
private int ingresso() {
return ingresso;
}
private int uscita() {
return uscita;
}
private int ingresso;
private int uscita;
}
Java Conference 2005
33. Il commerciale sa
delegare...
public class Commerciale... {
...
public double calcolaRetribuzione() {
double compenso = 1000;
for (int i = 0; i < contratti.size(); i++) {
Contratto contratto = (Contratto) contratti.get(i);
compenso += contratto.compenso();
}
return compenso;
}
...
}
Java Conference 2005
34. L'impiegato può
delegare di più...
public class Impiegato... {
...
public double calcolaRetribuzione() {
double compenso;
int lavoro = 0;
for (int i = 0; i < strisciate.size(); i++) {
Strisciata strisciata = (Strisciata) strisciate.get(i);
lavoro += strisciata.lavoro();
}
compenso = lavoro * 30.0;
return compenso;
}
...
}
Java Conference 2005
35. L'impiegato sta imparando
a delegare...
public class Impiegato... {
...
public int calcolaRetribuzione() {
double compenso;
int lavoro = 0;
for (int i = 0; i < strisciate.size(); i++) {
Strisciata strisciata = (Strisciata) strisciate.get(i);
lavoro += (strisciata.uscita() - strisciata.ingresso());
compenso += lavoro * 30.0;
}
return compenso;
}
...
}
Java Conference 2005
36. L'impiegato sa delegare...
public class Impiegato... {
...
public int calcolaRetribuzione() {
double compenso;
int lavoro = 0;
for (int i = 0; i < strisciate.size(); i++) {
Strisciata strisciata = (Strisciata) strisciate.get(i);
compenso += strisciata.compenso();
}
return compenso;
}
...
}
Java Conference 2005
41. E se...
– ...il nostro cliente ci chiedesse di usare il
nostro sistema da un telefono cellulare, da
un client via socket, o da un'applicazione
con GUI?
Java Conference 2005
43. ReportMensileServlet...
– Cosa dovrebbe fare?
● Semplice meccanismo di
comunicazione: inoltrare richieste
– Cosa fa ancora?
● Gestisce l'input del cliente
● Coordina le funzionalità di alto livello
● Coordina l'accesso al DB
● Gestisce i casi eccezionali
● Scrive la pagina HTML con le info
dell'azienda
Java Conference 2005
44. ReportMensileServlet...
– Cosa dovrebbe fare?
● Semplice meccanismo di
comunicazione: inoltrare richieste
– Cosa fa ancora?
● Gestisce l'input del cliente
● Coordina le funzionalità di alto livello
● Coordina l'accesso al DB
● Gestisce i casi eccezionali
● Scrive la pagina HTML con le info
dell'azienda
Java Conference 2005
51. DipartimentoRisorseUmaneHtml...
– Cosa dovrebbe fare?
● Glue object: coordinare
– Cosa fa?
● Coordina le funzionalità di alto livello
● Coordina l'accesso al DB
● Gestisce i casi eccezionali
● Scrive la pagina HTML con le info
dell'azienda
Java Conference 2005
52. DipartimentoRisorseUmaneHtml...
– Cosa dovrebbe fare?
● Glue object: coordinare
– Cosa fa?
● Coordina le funzionalità di alto livello
● Coordina l'accesso al DB
● Gestisce i casi eccezionali
● Scrive la pagina HTML con le info
dell'azienda
Java Conference 2005
61. DipartimentoRisorseUmaneHtml...
– Cosa dovrebbe fare?
● Glue object: coordinare
– Cosa fa?
● Coordina le funzionalità di alto livello
● Coordina l'accesso al DB
● Gestisce i casi eccezionali
● Scrive la pagina HTML con le info
dell'azienda
Java Conference 2005
62. DipartimentoRisorseUmaneHtml...
– Cosa dovrebbe fare?
● Glue object: coordinare
– Cosa fa?
● Coordina le funzionalità di alto livello
● Coordina l'accesso al DB
● Gestisce i casi eccezionali
● Crea la pagina HTML
● Scrive le info dell'azienda sulla pagina
HTML
Java Conference 2005
66. DipartimentoRisorseUmaneHtml...
– Cosa dovrebbe fare?
● Glue object: coordinare
– Cosa fa?
● Coordina le funzionalità di alto livello
● Coordina l'accesso al DB
● Gestisce i casi eccezionali
● Crea la pagina HTML
● Scrive le info dell'azienda sulla pagina
HTML
● Coordina gli oggetti HTML di sua
responsabilità
Java Conference 2005
70. Conclusioni
● Attraverso il design abbiamo ottenuto un sistema in cui a
basso costo (aggiungendo un nuovo modulo senza
modificare i preesistenti) è ora possibile:
– Modificare le fonti di persistenza (rdbms, xml, dummy)
– Modificare il layout della busta paga
– Modificare il tipo di risorsa umana
– Modificare il tipo di output della busta paga (html,
pdf, ...)
– Modificare le strategie di calcolo delle retribuzioni per
impiegati, manager e commerciali
– Modificare il tipo di client (http, wap, socket, GUI)
– Modificare la gestione dei parametri della servlet
Java Conference 2005
71. Conclusioni
● Rispetto a prima:
– Maggiore numero di classi
– Responsabilità più atomiche
– Maggiore testabilità
– Maggiore coesione e minore accoppiamento
● I miti dell'OO:
– Riuso
– Metodi da una due righe
– No if e switch (neanche for :) )
– I Design Pattern
Java Conference 2005
72. Conclusioni
● Differenze:
– Anticipare
– Faremergere
● Elementi comuni:
– Approccio di sintesi
– Umiltà
Java Conference 2005
73. Ridurre il costo del
cambiamento con l'OOD
● Domande?
Java Conference 2005