Fra algoritmemønster til generisk metode

Preview:

DESCRIPTION

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() { ... } - PowerPoint PPT Presentation

Citation preview

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