Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.

Liknende presentasjoner


Presentasjon om: "Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else."— Utskrift av presentasjonen:

1 Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 8 Samarbeid mellom objekter Hva er samarbeid?side 2-5 Klassen Navnside 6 Komposisjon i klassediagramside 7 Sekvensdiagram – illustrerer samarbeidside 8 Referansetyper i grensesnittet til en klasseside 9-10 Repetisjon: Argumentoverføring side 11 Aggregeringside Å sammenligne objekterside Metoden equals()side Metoden compareTo()side Oppussingseksemplet, del 1side 20-22

2 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 8, side 2 Objekter samarbeider ved å sende meldinger klient- program (main()) A hjelpMeg1() B hjelpMeg2() tjenerklient tjener Et og samme objekt kan spille både rollen klient og rollen tjener.

3 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 8, side 3 Et objekt er bygget opp av mindre deler navn fdato Ole Andreas Thomassen studenten class Student { private String navn; private int fdato; // ååååmmdd class TestStudent1 { public static void main(String[] args) { Student studenten = new Student("Ole Andreas Thomassen", );

4 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 8, side 4 Objektet løser oppgaver ved å samarbeide med de delene det består av Ole Andreas Thomassen navn fdato Finn etternavnet Hjelp meg! class TestStudent1 { public static void main(String[] args) { Student studenten = ………. String etternavn = studenten.finnEtternavn();

5 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 8, side 5 Samarbeid Et objekt samarbeider med et annet objekt ved å sende meldinger til det. For at det skal være mulig må det andre objektet være tilgjengelig. Enten –som objektvariabel (eller klassevariabel) –som parameter –som en lokal variabel

6 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 8, side 6 Vi deler navnet i to; fornavn og etternavn Vis klassen Navn, programliste 8.2, side class Student { private String fornavn; private String etternavn; private int fdato; lager en egen klasse for Navn }

7 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 8, side 7 Komposisjon, en-del-av-sammenheng 11 navn Student fdato finnFdato finnFornavn finnEtternavn settFornavn settEtternavn Navn fornavn etternavn finnFornavn finnEtternavn settFornavn settEtternavn Et studentobjekt består av en fødselsdato og et navne-objekt Vis program- liste 8.3, side Kompositten har det fulle og hele ansvaret for de delene den består av. Delene eksisterer ikke uten at kompositten eksisterer. kun ett navne- objekt pr student-objekt hvert navne-objekt er med i kun ett student-objekt

8 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 8, side 8 Sekvensdiagram – studenten.finnEtternavn() ”klient” studenten new finnEtternavn() navn finnEtternavn() understrekning betyr objektnavn melding sendes objektet er i aktivitet livslinjen til objektene retur fra melding Klienten lager et student- objekt. Klienten ber studenten finne etternavnet sitt. Studenten søker hjelp hos objektet navn. Studenten sender etternavnet tilbake til klienten.

9 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 8, side 9 Referansetyper i grensesnittet til en klasse Ofte praktisk for klienten å bruke spesiallagede klasser. Vis programliste 8.4, side Merk at studentobjektet har sin egen kopi av navneobjektet. Hva hvis studentobjektet ikke har sin egne kopi?

10 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 8, side 10 Studentobjektet har ikke egen kopi av navneobjektet Oppgave. Hva skrives ut? Navn studNavn = new Navn("Ole Andreas", "Thomassen"); Student studenten = new Student(studNavn, ); System.out.println("A: Student " + studenten); studNavn.settFornavn("Ingolf"); System.out.println("B: Student " + studenten); Navn mittNavn = studenten.finnNavn(); mittNavn.settFornavn("Kåre"); System.out.println("C: Student " + studenten); studenten. settNavn(new Navn("Ole Andreas", "Haug")); System.out.println("D: Student " + studenten); class Student { private Navn navn; private int fdato; public Student(Navn startNavn, int startFdato) { navn = startNavn; // lager ikke kopi, skummelt! fdato = startFdato; } public int finnFdato() { return fdato; } public Navn finnNavn() { return navn; // lager ikke kopi, skummelt! } public void settNavn(Navn nyttNavn) { navn = nyttNavn; // lager ikke kopi, skummelt! } public String toString() { return navn + ", født: " + fdato; } Tips: Tegn en figur som viser alle objekter som blir laget. Dette er ikke en komposisjon. Navneobjektet kan leve lenger enn student-objektet.

11 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 8, side 11 Repetisjon: Argumentoverføring og retur av verdier Et argument er alltid en verdi, enten av en primitiv datatype eller av en referansetype. (Kan være et uttrykk der verdien beregnes.) Ved kallet settes hver parameter lik det tilhørende argumentet i rekkefølge. Inne i metodene fungerer parametrene som om de var lokale variabler. Parameteren er av en primitiv datatype: –Den får startverdi lik argumentet. Parameteren og argumentet er helt uavhengig av hverandre. Parameteren er en referanse: –Den får som verdi en referanse som er lik argumentet. Det vil si at vi får to referanser til det samme objektet. Dataene i objektet kan hentes ut, eventuelt forandres, ved hjelp av begge referansene. Bruk av konstruktøren: Student studenten = new Student("Ole Andreas Thomassen", ); Konstruktørhode: public Student(String startNavn, int startFdato) parametre argumenter Gjør oppgavene side 306.

12 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 8, side 12 Aggregering Student-objektet er ikke lenger det eneste objektet som har tilgang til navne- objektet. Kan ha flere referanser til det samme mutable objektet. –Dermed kan datainnholdet endres fra mange forskjellige steder. –Kan risikere å miste oversikten… Vurder å bruke immutable klasser (eksempel: String) Vurder eventuelt å lage kopier (komposisjon i stedet for aggregering) – er dette i tilfelle en riktig beskrivelse av virkeligheten? Husk at tabeller er mutable objekter! 11 navn Student fdato finnFdato finnNavn settNavn Navn fornavn etternavn finnFornavn finnEtternavn settFornavn settEtternavn Lag klasser med færrest mulig koplinger!

13 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 8, side 13 Komposisjon og aggregering Begge deler beskriver et en-del-av forhold mellom objekter. Det sammensatte objektet (kompositten eller aggregatet) består av de øvrige objektene. I en komposisjon har kompositten ansvaret for delobjektenes liv og død. I en aggregering kan delobjektene leve uavhengig av aggregatet. Virkeligheten som modelleres bestemmer om det er riktig å bruke komposisjon eller aggregering. Dersom delobjektet ikke eksisterer uten at det sammensatte objektet også eksisterer, skal du bruke komposisjon. –I praksis betyr det at delobjektet genereres (ved bruk av new) inne i den klassen som hovedobjektet tilhører. –Dersom du skal være sikret at delobjektet dør samtidig med hovedobjektet, må eventuelle tilgangsmetoder gi klienter tilgang til kopier av delobjektet. Gjør oppgavene side

14 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 8, side 14 Å sammenligne objekter Vis programliste 8.5 side Ønsker å finne ut om to flater har lik omkrets. –Spør den ene flaten om den har omkrets lik den andre flaten: boolean likOmkrets = flate1.likOmkrets(flate2); if (likOmkrets) System.out.println("Lik omkrets"); else System.out.println("Ikke lik omkrets"); –I klassen Flate ser metoden slik ut: public boolean likOmkrets(Flate flate2) { double omkrets1 = finnOmkrets(); double omkrets2 = flate2.finnOmkrets(); if (Math.abs(omkrets2 - omkrets1) < toleranse) return true; else return false; } klassekonstant, lik

15 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 8, side 15 Et flate-objekt sender melding til seg selv og til et annet flate-objekt for å løse en oppgave ”klient” flate1 new likOmkrets(flate2) flate2 new finnOmkrets() klienten lager flate1 og flate2 klienten ber flate1 sammenligne seg med flate2 flate1 spør seg selv hvilken omkrets den har, deretter spør den flate2 hvilken omkrets den har flate1 sammenligner omkretsene og returnerer resultatet

16 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 8, side 16 Standardiserte metodehoder for sammenligning, metoden equals() Metodehode: –public boolean equals(Object objekt) // likhet eller ikke likhet? For klassen Flate: /* * Definerer likhet slik at lengder og bredder skal være like. * Navn behøver ikke være likt. */ public boolean equals(Object objekt) { // Merk parametertypen! if (!(objekt instanceof Flate)) return false; // sjekker klassetilhørighet for argumentet if (this == objekt) return true; // rask løsning dersom like referanser Flate flate2 = (Flate) objekt; // casting nødvendig før Flate-metoder kan brukes if (Math.abs(lengde - flate2.lengde) > toleranse) return false; if (Math.abs(bredde - flate2.bredde) > toleranse) return false; return true; } Bruk: Flate flate1 = new Flate("A", 5, 4); Flate flate2 = new Flate("B", 4, 4); boolean like = flate1.equals(flate2); if (like) System.out.println("Like i henhold til equals()"); else System.out.println("Ikke like i henhold til equals()");

17 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 8, side 17 Metoden equals() Kan alltid sammenligne et objekt med et annet ved å bruke equals(). Dersom klassen objektene tilhører ikke har sin egen utgave av metoden, vil utgaven arvet fra Object bli brukt. Den ser slik ut: public boolean equals(Object obj) { return (this == obj); } Dersom vi lager vår egen utgave av equals(), må den ha eksakt samme hode med unntak av parameternavnet. Hva som gjør at to objekter er like må være veldefinert og godt dokumentert.

18 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 8, side 18 Standardiserte metodehoder for sammenligning, metoden compareTo() compareTo() definererer objektenes naturlige orden For klassen Flate: /* * Definerer compareTo() slik at flatenes arealer sammenlignes. */ public int compareTo(Flate objekt) { double areal1 = finnAreal(); double areal2 = flate2.finnAreal(); if (Math.abs(areal2 - areal1) < toleranse) return 0; else if (areal1 < areal2) return -1; else return 1; } Bruk: int resultat = flate1.compareTo(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.");

19 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 8, side 19 Metoden compareTo() compareTo() er ikke deklarert i klassen Object. Det eksisterer derfor ikke noen standardutgave av denne metoden. Likevel finnes det et standardhode som bør brukes: –public int compareTo(Type objekt) // Type byttes ut med klassenavnet Metoden skal returnere en negativ verdi dersom this er mindre enn objekt, 0 dersom objektene er like, og en positiv verdi dersom this er større enn objekt. Hvordan objektene måles må være veldefinert og godt dokumentert. Bør equals() svare til compareTo() == 0 ? –Ja, som oftest (men det er ikke tilfelle i eksemplet foran), fordi Bibliotekmetoder for sortering bruker gjerne compareTo() Søkemetoder (f.eks. dersom et element skal slettes) bruker gjerne equals() Gjør oppgavene side

20 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 8, side 20 Oppussingseksemplet, del 1 Du har nettopp kjøpt deg en gammel leilighet som du skal pusse opp. Du har bestemt deg for at bad og kjøkken, samt elektriske installasjoner, holder mål. Du ønsker imidlertid å legge nytt golvbelegg i et par av rommene, samt male og tapetsere en del. Du trenger å utføre en del beregninger: Hvor mye maling, eventuelt tapet, trengs det til en bestemt vegg? Hvor mange meter golvbelegg, trengs det til et golv? Hva koster oppussingen av hver enkelt av flatene? Oppgaver –Finn objekter ved å se på substantiver. –Finn fram til den kunnskapen som må lagres i systemet. Dette blir attributter til objektene. Sett opp en liste over attributter og objekter som hører sammen. –Finn ut hvilke beregninger som må utføres. –Fordel ansvaret for beregningene mellom objektene (kan være vanskelig!) –Tegn klassediagram.

21 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 8, side 21 En mulig løsning 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 Vi programmerer hver enkelt klasse for seg og lager testprogram som prøver ut klassene. Vis programliste 8.5, side og 8.6, side

22 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, 3.utgave, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 8, side 22 Belegg og flate må samarbeide for å finne materialbehov ”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 Gjør oppgavene side


Laste ned ppt "Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else."

Liknende presentasjoner


Annonser fra Google