Fra algoritmemønstertil generisk metode
findEn og findAlle
Hvad har disse metoder tilfælles?
dIntProg, E12
findEn
dIntProg, E12
Hvad har disse metoder tilfælles?
dIntProg, E12
findAlle
dIntProg, E12
Parametrisering (Turtle)
//tegn et kvadrat med sidelængde 100public void square100() { ... }
//tegn et kvadrat med sidelængde lengthpublic void square(int length) { ... }
//tegn en polygon af grad degree med sidelængde lengthpublic void polygon(int degree, int length) { ... }
dIntProg, E12
public void polygon-4-100() { ... }
public void polygon-4(int length) { ... }
public void polygon(int degree, int length) { ... }
Pointer
• Det kan betale sig at lave gode generelle operationer som kan genbruges i mange situationer.
• Parametrisering er nøglen til at lave generelle operationer.
• Det er svært at ‘opfinde’ de gode generelle operationer (konkret generelt), men opsøg dem!
dIntProg, E12
Parametrisering?
public List<Track> findAllByArtist(List<Track> tracks, String artist) { List<Track> res= new ArrayList<Track>(); for ( Track t: tracks ) if ( t.getArtist().contains(artist) ) res.add(t); return res;}
public List<Photo> findAllAfterDate(Date d) { List<Photo> res= new ArrayList<Photo>(); for ( Photo p: photos ) if ( p.getDate().isLaterThan(d) ) res.add(p); return res;}
Parametrisering af elementtype
public List<Track> findAllByArtist(List<Track> tracks, String artist) { List<Track> res= new ArrayList<Track>(); for ( Track t: tracks ) if ( t.getArtist().contains(artist) ) res.add(t); return res;}
public List<Photo> findAllAfterDate(Date d) { List<Photo> res= new ArrayList<Photo>(); for ( Photo p: photos ) if ( p.getDate().isLaterThan(d) ) res.add(p); return res;}
Parametrisering af udvælgelseskriterie
public List<Track> findAllByArtist(List<Track> tracks, String artist) { List<Track> res= new ArrayList<Track>(); for ( Track t: tracks ) if ( t.getArtist().contains(artist) ) res.add(t); return res;}
public List<Photo> findAllAfterDate(Date d) { List<Photo> res= new ArrayList<Photo>(); for ( Photo p: photos ) if ( p.getDate().isLaterThan(d) ) res.add(p); return res;}
Algorithmic Pattern: findAll
public List<T> methodName(List<T> lst, additional params) { List<T> result= new ArrayList<T>(); for ( T e : lst ) { if ( <<< criteriaSatisfiedBy(e) >>> ) { result.add(e); } } return result;}
1. Substitute concrete type for T2. Choose proper method name3. Choose appropriate additional parameters for the concrete criteria
Instantiation of pattern findAll
Generic Method: findAll
// find alle objekter i listen lst der opfylder kriteriet cpublic static <T>List<T> findAll(List<T> lst, Criteria<T> c) { List<T> result= new ArrayList<T>(); for ( T e : lst ) { if ( c.satisfiedBy(e) ) { result.add(e); } } return result;}
interface Criteria<T> { boolean satisfiedBy(T e);}
List<Person> persons= new ArrayList<Person>();class SeniorCriteria implements Criteria<Person> {...}
findAll(persons, new SeniorCriteria());
Pointer
• Det kan betale sig at lave gode generelle operationer som kan genbruges i mange situationer.
• Parametrisering er nøglen til at lave generelle operationer.
• Det er svært at ‘opfinde’ de gode generelle operationer (konkret generelt), men opsøg dem!
dIntProg, E12