Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

Programmering i Java versjon 2000-08-15 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.

Liknende presentasjoner


Presentasjon om: "Programmering i Java versjon 2000-08-15 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik."— Utskrift av presentasjonen:

1 Programmering i Java 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 Kapittel 7 Samarbeid mellom objekter Samarbeid mellom objekterside 2 Eksempler på samarbeid, oppussingsprosjektetside 3-4 Metoden finnAntMeter() med sekvensdiagramside 5-7 Samarabeid mellom objekter av samme klasseside 8-9 Oppussingsprosjektet, menystyrt programside Flere referanser til samme objektside Argumentoverføringside 19-20

2 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 Kapittel 7, side 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.

3 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 Kapittel 7, side 3 Klassediagram, oppussingsprosjktet •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.) fra side 88 Belegg navn pris breddePåBelegg finnNavn finnPrisPrM finnBredde finnAntMeter finnTotalpris Tapet navn pris lengdePrRull breddePrRull finnNavn finnPrisPrRull finnLengde finnBredde finnAntRuller finnTotalpris Maling navn pris antStrøk antKvmPrLiter finnNavn finnPrisPrLiter finnAntStrøk finnAntKvmPrLiter finnAntLiter finnTotalpris Flate navn lengde bredde finnNavn finnLengde finnBredde finnAreal finnOmkrets

4 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 Kapittel 7, side 4 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

5 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 Kapittel 7, side 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.

6 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 Kapittel 7, side 6 Et sekvensdiagram viser hvordan samarbeidet skjer Gjør oppgave 1 side 184. ”klient” belegget new finnAntMeter(flaten) flaten new finnLengde() finnBredde() 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 retur fra melding livslinjen til objektene objektet er i aktivitet melding sendes understrekning betyr objektnavn

7 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 Kapittel 7, side 7 Metoden finnTotalpris() public double finnTotalpris(Flate enFlate) { return finnAntMeter(enFlate) * pris; } Metodekallet: double pris = belegget.finnTotalpris(flaten);

8 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 Kapittel 7, side 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; }

9 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 Kapittel 7, side 9 To Flate-objekter samarbeider om å finne ut hvem som er størst Gjør oppgave 3 side 185. ”klient” flate1 new sammenlignAreal(flate2) flate2 new finnAreal() 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

10 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 Kapittel 7, side 10 Å lage et menystyrt program •Skal beregne materialbehov (tapet, maling eller belegg) for en flate. String[] alternativer = {"Tapet", "Maling", "Belegg", "Avslutt"}; int valg = gui.velgFraEnkeltvalgListe("Oppussing", "Velg et alternativ:", alternativer); [valg != avslutt] utfør valgt oppgave la brukeren velge fra meny [valg == avslutt] la brukeren velge fra meny skriv instruksjoner til brukeren

11 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 Kapittel 7, side 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å: 1.Les inn data om flaten som skal males (navn, lengde, bredde). 2.Lag et objekt av klassen Flate. 3.Les inn data om malingen som skal brukes (navn, antall strøk, ant. m2/liter). 4.Lag et objekt av klassen Maling. 5.Spør malingsobjektet om hvor mye maling som trengs for å dekke den gitte flaten. 6.Skriv ut svaret i utskriftvinduet.

12 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 Kapittel 7, side 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. LesDataGUI gui: JavabokGUI lesOgLagFlate lesOgLagTapet lesOgLagMaling lesOgLagBelegg ProsjektKap7GUI gui: JavabokGUI detaljGui: LesDataGUI alternativer[1..* ]: String visInstruksjoner() gjørValg(): int utførMenyvalg(valg: int)

13 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 Kapittel 7, side 13 Vis kildekoden, programlistene 7.2 og 7.3 (side ) Gjør oppgave 2 side 189.

14 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 Kapittel 7, side 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.

15 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 Kapittel 7, side 15 En referansetype som parameter til en tilgangsmetode public double finnAntMeter(Flate enFlate) { double lengdeFlate = enFlate.finnLengde(); double breddeFlate = enFlate.finnBredde(); …… } ”Høstgrå” teppet ”Annes golv” mittGolv Belegg teppet = new Belegg(”Høstgrå”, , 5.0); Flate mittGolv = new Flate(”Annes golv”, 3.5, 4.2); double antMeter = teppet.finnAntMeter(mittGolv); Hva skjer ved kallet på metoden finnAntMeter()? Bak kulissene: Flate enFlate metode = mittGolv klient ; enFlate Vi får en ny referanse til golv-objektet

16 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 Kapittel 7, side 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. ”Annes golv” mittGolv (klienten) Hva kan skje inne i metoden: enFlate.settLengde(5.7); enFlate (parameter i metoden finnAntMeter()) Utgangspunkt: ”Annes golv” mittGolv ( klienten ) enFlate

17 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 Kapittel 7, side 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. Høstgrå teppetbelegg referanse hos klienten referanse hos tjenerobjektet mittGolv

18 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 Kapittel 7, side 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.

19 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 Kapittel 7, side 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); ”Vegg-til-vegg teppe” belegget nyPris Hos klienten før kallet: Ved kallet på settPris() skjer følgende bak kulissene: double nyPris metode = nyPris klient ; Metoden får sin egen variabel: nyPris Metoden nullstiller denne variabelen: 0.0 Konklusjon: Ingen endringer hos klienten.

20 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 Kapittel 7, side 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. Metode: void gjørNoe(int tall, Flate enFlate) { …. } Kall: etObjekt.gjørNoe(10, flaten); ”Tak” 3 5 flaten enFlate 10 tall parametre argumenter Gjør alle oppgavene side 200.


Laste ned ppt "Programmering i Java versjon 2000-08-15 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik."

Liknende presentasjoner


Annonser fra Google