Parametrisering En kort introduktion
Parametrisering og generisk kode Parametrisering tak! public class SkilledTurtle extends Turtle { public void square100() { for ( int i= 0; i<4; i++ ) { move(100); turn(90); } ... Programmeringsteknologi, F11 Parametrisering og generisk kode
Simpel parametrisering (1) Det ville være smartere at lave en metode der kan tegne kvadrater af vilkårlig størrelse. public class SkilledTurtle extends Turtle { /** tegner et kvadrat med sidelængde length */ public void square(int length) { for (int i= 0; i < 4; i++) { move(length); turn(90); } Programmeringsteknologi, F11 Parametrisering og generisk kode
Parametrisering og generisk kode Øvelse 1 Hvordan tegner man en ligesidet trekant? Hvordan tegner man en cirkel? Programmeringsteknologi, F11 Parametrisering og generisk kode
Parametrisering og generisk kode Øvelse 2 Skriv en metode der tegner en polygon. Lad antal sider og sidelængden være parametre til metoden. public class SkilledTurtle extends Turtle { ... /** * tegner en d-kant med sidelængde length */ public void polygon(int d, int length) { } Programmeringsteknologi, F11 Parametrisering og generisk kode
Generel kode (generisk kode) Typeparametrisering Generel kode (generisk kode)
Et lille eksempel med strenge Programmeringsteknologi, F11 Parametrisering og generisk kode
Forprogrammerede metoder Klassen Collections indeholder en lang række anvendelige metoder: Som hovedregel forudsætter metoderne at typen T definerer en total ordning f.eks. ved at implementere af interfacet Comparable int binarySearch(List<T> l, T key) void copy(List<T> dest, List<T> src) boolean disjoint(Collection<T> c1, Collection<T> c2) int frequency(Collection<T> c, Object o) T max(Collection<T> c) T min(Collection<T> c) void reverse(List<T> l) void shuffle(List<T> l) void sort(List<T> l) ... Programmeringsteknologi, F11 Parametrisering og generisk kode
Parametrisering og generisk kode Korteste Track // Vi antager at listen tracks ikke er tom public Track shortestTrack(){ Track res; res= tracks.get(0); //res == min element so far for ( Track t : tracks ){ if ( t.getTime() < res.getTime() ) { res= t; } return res; Programmeringsteknologi, F11 Parametrisering og generisk kode
Parametrisering og generisk kode Yngste Person // Vi antager at listen persons ikke er tom public Person youngestPerson(){ Person res; res= persons.get(0); //res == min element so far for ( Person p : persons ){ if ( p.getAge() < res.getAge() ) { res= p; } return res; Programmeringsteknologi, F11 Parametrisering og generisk kode
Hvad er forskellen på de to metoder? public Track shortestTrack(){ Track res= tracks.get(0); //res == min element so far for ( Track t : tracks ){ if ( t.getTime() < res.getTime() ) { res= t; } } return res; } public Person youngestPerson(){ Person res= persons.get(0); //res == min element so far for ( Person p : persons ){ if ( p.getAge() < res.getAge() ) { res= p; } } return res; } Programmeringsteknologi, F11 Parametrisering og generisk kode
Hvordan generaliserer vi kode? public void square100() { for ( int i= 0; i<4; i++ ) { move(100); turn(90); } public void square200() { move(200); public void triangle100() { for ( int i= 0; i<3; i++ ) { move(100); turn(120); } public void triangle400() { move(400); Programmeringsteknologi, F11 Parametrisering og generisk kode
Kan generaliserer vi disse metoder? public Track shortestTrack(){ Track res= tracks.get(0); //res == min element so far for ( Track t : tracks ){ if ( t.getTime() < res.getTime() ) { res= t; } } return res; } public Person youngestPerson(){ Person res= persons.get(0); //res == min element so far for ( Person p : persons ){ if ( p.getAge() < res.getAge() ) { res= p; } } return res; } Programmeringsteknologi, F11 Parametrisering og generisk kode
Vi ønsker at kunne... ...parametrisere med elementtype // Vi antager at listen l ikke er tom public T min(List<T> l) { T res; res= l.get(0); // res == min element so far for ( T e : l ) { if ( ”e < res” ) { res= e; } return res; ...parametrisere med sammenligningsmetode Programmeringsteknologi, F11 Parametrisering og generisk kode
Collections Extension Intermezzo BlueJ-eksempel med hjemmelavet generisk kode...
Hvordan sammenligner man objekter? public interface Comparable<T> { /** * @returns whether this object is * smaller (negative integer) * equal (0) * or greater (positive integer) * than object o */ public int compareTo(T o); } Programmeringsteknologi, F11 Parametrisering og generisk kode
Programmering vha. interfacet Comparable public <%!&%T€#%!&> min(List<? extends T> l) { T res; res= l.get(0); // res == min element so far for ( T e : l ) { if ( e.compareTo(res) < 0 ) { res= e; } return res; Programmeringsteknologi, F11 Parametrisering og generisk kode
Brug af interfaces (implementør) Tænk på et interface som en rolle Objekter fra en klasse kan spille rollen beskrevet i et interface Track-objekter kan spille rollen Comparable public class Track implements Comparable<Track> { ... public int compareTo(Track o) { } Programmeringsteknologi, F11 Parametrisering og generisk kode
Afkobling af programkomponenter (1) Collections T min(Collection<T> c) void sort (List<T> l) ... <<interface>> Comparable Terning Person Track Programmeringsteknologi, F11 Parametrisering og generisk kode
Afkobling af programkomponenter (2) Der er behov for at kunne mindske afhængigheden mellem programkomponenter Interfaces benyttes til at fastlægge minimale afhængigheder mellem programkomponenter Ved brug af interfaces kan samarbejdende programkomponenter udvikles, oversættes, testes, etc. uafhængigt af hinanden tidsmæssigt kan der være lang tid mellem at komponenterne udvikles (f.eks. Collections.sort() og Terning, Person, Track, ...) Programmeringsteknologi, F11 Parametrisering og generisk kode