Læringsmål for forelesningen Objektorientering Delegeringsteknikken Delegering vs. arv 1
Dagens forelesning Introduksjon og motivasjon Hvorfor forelese om standardteknikker, såkalte patterns? Hva slags problem løses med delegering? Delegering vs. arv Delegeringseksempler Person.children-liste AnnenhverIterator1 AnnenhverIterator2 Sekvensdiagrammer i UML 2
Bortsett fra arv... så kan dere det viktigste om Java-språket! Men... programmering er mer enn Java, dere trenger også lære om standard kodingsteknikker, f.eks. god strukturering av koden og bruk av flere API er 3
Standard kodingsteknikker a design pattern is a general repeatable solution to a commonly occurring problem in software design Gjenbrukbare kodingsteknikker som har vist seg å være praktiske/effektive løsninger 4
Eksamen 2012 Del 1 Innkapsling (20%) Gitt følgende klasse, som representerer et tidspunkt på dagen: public class DayTime { public final int hours, minutes; public DayTime(int hours, int minutes) { this.hours = hours; this.minutes = minutes; } public String tostring() { return hours + ":" + minutes; } } 5
Eksamens-motivasjon 1. Hva betyr final-nøkkelordet slik det er brukt her? På hva slags måte(r) ivaretar denne klassen formålet med innkapsling og på hva slags måte(r) ikke? 2. Beskriv den generelle teknikken og navnekonvensjonen(e) for å representere og kapsle inn en enkel verdi, f.eks. tall eller objektreferanse, som skal kunne endres etter at objektet er opprettet. 3. I hva slags metode(r) brukes unntak ifm. innkapsling, og hvordan? Vis gjerne med et eksempel! 4. Mange klasser inneholder et List<X>-felt og definerer addx, removex og andre metoder som tilsvarer og bruker metodene i List-grensesnittet. En alternativ løsning kunne vært å arve fra en List<X>-implementasjon, f.eks. ArrayList<X>. Hvorfor brukes aldri denne løsningen i praksis? 6
Delegering Et objekt fremstår med en ferdighet, men overlater til et annet (internt) objekt å gjøre jobben (Matlagings)analogi (kjøkken)sjefen har ansvaret, men han/hun har (kun) en koordinerende rolle overfor underordnede (kjøkken)medarbeidere Mer fleksibel teknikk enn arv for gjenbruk av eksisterende funksjonalitet 7
Generell delegeringsløsning To objekter: delegerende og delegat delegerende eier/har en referanse til delegat delegerende har et sett metoder m1..mn som (noenlunde direkte) tilsvarer metoder hos delegat kall til metodene m1..mn på delegerende fører (noenlunde direkte) til tilsvarende kall på delegat delegerende delegat m1() m2() mn() m1() m2() mn() 8
Eksempel: Person.children-liste Delegerende: Person-objekt Delegat: List<Person>-objekt m1..mn: getchildcount/size getchild/get addchild/add removechild/remove... getchildcount() getchild() mn() Person children: List<Person> size() get() mn() Hva med arving? Hvordan og hvorfor ikke? 9
Eksempel: IO Java sitt IO-system er bygd på delegering: alle klassene bygger på en av de abstrakte superklassene Writer, Reader, OutputStream og InputStream Mange av klassene delegerer til implementasjoner av disse InputStreamReader BufferedReader PrintWriter... 10 Kall til metoder som read/readln, write og print/println delegerer til det indre objektet sine metoder
Delegering og grensesnitt Metodene m1..mn er ofte deklarert i et grensesnitt som delegerende og delegat implementerer Delegerende kan implementere flere slike grensesnitt og har da én delegat for hvert delegerende: G1 GN delegat1: G1... delegatn: GN g1m1() g1mn() gnm1() gnmn() g1m1() g1mn() gnm1() gnmn() 11
Varianter av delegering Flere delegater implementerer samme grensesnitt Delegerende velger hvilken det delegeres til i hvert tilfelle, basert på ikke-funksjonelle egenskaper én implementasjon er raskere for bestemte argumenter jevn fordeling av last på underliggende maskinvare konfigurasjon som avhenger av formål, f.eks. drift, testing Delegerende kan tilpasse og filtrere metodekallene delegerende: G delegat1: G... delegatn: G m1() mn() m1() mn() 12 m1() mn() m1() mn()
Eksempel: logging Logging brukes for å samle informasjon om kjøring av program Mange rammeverk for logging, med noenlunde samme funksjonalitet registrering av div. info om kilden: klasse, tidspunkt,... meldinger med ulik alvorlighetsgrad: fatal, error, warning og info ulike måter å rapportere på: til fil, meldingspanel, rss, twitter,... regler for hvilke meldinger som skal havne hvor, f.eks. kaste info, lagre warning til fil, sende error til admin og fatal til brannvesenet Såkalte meta-loggere lar deg programmere med ett rammeverk, men delegere til et eller flere andre metalogger: L loggere: L1 loggerw: LN error() warn() info() error() warn() 13 Hva med arving? Hvordan og hvorfor ikke?
Eksempel: AnnenhverIterator1 AnnenhverIterator1 delegerer til intern Iterator, men kaster annenhvert element it1: AnnenhverIterator1 it2: Iterator hasnext() next() hasnext() next() hasnext() next() Hva med arving? Hvordan og hvorfor ikke? 14
Eksempel: AnnenhverIterator2 AnnenhverIterator2 har to interne Iterator-objekter, og delegerer til dem annenhver gang it1: AnnenhverIterator2 it2: Iterator it3: Iterator hasnext() next() hasnext() next() hasnext() next() hasnext() next() Hva med arving? Hvordan og hvorfor ikke? 15
Eksempel: HashMap med defaults En begrenset Map-aktig klasse for hierarkiske innstillinger/kjede med defaults. map: DefaultingMap realmap: Map defaults: DefaultingMap get(k) get(k) containskey(k)//true get(k) containskey(k)//false get(k) Hva med arving? Hvordan og hvorfor ikke? 16
Læringsmål for forelesningen Objektorientering Delegeringsteknikken Delegering vs. arv 17