130 likes | 254 Views
Fra algoritmemønster til generisk metode. findEn og findAlle. Hvad har disse metoder tilfælles?. findEn. Hvad har disse metoder tilfælles?. findAlle. Parametrisering (Turtle). // tegn et kvadrat med sidelængde 100 public void square100() { ... }
E N D
Fra algoritmemønstertil generisk metode findEn og findAlle
Parametrisering (Turtle) //tegn et kvadrat med sidelængde 100 public void square100() { ... } //tegnet kvadrat med sidelængde length public void square(int length) { ... } //tegnen polygon af grad degree med sidelængde length public void polygon(int degree, int length) { ... } 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!
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; }
Parametriseringafelementtype public List<Track> findAllByArtist (List<Track> tracks, String artist) { List<Track> res= new ArrayList<Track>(); for ( Trackt: tracks ) if ( t.getArtist().contains(artist) ) res.add(t); return res; } public List<Photo> findAllAfterDate(Date d) { List<Photo> res= new ArrayList<Photo>(); for (Photop: photos) if ( p.getDate().isLaterThan(d) ) res.add(p); return res; }
Parametriseringafudvæ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 publicList<T> methodName (List<T> lst, additional params) { List<T> result= new ArrayList<T>(); for (Te: lst) { if ( <<< criteriaSatisfiedBy(e)>>> ) { result.add(e); } } return result; } Instantiation of pattern findAll • Substitute concrete type for T • Choose proper methodname • Choose appropriate additional parameters for the concrete criteria
Generic Method: findAll // find alleobjekteri listen lst der opfylderkriterietc public static <T> List<T> findAll(List<T> lst, Criteria<T>c) { List<T> result= new ArrayList<T>(); for ( Te : lst ) { if ( c.satisfiedBy(e) ) { result.add(e); } } return result; } interface Criteria<T> { booleansatisfiedBy(Te); } List<Person> persons= new ArrayList<Person>(); class SeniorCriteriaimplementsCriteria<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!