Top Banner
Francesco Cirillo – [email protected] MetodiAgili.it Javaday Roma - 01/12/2007 Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Campagna Anti-IF: Java e i linguaggi dinamici, incrementare le potenzialità espressive di Java [“Eliminare” i FOR]
30

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – [email protected] MetodiAgili.it Javaday Roma - 01/12/2007.

Mar 27, 2015

Download

Documents

Jason MacDonald
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License

Campagna Anti-IF:Java e i linguaggi dinamici, incrementare le potenzialità espressive di Java[“Eliminare” i FOR]

Page 2: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License

Campagna Anti-IF

Page 3: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License

Obiettivo

Più potere a Java “senza” i FOR Paper su come “eliminare” i FOR

Esperienza di design evolutivo Attraverso il refactoring Usando i principi di design

Far vincere qualche maglietta :)

Page 4: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License

Sviluppo Java Web: lento!

News [email protected]

http://it.groups.yahoo.com/group/extremeprogramming-it/message/4485:…> E poi detta tutta java a sviluppo web non è così tanto veloce in una> giornata non si riesce.

su questo no :-) Direi che una prima iterazione con tutte le funzionalita' di base in una giornata con 2 coppie si riesce a fare.

> Con Rails in mezza o 1/4 :) ma non entriamo in guerre di religione.

Se non si riesce probabilmente le storie non sono state spezzate in modo iterativo-incrementale/verticale ;-)…

http://it.groups.yahoo.com/group/extremeprogramming-it/message/4485:…> E poi detta tutta java a sviluppo web non è così tanto veloce in una> giornata non si riesce.

su questo no :-) Direi che una prima iterazione con tutte le funzionalita' di base in una giornata con 2 coppie si riesce a fare.

> Con Rails in mezza o 1/4 :) ma non entriamo in guerre di religione.

Se non si riesce probabilmente le storie non sono state spezzate in modo iterativo-incrementale/verticale ;-)…

Page 5: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License// class Departmentpublic void printSlips() {

Resource resource = null;for(int i=0; i < _resources.size();i++) {

resource = (Resource)_resources.get(i);if(resource.lastContract().deadline().after(new Date())) {

System.out.println(resource.name());System.out.println(resource.salary());

}}

}

// class Departmentpublic void printSlips() {

Resource resource = null;for(int i=0; i < _resources.size();i++) {

resource = (Resource)_resources.get(i);if(resource.lastContract().deadline().after(new Date())) {

System.out.println(resource.name());System.out.println(resource.salary());

}}

}

Il problema

public void printSlips() {for (Resource eachResource: _resources) {

if(eachResource.lastContract().deadline().after(new Date()) ) {System.out.println(eachResource.name());System.out.println(eachResource.salary());

}}

public void printSlips() {for (Resource eachResource: _resources) {

if(eachResource.lastContract().deadline().after(new Date()) ) {System.out.println(eachResource.name());System.out.println(eachResource.salary());

}}

“Our job is to solve problems, not spoonfeed compilers (…)We need clarity so we can communicate using our code. We value conciseness and the ability to express a requirement in code accurately and efficiently”. --Dave Thomas

“Our job is to solve problems, not spoonfeed compilers (…)We need clarity so we can communicate using our code. We value conciseness and the ability to express a requirement in code accurately and efficiently”. --Dave Thomas

(resources select: inForce) do: printSlip.(resources select: inForce) do: printSlip.

Page 6: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License// class Departmentpublic void printSlips() {

Resource resource = null;for(int i=0; i < _resources.size();i++) {

resource = (Resource)_resources.get(i);if(resource.lastContract().deadline().after(new Date())) {

System.out.println(resource.name());System.out.println(resource.salary());

}}

}

// class Departmentpublic void printSlips() {

Resource resource = null;for(int i=0; i < _resources.size();i++) {

resource = (Resource)_resources.get(i);if(resource.lastContract().deadline().after(new Date())) {

System.out.println(resource.name());System.out.println(resource.salary());

}}

}

Parliamo di design

Page 7: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License// class Departmentpublic void printSlips() {

Resource resource = null;for(int i=0; i < _resources.size();i++) {

resource = (Resource)_resources.get(i);if(resource.lastContract().deadline().after(new Date())) {

System.out.println(resource.name());System.out.println(resource.salary());

}}

}

// class Departmentpublic void printSlips() {

Resource resource = null;for(int i=0; i < _resources.size();i++) {

resource = (Resource)_resources.get(i);if(resource.lastContract().deadline().after(new Date())) {

System.out.println(resource.name());System.out.println(resource.salary());

}}

}

Parliamo di design

public void printSlipForEach() {for (Resource eachResource: _resources) {

if(eachResource.lastContract().deadline().after(new Date()) ) {System.out.println(eachResource.name());System.out.println(eachResource.salary());

}}

}

public void printSlipForEach() {for (Resource eachResource: _resources) {

if(eachResource.lastContract().deadline().after(new Date()) ) {System.out.println(eachResource.name());System.out.println(eachResource.salary());

}}

}

Layout?Layout?Layout?Layout?

Selezione?Selezione?Selezione?Selezione?

Media?Media?Media?Media? Contenuti?Contenuti?Contenuti?Contenuti?

Ciclo?+Navigazione?Ciclo?+Navigazione?Ciclo?+Navigazione?Ciclo?+Navigazione?

Ciclo?Ciclo?Ciclo?Ciclo?

Page 8: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License

Il Refactoring: Aumentare la capacità del codice di rivelare

le intenzioni di design, a qualsiasi membro del team, alla prima occhiata

Migliorare la struttura interna del sistema, consentendo alle necessarie astrazioni di emergere

LightweightLightweightLightweightLightweight

“Our job is to solve problems, not spoonfeed compilers (…)We need clarity so we can communicate using our code. We value conciseness and the ability to express a requirement in code accurately and efficiently”. --Dave Thomas

“Our job is to solve problems, not spoonfeed compilers (…)We need clarity so we can communicate using our code. We value conciseness and the ability to express a requirement in code accurately and efficiently”. --Dave Thomas

Abbassare la complessità

Page 9: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License// class Departmentpublic void printSlips() {

Resource resource = null;for(int i=0; i < _resources.size();i++) {

resource = (Resource)_resources.get(i);if(resource.lastContract().deadline().after(new Date())) {

System.out.println(resource.name());System.out.println(resource.salary());

}}

}

// class Departmentpublic void printSlips() {

Resource resource = null;for(int i=0; i < _resources.size();i++) {

resource = (Resource)_resources.get(i);if(resource.lastContract().deadline().after(new Date())) {

System.out.println(resource.name());System.out.println(resource.salary());

}}

}

Step 1: Separare le logiche

Selezione?Selezione?Selezione?Selezione?

Stampa busta?Stampa busta?Stampa busta?Stampa busta?

// class Departmentpublic void printSlips() {

Resource eachResource = null;List inforces = new ArrayList();for(int i=0; i < _resources.size();i++) {

eachResource = (Resource)_resources.get(i);if(eachResource.lastContract().deadline().after(new Date()) ) {

inforces.add(eachResource);}

}Resource eachInForce = null;for(int i=0; i < inforces.size();i++) {

eachInForce = (Resource)inforces.get(i);System.out.println(eachInForce.name());System.out.println(eachInForce.salary());

}}

// class Departmentpublic void printSlips() {

Resource eachResource = null;List inforces = new ArrayList();for(int i=0; i < _resources.size();i++) {

eachResource = (Resource)_resources.get(i);if(eachResource.lastContract().deadline().after(new Date()) ) {

inforces.add(eachResource);}

}Resource eachInForce = null;for(int i=0; i < inforces.size();i++) {

eachInForce = (Resource)inforces.get(i);System.out.println(eachInForce.name());System.out.println(eachInForce.salary());

}}

Page 10: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License

Step 2: Semplificare il FOR// class Departmentpublic void printSlips() {

……Resource eachInForce = null;for(int i=0; i < inforces.size();i++) {

eachInForce = (Resource)inforces.get(i);System.out.println(eachInForce.name());System.out.println(eachInForce.salary());

}}

// class Departmentpublic void printSlips() {

……Resource eachInForce = null;for(int i=0; i < inforces.size();i++) {

eachInForce = (Resource)inforces.get(i);System.out.println(eachInForce.name());System.out.println(eachInForce.salary());

}}

// class Departmentpublic void printSlips() {

……Resource eachInForce = null;for(int i=0; i < inforces.size();i++) {

eachInForce = (Resource)inforces.get(i);System.out.println(eachInForce.name());System.out.println(eachInForce.salary());

}}

// class Departmentpublic void printSlips() {

……Resource eachInForce = null;for(int i=0; i < inforces.size();i++) {

eachInForce = (Resource)inforces.get(i);System.out.println(eachInForce.name());System.out.println(eachInForce.salary());

}}

Logica i-esimaLogica i-esimaLogica i-esimaLogica i-esima

Ciclo + navigazioneCiclo + navigazioneCiclo + navigazioneCiclo + navigazione

new Block() {public void evaluate(Resource each) {

System.out.println(each.name());System.out.println(each.salary());

}}.evaluate(eachInForce);

new Block() {public void evaluate(Resource each) {

System.out.println(each.name());System.out.println(each.salary());

}}.evaluate(eachInForce);

Page 11: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License

Step 2: Semplificare il FOR// class Departmentpublic void printSlips() {

……Resource eachInForce = null;for(int i=0; i < inforces.size();i++) {

eachInForce = (Resource)inforces.get(i); new Block() {

public void evaluate(Resource each) {System.out.println(each.name());System.out.println(each.salary());

}}.evaluate(eachInForce);}

}

// class Departmentpublic void printSlips() {

……Resource eachInForce = null;for(int i=0; i < inforces.size();i++) {

eachInForce = (Resource)inforces.get(i); new Block() {

public void evaluate(Resource each) {System.out.println(each.name());System.out.println(each.salary());

}}.evaluate(eachInForce);}

}

Logica i-esimaLogica i-esimaLogica i-esimaLogica i-esima

Ciclo + navigazioneCiclo + navigazioneCiclo + navigazioneCiclo + navigazione

Page 12: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License

Step 2: Semplificare il FOR// class Departmentpublic void printSlips() {

……Resource eachInForce = null;for(int i=0; i < inforces.size();i++) {

eachInForce = (Resource)inforces.get(i);new PrintSlip().evaluate(eachInForce);

}}

// class Departmentpublic void printSlips() {

……Resource eachInForce = null;for(int i=0; i < inforces.size();i++) {

eachInForce = (Resource)inforces.get(i);new PrintSlip().evaluate(eachInForce);

}}

Logica i-esimaLogica i-esimaLogica i-esimaLogica i-esima

Ciclo + navigazioneCiclo + navigazioneCiclo + navigazioneCiclo + navigazione

public class PrintSlip implements Block {public void evaluate(Resource aResource) {

System.out.println(aResource.name());System.out.println(aResource.salary());

}}

public class PrintSlip implements Block {public void evaluate(Resource aResource) {

System.out.println(aResource.name());System.out.println(aResource.salary());

}}

Page 13: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License

public class PrintSlip implements Block {public void evaluate(Resource aResource) {

System.out.println(aResource.name());System.out.println(aResource.salary());

}}

public class PrintSlip implements Block {public void evaluate(Resource aResource) {

System.out.println(aResource.name());System.out.println(aResource.salary());

}}

Step 3: Eliminare il FOR// class Departmentpublic void printSlips() {

……Resource eachInForce = null;for(int i=0; i < inforces.size();i++) {

eachInForce = (Resource)inforces.get(i);new PrintSlip().evaluate(eachInForce);

}}

// class Departmentpublic void printSlips() {

……Resource eachInForce = null;for(int i=0; i < inforces.size();i++) {

eachInForce = (Resource)inforces.get(i);new PrintSlip().evaluate(eachInForce);

}}

Logica i-esimaLogica i-esimaLogica i-esimaLogica i-esima

Ciclo + navigazioneCiclo + navigazioneCiclo + navigazioneCiclo + navigazione

Page 14: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License

public class PrintSlip implements Block {public void evaluate(Resource aResource) {

System.out.println(aResource.name());System.out.println(aResource.salary());

}}

public class PrintSlip implements Block {public void evaluate(Resource aResource) {

System.out.println(aResource.name());System.out.println(aResource.salary());

}}

Step 3: Eliminare il FOR// class Departmentpublic void printSlips() {

……Iterator iterator = inforces.iterator();while(iterator.hasNext()) {

new PrintSlip().evaluate(iterator.next());}

}

// class Departmentpublic void printSlips() {

……Iterator iterator = inforces.iterator();while(iterator.hasNext()) {

new PrintSlip().evaluate(iterator.next());}

}

Logica i-esimaLogica i-esimaLogica i-esimaLogica i-esima

CicloCicloCicloCiclo

Page 15: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License

public class PrintSlip implements Block {public void evaluate(Resource aResource) {

System.out.println(aResource.name());System.out.println(aResource.salary());

}}

public class PrintSlip implements Block {public void evaluate(Resource aResource) {

System.out.println(aResource.name());System.out.println(aResource.salary());

}}

Step 3: Eliminare il FOR// class Departmentpublic void printSlips(…) {

……Iterator iterator = inforces.iterator();while(iterator.hasNext()) {

aBlock.evaluate(iterator.next());}

}

// class Departmentpublic void printSlips(…) {

……Iterator iterator = inforces.iterator();while(iterator.hasNext()) {

aBlock.evaluate(iterator.next());}

}

Logica i-esimaLogica i-esimaLogica i-esimaLogica i-esima

CicloCicloCicloCiclo

Page 16: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License

Step 3: Eliminare il FORpublic class ResourceOrderedCollection {

private Collection _items;

public ResourceOrderedCollection(Collection items) {_items = items;

}

public void forEachDo(Block aBlock) {Iterator iterator = _items.iterator();while(iterator.hasNext()) {

aBlock.evaluate((Resource)iterator.next());}

}}

public class ResourceOrderedCollection {private Collection _items;

public ResourceOrderedCollection(Collection items) {_items = items;

}

public void forEachDo(Block aBlock) {Iterator iterator = _items.iterator();while(iterator.hasNext()) {

aBlock.evaluate((Resource)iterator.next());}

}}

public void printSlips() {Resource eachResource = null;List inforces = new ArrayList();for(int i=0; i < _resources.size();i++) {

eachResource = (Resource)_resources.get(i);if(eachResource.lastContract().deadline().after(new Date()) ) {

inforces.add(eachResource);}

}new ResourceOrderedCollection(inforces).forEachDo(new PrintSlip());

}

public void printSlips() {Resource eachResource = null;List inforces = new ArrayList();for(int i=0; i < _resources.size();i++) {

eachResource = (Resource)_resources.get(i);if(eachResource.lastContract().deadline().after(new Date()) ) {

inforces.add(eachResource);}

}new ResourceOrderedCollection(inforces).forEachDo(new PrintSlip());

}

NavigazioneNavigazioneNavigazioneNavigazione

CicloCicloCicloCiclo

Page 17: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 Licensepublic void printSlips() {Resource eachResource = null;List inforces = new ArrayList();for(int i=0; i < _resources.size();i++) {

eachResource = (Resource)_resources.get(i);if(eachResource.lastContract().deadline().after(new Date()) ) {

inforces.add(eachResource);}

}new ResourceOrderedCollection(inforces).forEachDo(new PrintSlip());

}

public void printSlips() {Resource eachResource = null;List inforces = new ArrayList();for(int i=0; i < _resources.size();i++) {

eachResource = (Resource)_resources.get(i);if(eachResource.lastContract().deadline().after(new Date()) ) {

inforces.add(eachResource);}

}new ResourceOrderedCollection(inforces).forEachDo(new PrintSlip());

}

Step 4: E la selezionepublic void printSlips() {

Resource eachResource = null;List inforces = new ArrayList();for(int i=0; i < _resources.size();i++) {

eachResource = (Resource)_resources.get(i);if(eachResource.lastContract().deadline().after(new Date()) ) {

inforces.add(eachResource);}

}new ResourceOrderedCollection(inforces).forEachDo(new PrintSlip());

}

public void printSlips() {Resource eachResource = null;List inforces = new ArrayList();for(int i=0; i < _resources.size();i++) {

eachResource = (Resource)_resources.get(i);if(eachResource.lastContract().deadline().after(new Date()) ) {

inforces.add(eachResource);}

}new ResourceOrderedCollection(inforces).forEachDo(new PrintSlip());

}

public void printSlips() {Resource eachResource = null;List inforces = new ArrayList();for(int i=0; i < _resources.size();i++) {

eachResource = (Resource)_resources.get(i);if(new PredicateBlock() {

public boolean is(Resource each) {return each.lastContract().deadline().after(new Date());

}}.is(eachResource) {inforces.add(eachResource);

}}new ResourceOrderedCollection(inforces).forEachDo(new PrintSlip());

}

public void printSlips() {Resource eachResource = null;List inforces = new ArrayList();for(int i=0; i < _resources.size();i++) {

eachResource = (Resource)_resources.get(i);if(new PredicateBlock() {

public boolean is(Resource each) {return each.lastContract().deadline().after(new Date());

}}.is(eachResource) {inforces.add(eachResource);

}}new ResourceOrderedCollection(inforces).forEachDo(new PrintSlip());

}

Ciclo + navigazioneCiclo + navigazioneCiclo + navigazioneCiclo + navigazione

SelezioneSelezioneSelezioneSelezione

AddizioneAddizioneAddizioneAddizioneLogica i-esimaLogica i-esimaLogica i-esimaLogica i-esima

Page 18: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License

Step 4: E la selezionepublic void printSlips() {

Resource eachResource = null;List inforces = new ArrayList();for(int i=0; i < _resources.size();i++) {

eachResource = (Resource)_resources.get(i);if(new InForcePredicate().is(eachResource)) {

inforces.add(eachResource);}

}new ResourceOrderedCollection(inforces).forEachDo(new PrintSlip());

}

public void printSlips() {Resource eachResource = null;List inforces = new ArrayList();for(int i=0; i < _resources.size();i++) {

eachResource = (Resource)_resources.get(i);if(new InForcePredicate().is(eachResource)) {

inforces.add(eachResource);}

}new ResourceOrderedCollection(inforces).forEachDo(new PrintSlip());

}

public class InForcePredicate implements PredicateBlock {public boolean is(Resource each) {

return each.lastContract().deadline().after(new Date());}

}

public class InForcePredicate implements PredicateBlock {public boolean is(Resource each) {

return each.lastContract().deadline().after(new Date());}

}

SelezioneSelezioneSelezioneSelezione

Ciclo + navigazioneCiclo + navigazioneCiclo + navigazioneCiclo + navigazione

AddizioneAddizioneAddizioneAddizione

Page 19: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License

Step 4: E la selezione

public void printSlips() {Collection inforces = new ResourceOrderedCollection(_resources).select(new InForce());new ResourceOrderedCollection(inforces).forEachDo(new PrintSlip());

}

public void printSlips() {Collection inforces = new ResourceOrderedCollection(_resources).select(new InForce());new ResourceOrderedCollection(inforces).forEachDo(new PrintSlip());

}

public Collection select(PredicateBlock aBlock) {Collection result = new ArrayList();Iterator iterator = _items.iterator();while(iterator.hasNext()) {

Resource resource = (Resource)iterator.next();if (aBlock.is(resource)) result.add(resource);

}return result;

}

public Collection select(PredicateBlock aBlock) {Collection result = new ArrayList();Iterator iterator = _items.iterator();while(iterator.hasNext()) {

Resource resource = (Resource)iterator.next();if (aBlock.is(resource)) result.add(resource);

}return result;

}

public class InForcePredicate implements PredicateBlock {public boolean is(Resource each) {

return each.lastContract().deadline().after(new Date());}

}

public class InForcePredicate implements PredicateBlock {public boolean is(Resource each) {

return each.lastContract().deadline().after(new Date());}

}

CicloCicloCicloCiclo

AddizioneAddizioneAddizioneAddizione

SelezioneSelezioneSelezioneSelezione

NavigazioneNavigazioneNavigazioneNavigazione

Page 20: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License

Step 5: Per leggere megliopublic void printSlips() {

Collection inforces = new ResourceOrderedCollection(_resources).select(new InForce());new ResourceOrderedCollection(inforces).forEachDo(new PrintSlip());

}

public void printSlips() {Collection inforces = new ResourceOrderedCollection(_resources).select(new InForce());new ResourceOrderedCollection(inforces).forEachDo(new PrintSlip());

}public void printSlips() {

(new ResourceOrderedCollection(_resources).select(new InForce()).forEachDo(new PrintSlip()); }

public void printSlips() {(new ResourceOrderedCollection(_resources).select(new InForce()).forEachDo(new PrintSlip());

} public ResourceOrderedCollection select(PredicateBlock aBlock) {

ResourceOrderedCollection result = new ResourceOrderedCollection();Iterator iterator = _items.iterator();while(iterator.hasNext()) {

Resource resource = (Resource)iterator.next();if (aBlock.is(resource)) result.add(resource);

}return result;

}

public ResourceOrderedCollection select(PredicateBlock aBlock) {ResourceOrderedCollection result = new ResourceOrderedCollection();Iterator iterator = _items.iterator();while(iterator.hasNext()) {

Resource resource = (Resource)iterator.next();if (aBlock.is(resource)) result.add(resource);

}return result;

}

public void printSlips() {Predicate isInForce = new InForce();Block printSlip = new PrintSlip();ResourceOrderedCollection resources = new ResourceOrderedCollection(_resources);resources.select(isInForce).forEachDo(printSlip);

}

public void printSlips() {Predicate isInForce = new InForce();Block printSlip = new PrintSlip();ResourceOrderedCollection resources = new ResourceOrderedCollection(_resources);resources.select(isInForce).forEachDo(printSlip);

}

Page 21: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License

Step 5: Per leggere meglio

public void printSlips() {Predicate isInForce = new InForce();Block printSlip = new PrintSlip();ResourceOrderedCollection resources = new ResourceOrderedCollection(_resources);resources.select(isInForce).forEachDo(printSlip);

}

public void printSlips() {Predicate isInForce = new InForce();Block printSlip = new PrintSlip();ResourceOrderedCollection resources = new ResourceOrderedCollection(_resources);resources.select(isInForce).forEachDo(printSlip);

}

public void printSlipsUsing(Predicate aCriterium, Block anAction) {_resources.select(aCriterium).forEachDo(anAction);

}

public void printSlipsUsing(Predicate aCriterium, Block anAction) {_resources.select(aCriterium).forEachDo(anAction);

}

private ResourceOrderedCollection _resources;private ResourceOrderedCollection _resources;

public void printSlips() {printSlipsUsing(new InForce(),new PrintSlip());

}

public void printSlips() {printSlipsUsing(new InForce(),new PrintSlip());

}

private void printSlipsUsing(Predicate aCriterium, Block anAction) {new ResourceOrderedCollection(_resources).select(aCriterium).forEachDo(anAction);

}

private void printSlipsUsing(Predicate aCriterium, Block anAction) {new ResourceOrderedCollection(_resources).select(aCriterium).forEachDo(anAction);

}

Page 22: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License

Step 6: Generalizzare

new ResourceOrderedCollection(resources).select(isInForce).forEachDo(printSlip); new ResourceOrderedCollection(resources).select(isInForce).forEachDo(printSlip);

public class ResourceOrderedCollection {…public void forEachDo(Block aBlock) {

Iterator iterator = _items.iterator();while(iterator.hasNext()) {

aBlock.evaluate((Resource)iterator.next());}

}public ResourceOrderedCollection select(Predicate aBlock) {

ResourceOrderedCollection result = new ResourceOrderedCollection();

Iterator iterator = _items.iterator();while(iterator.hasNext()) {

Resource resource = (Resource)iterator.next();if (aBlock.is(resource)) result.add(resource);

}return result;

}}

public class ResourceOrderedCollection {…public void forEachDo(Block aBlock) {

Iterator iterator = _items.iterator();while(iterator.hasNext()) {

aBlock.evaluate((Resource)iterator.next());}

}public ResourceOrderedCollection select(Predicate aBlock) {

ResourceOrderedCollection result = new ResourceOrderedCollection();

Iterator iterator = _items.iterator();while(iterator.hasNext()) {

Resource resource = (Resource)iterator.next();if (aBlock.is(resource)) result.add(resource);

}return result;

}}

public class PrintSlip implements Block {public void evaluate(Resource aResource) {

System.out.println(aResource.name());System.out.println(aResource.salary());

}}

public class PrintSlip implements Block {public void evaluate(Resource aResource) {

System.out.println(aResource.name());System.out.println(aResource.salary());

}}

public class InForcePredicate implements PredicateBlock {public boolean is(Resource each) {

return each.lastContract().deadline().after(new Date());}

}

public class InForcePredicate implements PredicateBlock {public boolean is(Resource each) {

return each.lastContract().deadline().after(new Date());}

}

Page 23: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License

Step 6: Generalizzare

new ResourceOrderedCollection(resources).select(isInForce).forEachDo(printSlip); new ResourceOrderedCollection(resources).select(isInForce).forEachDo(printSlip);

public class ResourceOrderedCollection {…public void forEachDo(Block aBlock) {

Iterator iterator = _items.iterator();while(iterator.hasNext()) {

aBlock.evaluate((Resource)iterator.next());}

}public ResourceOrderedCollection select(Predicate aBlock) {

ResourceOrderedCollection result = new ResourceOrderedCollection();

Iterator iterator = _items.iterator();while(iterator.hasNext()) {

Resource resource = (Resource)iterator.next();if (aBlock.is(resource)) result.add(resource);

}return result;

}}

public class ResourceOrderedCollection {…public void forEachDo(Block aBlock) {

Iterator iterator = _items.iterator();while(iterator.hasNext()) {

aBlock.evaluate((Resource)iterator.next());}

}public ResourceOrderedCollection select(Predicate aBlock) {

ResourceOrderedCollection result = new ResourceOrderedCollection();

Iterator iterator = _items.iterator();while(iterator.hasNext()) {

Resource resource = (Resource)iterator.next();if (aBlock.is(resource)) result.add(resource);

}return result;

}}

public class OrderedCollection {…public void forEachDo(Block aBlock) {

Iterator iterator = _items.iterator();while(iterator.hasNext()) {

aBlock.evaluate(iterator.next());}

}public OrderedCollection select(Predicate aBlock) { OrderedCollection result =

new OrderedCollection();Iterator iterator = _items.iterator();while(iterator.hasNext()) {

Object object = iterator.next();if (aBlock.is(object)) result.add(object);

}return result;

}}

public class OrderedCollection {…public void forEachDo(Block aBlock) {

Iterator iterator = _items.iterator();while(iterator.hasNext()) {

aBlock.evaluate(iterator.next());}

}public OrderedCollection select(Predicate aBlock) { OrderedCollection result =

new OrderedCollection();Iterator iterator = _items.iterator();while(iterator.hasNext()) {

Object object = iterator.next();if (aBlock.is(object)) result.add(object);

}return result;

}}

public class PrintSlip implements Block {public void evaluate(Resource aResource) {

System.out.println(aResource.name());System.out.println(aResource.salary());

}}

public class PrintSlip implements Block {public void evaluate(Resource aResource) {

System.out.println(aResource.name());System.out.println(aResource.salary());

}}

public class InForcePredicate implements PredicateBlock {public boolean is(Resource each) {

return each.lastContract().deadline().after(new Date());}

}

public class InForcePredicate implements PredicateBlock {public boolean is(Resource each) {

return each.lastContract().deadline().after(new Date());}

}

public class PrintSlip implements Block {public void evaluate(Object anObject) {

System.out.println(((Resource)anObject).name());System.out.println(((Resource)anObject).salary());}

}

public class PrintSlip implements Block {public void evaluate(Object anObject) {

System.out.println(((Resource)anObject).name());System.out.println(((Resource)anObject).salary());}

}

public class InForcePredicate implements Predicate {public boolean is(Object anObject) {

return ((Resource)anObject).lastContract().deadline().after(new Date());}

}

public class InForcePredicate implements Predicate {public boolean is(Object anObject) {

return ((Resource)anObject).lastContract().deadline().after(new Date());}

}

Page 24: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License

Dove siamo// class Departmentpublic void printSlips() {

Resource resource = null;for(int i=0; i < _resources.size();i++) {

resource = (Resource)_resources.get(i);if(resource.lastContract().deadline().after(new Date())) {

System.out.println(resource.name());System.out.println(resource.salary());

}}

}

// class Departmentpublic void printSlips() {

Resource resource = null;for(int i=0; i < _resources.size();i++) {

resource = (Resource)_resources.get(i);if(resource.lastContract().deadline().after(new Date())) {

System.out.println(resource.name());System.out.println(resource.salary());

}}

} Layout?Layout?Layout?Layout?

Contenuti?Contenuti?Contenuti?Contenuti?

Navigazione?Navigazione?Navigazione?Navigazione?

Selezione?Selezione?Selezione?Selezione?

Media?Media?Media?Media?

NavigazioneNavigazioneNavigazioneNavigazione SelezioneSelezioneSelezioneSelezioneContenuti+Contenuti+

Media+Media+LayoutLayout

Contenuti+Contenuti+Media+Media+LayoutLayout

_resources.select(isInForce).forEachDo(printSlip); _resources.select(isInForce).forEachDo(printSlip); _resources.select(onlyWomen).forEachDo(printReport); _resources.select(onlyWomen).forEachDo(printReport);

Page 25: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License

Review & ToDoList

:Department

Andrea:Employee

Federica:Manager

10/01-10/11/2007:Contract

1/9/2007-10/10/2008:Contract

“Federica”:String

“Andrea”:String

// class Departmentpublic void printSlips() {

Resource resource = null;for(int i=0; i < _resources.size();i++) {

resource = (Resource)_resources.get(i);if(resource.lastContract().deadline().after(new Date())) {

System.out.println(resource.name());System.out.println(resource.salary());

}}

}

// class Departmentpublic void printSlips() {

Resource resource = null;for(int i=0; i < _resources.size();i++) {

resource = (Resource)_resources.get(i);if(resource.lastContract().deadline().after(new Date())) {

System.out.println(resource.name());System.out.println(resource.salary());

}}

}Layout?Layout?Layout?Layout?

Contenuti?Contenuti?Contenuti?Contenuti?

Navigazione?Navigazione?Navigazione?Navigazione?

Selezione?Selezione?Selezione?Selezione?

Media?Media?Media?Media?

System.out:PrintStream

Page 26: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License

Review & ToDoList

resources:OrderedCollection

:Department

Andrea:Employee

Federica:Manager

10/01-10/11/2007:Contract

1/9/2007-10/10/2008:Contract

:InForce

:PrintSlip

“Federica”:String

System.out:PrintStream

inForce:OrderedCollection

“Andrea”:String

_resources.select(isInForce).forEachDo(printSlip); _resources.select(isInForce).forEachDo(printSlip);

public OrderedCollection select(Predicate aBlock) { OrderedCollection result = new OrderedCollection();

Iterator iterator = _items.iterator();while(iterator.hasNext()) {

Object object = iterator.next();if (aBlock.is(object)) result.add(object);

}return result;

}

public OrderedCollection select(Predicate aBlock) { OrderedCollection result = new OrderedCollection();

Iterator iterator = _items.iterator();while(iterator.hasNext()) {

Object object = iterator.next();if (aBlock.is(object)) result.add(object);

}return result;

}

public boolean is(Object each) {return ((Resource)each).lastContract().deadline().after(new Date());

}

public boolean is(Object each) {return ((Resource)each).lastContract().deadline().after(new Date());

}

Page 27: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License

Review & ToDoList

resources:OrderedCollection

:Department

Andrea:Employee

Federica:Manager

10/01-10/11/2007:Contract

1/9/2007-10/10/2008:Contract

:InForce

:PrintSlip

“Federica”:String

System.out:PrintStream

inForce:OrderedCollection

“Andrea”:String

public void forEachDo(Block aBlock) {Iterator iterator = _items.iterator();while(iterator.hasNext()) {

aBlock.evaluate(iterator.next());}

}

public void forEachDo(Block aBlock) {Iterator iterator = _items.iterator();while(iterator.hasNext()) {

aBlock.evaluate(iterator.next());}

}

public OrderedCollection select(Predicate aBlock) { OrderedCollection result = new OrderedCollection();

Iterator iterator = _items.iterator();while(iterator.hasNext()) {

Object object = iterator.next();if (aBlock.is(object)) result.add(object);

}return result;

}

public OrderedCollection select(Predicate aBlock) { OrderedCollection result = new OrderedCollection();

Iterator iterator = _items.iterator();while(iterator.hasNext()) {

Object object = iterator.next();if (aBlock.is(object)) result.add(object);

}return result;

}

public class PrintSlip implements Block {public void evaluate(Object anObject) {

System.out.println(((Resource)anObject).name());System.out.println(((Resource)anObject).salary());

}}

public class PrintSlip implements Block {public void evaluate(Object anObject) {

System.out.println(((Resource)anObject).name());System.out.println(((Resource)anObject).salary());

}}

Page 28: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License

Riferimenti blocchi e chiusure

Blocchi in Java http://www.c2.com/cgi/wiki?BlocksInJava

Blocchi e chiusure in Ruby http://www.artima.com/intv/closuresP.html

Chiusure nel linguaggio Java http://www.javac.info/closures-v03.html

Esempi di librerie http://jaggregate.sourceforge.net

Page 29: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License

Segui la Campagna Anti-IF

Page 30: Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Francesco Cirillo – francesco.cirillo@metodiagili.it- MetodiAgili.it Javaday Roma - 01/12/2007.

Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License

Risorse:http://www.xplabs.it/risorse.htmlhttp://www.metodiagili.it/campagna-anti-if.html

Tecnica del Pomodoro: http://www.tecnicadelpomodoro.it

EasyTracking: http://www.myagileprojects.com

Gruppo XPLabs’ Friends- Italia:http://it.groups.yahoo.com/group/xplabs-friends/

Extreme Programming User Group – Italia:http://www.xpug.it/

Domande