Page 1
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
Francesco Cirillo – [email protected] MetodiAgili.itJavaday Roma - 01/12/2007
Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License
Campagna Anti-IF
Page 3
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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