Download - L'arte perduta di pensare ad oggetti
![Page 1: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/1.jpg)
Matteo [email protected]
[email protected](cc) Alcuni diritti riservati
L’arte perduta di pensare a oggetti
![Page 2: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/2.jpg)
Che obiettivo ci diamo?
![Page 3: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/3.jpg)
Costo del cambiamento
Kent Beck, Extreme Programming Explained
![Page 4: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/4.jpg)
Può essere così?
Kent Beck, Extreme Programming Explained
![Page 5: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/5.jpg)
OCP, DIP, SRP, LSP,...
Decorator, Mediator, Bridge, Adapter, Composite,
Visitor, Flyweight...
![Page 6: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/6.jpg)
Not so many people can:
• start with some simple, concrete user stories and build a minimal yet flexible object model,
Dafydd Rees, Responsibility Driven Design References http://www.dafydd.net/archive/2010/
![Page 7: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/7.jpg)
Minimo ma flessibile
Dafydd Rees
![Page 8: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/8.jpg)
Finalmente ho capito come collaborare!
1982 Commodore Vic201991 Laurea in Scienze dell'Informazione1998 Dottorato in Informatica2003 Extreme Programming! 2007 Team Orione in Sourcesense → XPeppers2009 Workshop su Design Emergente FC2011 Object Thinking
APPASSIONATOHOTSHOTFORMALISTAXPer
Una storia
Non tutti i progetti fatti con XP vanno bene. Alcuni hanno problemi di
qualità del codice...Forse che ho
trascurato il design?
![Page 9: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/9.jpg)
Che cos’è un oggetto?
![Page 10: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/10.jpg)
Che cos’è un oggetto?
Data
Proc1
Proc2 Proc3
Proc4
Proc5
David West, Object Thinking
![Page 11: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/11.jpg)
OOP è un paradigma nuovo
OOP decompone il software in maniera diversa
![Page 12: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/12.jpg)
Solve Problem
Read Input
Compute Answer
Write Output
Setup Printer
Iterate over
things
Close Printer
Open Stream
Read things
Validate Things
Store Things Foo Bar Baz
![Page 13: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/13.jpg)
Pryce e Freeman, Growing Object-Oriented Software
![Page 14: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/14.jpg)
Pensiero a oggetti Pensiero formalevs.
![Page 15: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/15.jpg)
Kent Beck, Ward Cunningham http://c2.com/doc/oopsla89/paper.html
Class, Responsibilities, Collaborators
Vs The UML formal meta-model
![Page 16: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/16.jpg)
Vs
![Page 17: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/17.jpg)
Vs. documenti di specifica
Cards + conversations
![Page 18: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/18.jpg)
Eiffel
Vs
Smalltalk
![Page 19: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/19.jpg)
Un esempio: http access log report
![Page 20: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/20.jpg)
Access Log ReportEsercizio - estrarre un report da un file di accessi di Apache
Si vuole scrivere un programma batch che legge in input un file di accessi di Apachee produce in output un report.
Il nostro input è un file di questo tipo:
192.168.20.192 - - [29/Jul/2011:14:19:48 +0200] "GET / HTTP/1.1" 200 11870192.168.20.192 - - [29/Jul/2011:14:19:49 +0200] "GET /tomcat.png HTTP/1.1" 304 -192.168.20.192 - - [29/Jul/2011:14:20:39 +0200] "POST /phoenix-0.0/phoenixServlet HTTP/1.1" 200 264192.168.20.192 - - [29/Jul/2011:14:21:23 +0200] "GET /phoenix-0.0/tranpipe-demo/demo.html HTTP/1.1" 304 -192.168.20.191 - - [29/Jul/2011:15:48:04 +0200] "POST /phoenix-0.0/phoenixServlet HTTP/1.1" 200 263192.168.100.184 - - [01/Aug/2011:13:20:49 +0200] "GET /manager/status?XML=true HTTP/1.1" 401 2486
Il nostro obiettivo è estrarre un report di questa forma
data risultati-2xx risultati-3xx risultati-4xx risultati-5xx29/Jul/2011 1223 23 456 1201/Aug/2011 1212 24 11 123
![Page 21: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/21.jpg)
![Page 22: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/22.jpg)
Usa la forza degli oggetti, Luke!
![Page 23: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/23.jpg)
Access Calendar
Day Report
AccessLog
![Page 24: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/24.jpg)
Usa la forza del TDD, Luke!
![Page 25: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/25.jpg)
First test: a report with one row and one column
![Page 26: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/26.jpg)
Second test: choose to develop rows? or to develop columns?
![Page 27: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/27.jpg)
“Semplici strutture dati”
![Page 28: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/28.jpg)
Mature programmers know that the idea that everything is an object is
a myth. Sometimes you really do want simple data structures with
procedures operating on them.
Robert Martin, Clean Code
![Page 29: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/29.jpg)
Robert Martin, Clean Coders episode VII
![Page 30: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/30.jpg)
![Page 31: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/31.jpg)
<form> <label for="firstName">First Name</label> <input id="firstName" name="firstName" value="${firstName}" /> <label for="lastName">Last Name</label> <input id="lastName" name="lastName" value="${lastName}" /> <label for="email">Email</label> <input id="email" name="email" value="${email}" /> <!-- and so on and so forth for 100 other fields --></form>
![Page 32: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/32.jpg)
public ErrorList validate() { ErrorList errors = new ErrorList(); if (isEmpty(firstName)) { errors.add("First Name is required"); } if (isEmpty(lastName)) { errors.add("Last Name is required"); } // and so on and so forth .... return errors; }}
class RegistrationRequest { private String firstName; private String lastName; private String email; // and so on and so forth ...
public void setFirstName(String firstName) { this.firstName = firstName; }
public String getFirstName() { return firstName; } // and so on and so forth ...
![Page 33: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/33.jpg)
class RegistrationRequestController { public void handleRequest( HttpServletRequest request, HttpServletRequest response ) { RegistrationRequest rr = new RegistrationRequest(); rr.setFirstName(request.getParameter("firstName")); rr.setLastName(request.getParameter("lastName")); rr.setEmail(request.getParameter("email")); // etc etc ... if (rr.isEmpty()) { registrationDao.save(rr); response.redirectTo(THANKYOU_PAGE); } else { registrationView.setErrors(errors); response.getWriter().write(registrationView.toHtml()); } }}
![Page 34: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/34.jpg)
class RegistrationDao {
public void save(RegistrationRequest rr) { String sql = "insert into registration_requests" + " (firstName, lastName, email, ...) " + // etc. " values (?,?,?,....)"; // etc. PreparedStatement statement = connection.prepareStatement(sql); statement.setObject(1, rr.getFirstName()); statement.setObject(2, rr.getLastName()); // ... arrrgh! statement.execute(); }}
![Page 35: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/35.jpg)
The basic principle of recursive design is to make the parts have the same power as the whole.
-- Alan Kay
![Page 36: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/36.jpg)
public class User extends CompositeDataItem { private PrimaryKeyDataItem userId = new PrimaryKeyDataItem("UserId"); private StringDataItem username = new NonEditableStringDataItem("Username"); private StringDataItem firstName = new StringDataItem("FirstName"); private StringDataItem lastName = new StringDataItem("LastName"); private PasswordDataItem password = new PasswordDataItem("Password", "HashedPassword"); private StringDataItem email = new StringDataItem("Email"); private BooleanDataItem enabled = new BooleanDataItem("Enabled");
public User(Row row) { for (DataItem item : items.values()) { item.setFrom(row); } }
public User(ParameterMap parameterMap) { for (DataItem item : items.values()) { item.setFrom(parameterMap); } }
![Page 37: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/37.jpg)
public void displayDataOn(HtmlForm form) { for (DataItem item : items.values()) { item.displayDataOn(form); form.addRow(); } } public Row getDatabaseRow() { Row row = new Row(); for (DataItem item : items.values()) { item.putIn(row); } return row; }
![Page 38: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/38.jpg)
public class UserView extends CrudView { private HtmlForm form;
public void buildForm(CompositeDataItem user) { form = new HtmlForm(HttpMethod.POST); user.displayDataOn(form); this.add(form); }}
![Page 39: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/39.jpg)
public class UserInsertController { // ... public void handleRequest(WebRequest request, WebResponse response) { if (request.isPost()) { User user = new User(request.parameterMap()); ErrorList errorList = user.validate(); if (errorList.isNotEmpty()) { view.setError(errorList.toHtmlElement()); return; } registry.insertUser(user); response.redirectTo(user.url()); } view.buildForm(new User(request.parameterMap())); }
![Page 40: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/40.jpg)
1982 Commodore Vic201991 Laurea in Scienze dell'Informazione1998 Dottorato in Informatica2003 Extreme Programming! 2007 Team Orione in Sourcesense → XPeppers2009 Workshop su Design Emergente FC2011 Object Thinking2012 Success!
APPASSIONATOHOTSHOTFORMALISTAXPer
Una storia...
L’ultimo progetto consegnato dal “mio” team XP: 1400 giornate su nove mesi, messo in produzione con pochissimi difetti e nei tempi
previsti!...che prosegue...
![Page 41: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/41.jpg)
OOP è umanesimo
![Page 42: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/42.jpg)
Per saperne di più:
![Page 43: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/43.jpg)
Per saperne di più:
http://www.cleancoders.com/codecast/clean-code-episode-7/show
Architecture: the lost yearshttp://www.youtube.com/watch?v=WpkDN78P884
![Page 44: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/44.jpg)
Per saperne di più:Francesco Cirillo
Kent Beck ha già scritto un libro suldesign a oggetti -- è il libro sul TDD
(Workshop Design Emergente 2009)
![Page 45: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/45.jpg)
Want to know more?
http://matteo.vaccari.name/blog/
[email protected]: @xpmatteo
This presentation can be downloaded from http://slideshare.net/xpmatteo
![Page 46: L'arte perduta di pensare ad oggetti](https://reader034.vdocuments.pub/reader034/viewer/2022052410/554a12c1b4c905825d8b4bdd/html5/thumbnails/46.jpg)
Grazie dell’attenzione!
Extreme Programming:development & mentoring