1 / 20

Samarbeid mellom objekter

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

wyatt
Download Presentation

Samarbeid mellom objekter

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2000. ISBN 82-417-1132-8.

  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 2000. ISBN 82-417-1132-8.

  3. Klassediagram, oppussingsprosjktet Flate Belegg Maling Tapet • 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. navn lengde bredde navn pris breddePåBelegg navn pris lengdePrRull breddePrRull navn prisantStrøk antKvmPrLiter fra side 88 finnNavn finnLengde finnBredde finnAreal finnOmkrets finnNavn finnPrisPrM finnBredde finnAntMeter finnTotalpris finnNavn finnPrisPrRull finnLengde finnBredde finnAntRuller finnTotalpris finnNavn finnPrisPrLiter finnAntStrøk finnAntKvmPrLiter finnAntLiter finnTotalpris Kildekode til klassene: Flate, side 89, Belegg og Tapet, side 178-179. (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 2000. ISBN 82-417-1132-8.

  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", 243.50, 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. 1461.0. Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2000. ISBN 82-417-1132-8.

  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 2000. ISBN 82-417-1132-8.

  6. Et sekvensdiagram viser hvordan samarbeidet skjer understrekning betyr objektnavn ”klient” new 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 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 2000. ISBN 82-417-1132-8.

  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 2000. ISBN 82-417-1132-8.

  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 = 0.00001; 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 2000. ISBN 82-417-1132-8.

  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 2000. ISBN 82-417-1132-8.

  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 2000. ISBN 82-417-1132-8.

  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 2000. ISBN 82-417-1132-8.

  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 gui: JavabokGUI detaljGui: LesDataGUI alternativer[1..* ]: String lesOgLagFlate lesOgLagTapet lesOgLagMaling lesOgLagBelegg visInstruksjoner() gjørValg(): int utførMenyvalg(valg: int) Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2000. ISBN 82-417-1132-8.

  13. Vis kildekoden, programlistene 7.2 og 7.3 (side 190-193)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 2000. ISBN 82-417-1132-8.

  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 2000. ISBN 82-417-1132-8.

  15. En referansetype som parameter til en tilgangsmetode Belegg teppet = new Belegg(”Høstgrå”, 233.50, 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 2000. ISBN 82-417-1132-8.

  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 2000. ISBN 82-417-1132-8.

  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å”, 233.50, 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 2000. ISBN 82-417-1132-8.

  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 2000. ISBN 82-417-1132-8.

  19. 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", 243.50, 5); double nyPris = gui.lesDesimaltall("Vegg-til-vegg teppe", "Ny pris: "); belegget.settPris(nyPris); Argumentoverføring 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 2000. ISBN 82-417-1132-8.

  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 tildetsammeobjektet. 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 2000. ISBN 82-417-1132-8.

More Related