Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

Samarbeid mellom objekter

Liknende presentasjoner


Presentasjon om: "Samarbeid mellom objekter"— Utskrift av presentasjonen:

1 Samarbeid mellom objekter
Samarbeid mellom objekter side 2 Eksempler på samarbeid, oppussingsprosjektet side 3-4 Metoden finnAntMeter() med sekvensdiagram side 5-7 Samarabeid mellom objekter av samme klasse side 8-9 Oppussingsprosjektet, menystyrt program side 10-13 Flere referanser til samme objekt side 14-18 Argumentoverføring side 19-20 versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN

2 Samarbeid mellom objekter
I det virkelige liv samarbeider objekter hele tiden for å løse oppgaver. Eksempler: Kari lager te ved å legge en tepose i koppen, og helle vann fra vannkokeren over teposen. Tepose og vann samarbeider. Elisabeth legger en CD i CD-spilleren og starter den. CD-spilleren må samarbeide med CD’en for å lage musikk. I et program samarbeider objekter i et klient-tjener-forhold, der et klient-objekt sender meldinger til et tjener-objekt. Eksempler på meldinger som et klientobjekt kan sende: minCDspiller.spill(”De fire årstidene”); vannkoker.hellVann(kopp); Et klientobjekt kan sende meldinger til objekter som det har tilgang til, f.eks. lokale variabler, objektvariabler og parametre. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN

3 Klassediagram, oppussingsprosjktet
Flate Belegg Maling Tapet navn lengde bredde navn pris breddePåBelegg navn pris antStrøk antKvmPrLiter navn pris lengdePrRull breddePrRull fra side 88 finnNavn finnLengde finnBredde finnAreal finnOmkrets finnNavn finnPrisPrM finnBredde finnAntMeter finnTotalpris finnNavn finnPrisPrLiter finnAntStrøk finnAntKvmPrLiter finnAntLiter finnTotalpris finnNavn finnPrisPrRull finnLengde finnBredde finnAntRuller finnTotalpris Et objekt av klassen Belegg må samarbeide med Flate-objektet for å kunne beregne hvor mange meter belegg som trengs for å dekke flaten. Maling- og Tapet-objekter må også samarbeide med flateobjektet for å beregne henholdsvis antall liter og antall ruller. Kildekode til klassene: Flate, side 89, Belegg og Tapet, side (Maling, løsning til oppg. 2 s. 185.) Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN

4 Melding til belegget: Hva koster det å dekke flaten med deg?
Eksempel på samarbeid class BeleggKlient { public static void main(String[] args) { Flate flaten = new Flate("Berits golv", 5, 6); Belegg belegget = new Belegg("Vegg-til-vegg teppe", , 5); double antMeter = belegget.finnAntMeter(flaten); double pris = belegget.finnTotalpris(flaten); System.out.println("Du trenger " + antMeter + " meter, pris kr. " + pris); } klienten lager to objekter Melding til belegget: Hvor mange meter trengs det av deg for å dekke flaten? Melding til belegget: Hva koster det å dekke flaten med deg? Utskrift fra programmet: Du trenger 6.0 meter, pris kr Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN

5 Metoden finnAntMeter()
public double finnAntMeter(Flate enFlate) { double lengdeFlate = enFlate.finnLengde(); double breddeFlate = enFlate.finnBredde(); int antBredder = (int)(lengdeFlate / breddePåBelegg); double rest = lengdeFlate % breddePåBelegg; if (rest >= grense) antBredder++; return antBredder * breddeFlate; } Metodekallet: double antMeter = belegget.finnAntMeter(flaten); Sammen med meldingen sendes en referanse til flaten (argumentet). På denne måten får metoden tilgang til flate-objektet hos klienten. Metoden kan dermed sende meldinger til dette objektet. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN

6 Et sekvensdiagram viser hvordan samarbeidet skjer
”klient” understrekning betyr objektnavn klienten lager en flate og et belegg klienten ber belegget beregne antall meter som trengs til flaten belegget spør flaten om lengde og bredde og kan deretter beregne antall meter som trengs new flaten new belegget melding sendes finnAntMeter(flaten) finnLengde() Gjør oppgave 1 side 184. finnBredde() objektet er i aktivitet livslinjen til objektene retur fra melding Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN

7 Metoden finnTotalpris()
public double finnTotalpris(Flate enFlate) { return finnAntMeter(enFlate) * pris; } Metodekallet: double pris = belegget.finnTotalpris(flaten); Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN

8 To objekter av samme klasse samarbeider
Eksempel: Å sammenligne arealene til to flater. Flate flate1 = new Flate("A", 5, 4); Flate flate2 = new Flate("B", 4, 4); int resultat = flate1.sammenlignAreal(flate2); if (resultat < 0) System.out.println(flate1.finnNavn() + " er minst."); else if (resultat > 0) System.out.println(flate2.finnNavn() + " er minst."); else System.out.println("Flatene er like."); Metoden sammenlignAreal() i klassen Flate ser slik ut: public int sammenlignAreal(Flate denAndreFlaten) { final double toleranse = ; double areal1 = finnAreal(); double areal2 = denAndreFlaten.finnAreal(); if (Math.abs(areal2 - areal1) < toleranse) return 0; else if (areal1 < areal2) return -1; else return 1; } Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN

9 To Flate-objekter samarbeider om å finne ut hvem som er størst
”klient” new flate1 klienten lager flate1 og flate2 klienten ber flate1 sammenligne seg med flate2 flate1 spør seg selv hvilket areal den har, deretter spør den flate2 hvilket areal den har så kan flate1 sammenligne arealene og returnere resultatet new flate2 sammenlignAreal(flate2) finnAreal() finnAreal() Gjør oppgave 3 side 185. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN

10 Å lage et menystyrt program
Skal beregne materialbehov (tapet, maling eller belegg) for en flate. skriv instruksjoner til brukeren la brukeren velge fra meny [valg == avslutt] [valg != avslutt] utfør valgt oppgave la brukeren velge fra meny String[] alternativer = {"Tapet", "Maling", "Belegg", "Avslutt"}; int valg = gui.velgFraEnkeltvalgListe("Oppussing", "Velg et alternativ:", alternativer); Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN

11 Hvilke klasser vil programmet bestå av?
Klassene Flate, Belegg, Maling og Tapet må være med. Klassen JavabokGUI hjelper oss med å lese inn tall og tekst. Vi trenger en klasse som tar ansvaret for oppgavene i aktivitetsdiagrammet: Skriv brukerinstruks, dvs. kort orientering om hva programmet gjør, og hvordan det brukes. La brukeren velge fra en meny. Utfør den valgte oppgaven. For å finne ut om vi trenger flere klasser, ser vi på hvordan beregning av f.eks. malingsbehov må foregå: Les inn data om flaten som skal males (navn, lengde, bredde). Lag et objekt av klassen Flate. Les inn data om malingen som skal brukes (navn, antall strøk, ant. m2/liter). Lag et objekt av klassen Maling. Spør malingsobjektet om hvor mye maling som trengs for å dekke den gitte flaten. Skriv ut svaret i utskriftvinduet. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN

12 Klassen LesDataGUI Punkt 1 og 3 genererer mange meldinger til gui Þ mange linjer programkode Þ manglende oversikt Punkt 1 og 2, og punkt 3 og 4, er relativt generelle oppgaver som kan tenkes å være nyttige i andre sammenhenger. Velger å lage en klasse LesDataGUI som tar seg av innlesing på ”lavt nivå”, og lager objekter. ProsjektKap7GUI LesDataGUI gui: JavabokGUI detaljGui: LesDataGUI alternativer[1..* ]: String gui: JavabokGUI visInstruksjoner() gjørValg(): int utførMenyvalg(valg: int) lesOgLagFlate lesOgLagTapet lesOgLagMaling lesOgLagBelegg Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN

13 Vis kildekoden, programlistene 7. 2 og 7
Vis kildekoden, programlistene 7.2 og 7.3 (side ) Gjør oppgave 2 side 189. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN

14 Flere referanser til samme objekt
Samarbeid mellom objekter fører ofte til at vi får flere referanser til det samme objektet. Kan lett miste oversikten dersom disse referansene er i forskjellige metoder eller til og med i forskjellige klasser. Hvilke problemer kan oppstå? To konkrete tilfeller: En tilgangsmetode får, via parameterlisten, tilgang til et objekt som “tilhører” klienten. En objektvariabel refererer til et objekt som den har fått via parameterlisten til en konstruktør eller en mutasjonsmetode. Objektet ble opprettet hos klienten. Vi skal se eksempler på disse to tilfellene. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN

15 En referansetype som parameter til en tilgangsmetode
Belegg teppet = new Belegg(”Høstgrå”, , 5.0); Flate mittGolv = new Flate(”Annes golv”, 3.5, 4.2); ”Høstgrå” 233.50 5.0 Vi får en ny referanse til golv-objektet teppet ”Annes golv” 3.5 4.2 mittGolv enFlate double antMeter = teppet.finnAntMeter(mittGolv); public double finnAntMeter(Flate enFlate) { double lengdeFlate = enFlate.finnLengde(); double breddeFlate = enFlate.finnBredde(); …… } Hva skjer ved kallet på metoden finnAntMeter()? Bak kulissene: Flate enFlatemetode = mittGolvklient; Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN

16 En referansetype som parameter til en tilgangsmetode, forts.
Hva kan skje inne i finnAntmeter()? Dersom klassen Flate er mutabel, kan metoden endre på datainnholdet i Flate-objektet - et objekt som ”tilhører” klienten. Utgangspunkt: ”Annes golv” 3.5 4.2 mittGolv (klienten) enFlate (parameter i metoden finnAntMeter()) Hva kan skje inne i metoden: enFlate.settLengde(5.7); ”Annes golv” 3.5 5.7 mittGolv (klienten) enFlate Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN

17 En objektvariabel refererer til et objekt som er laget hos klienten
Vi utvider klassen Flate med opplysninger om belegg. Ny konstruktør: public Flate(String startNavn, double startLengde, double startBredde, Belegg startBelegg) { navn = startNavn; lengde = startLengde; bredde = startBredde; belegg = startBelegg; } Klientprogrammet lager objekter: Belegg teppet = new Belegg(“Høstgrå”, , 5.0); Flate mittGolv = new Flate(“Annes golv”, 3.5, 4.2, teppet); Alternativt kan vi la flate-objektet lage en kopi av belegg-objektet: belegg = new Belegg(startBelegg.finnNavn(), startBelegg.finnPris(); startBelegg.finnBredde()); Nå vil klienten og objektet ”mittGolv” ha hver sin kopi av teppe-objektet. referanse hos tjenerobjektet mittGolv referanse hos klienten Høstgrå 5.0 233.50 teppet belegg Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN

18 Flere referanser til samme objekt, konklusjon
Reduser antall klasser som har tilgang til et objekt - minimal kobling mellom klassene. Vurder å bruke immutable klasser. I stedet for å endre et objekt, lager man heller et nytt som er en kopi av det opprinnelige. (Eksempel: klassen String) Flere klasser kan jobbe med hver sin kopi av et objekt, men dette er sjelden i samsvar med den virkeligheten man modellerer. Vi må vite hva vi gjør, og vi må dokumentere det godt. Gjør oppgave 1 side 197. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN

19 Argumentoverføring Vi har sett at en metode kan forandre på et objekt som ”tilhører” klienten, dersom dette objektet er argument til metoden. Kan en metode, på tilsvarende måte, forandre på en variabel av en primitiv datatype? Eksempel, utvidelse av klassen Belegg: public void settPris(double nyPris) { pris = nyPris; nyPris = 0.0; } På klientsiden: Belegg belegget = new Belegg( "Vegg-til-vegg teppe", , 5); double nyPris = gui.lesDesimaltall("Vegg-til-vegg teppe", "Ny pris: "); belegget.settPris(nyPris); Hos klienten før kallet: ”Vegg-til-vegg teppe” 243.50 5 belegget 189.50 nyPris Ved kallet på settPris() skjer følgende bak kulissene: double nyPrismetode = nyPrisklient; 189.50 Metoden får sin egen variabel: nyPris 0.0 Metoden nullstiller denne variabelen: Konklusjon: Ingen endringer hos klienten. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN

20 Sammendrag, overføring av argumenter ved metodekall
I et metodekall overføres alltid verdiene til argumentene. Parametrene er å betrakte som en metodes lokale variabler, og i metodekallet får de verdi lik verdien til argumentet. To typer parametre: Parameteren er av en primitiv datatype: Metoden jobber med en variabel som har argumentverdien som startverdi. Dersom metoden endrer verdien til denne variabelen, berører ikke dette argumentet i det hele tatt. Parameteren er en referanse: Metoden jobber med en referanse som har argumentverdien som startverdi, det vil si at metoden og klienten har hver sin referanse til det samme objektet. Dersom metoden gjør endringer i objektet, vil dette selvfølgelig dermed også gjelde det objektet som argumenter peker til, ettersom det er det samme objektet vi snakker om. ”Tak” 3 5 argumenter flaten Kall: etObjekt.gjørNoe(10, flaten); tall 10 enFlate Metode: void gjørNoe(int tall, Flate enFlate) { …. } parametre Gjør alle oppgavene side 200. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN


Laste ned ppt "Samarbeid mellom objekter"

Liknende presentasjoner


Annonser fra Google