Dagens forelesning Java 13 Design av større programmer : fordeling av roller INF 101-13. mars 2003 Flere eksempler på bruk av objekter MVC-prinsippet MVC-prinsippet Flere eksempler på programmer med objekter Ole Christian Lingjærde Gruppen for bioinformatikk (www.ifi.uio.no/bioinf) Institutt for informatikk Universitetet i Oslo Ole Chr. Lingjærde Institutt for informatikk 13. mars 2003 2 Rollefordeling (variant 1) Rollefordeling (variant 2) En klasse som inneholder alt Hovedklassen Oppstart, initialisering, kommandoløkke, grensesnitt mot omverden, avslutte Datamodellen Holder rede på hele datastrukturen og metodene som jobber på datastrukturen Øvrige klasser som inngår som del av datastrukturen En klasse som inneholder alt Hovedklassen (kontrollen) Oppstart, initialisering, kommandoløkke, avslutte Grensesnitt mot omverden Kommunikasjon m/bruker, filbehandling, nettverk,... Datamodellen Holder rede på hele datastrukturen og metodene som jobber på datastrukturen Øvrige klasser som inngår som del av datastrukturen Ole Chr. Lingjærde Institutt for informatikk 13. mars 2003 3 Ole Chr. Lingjærde Institutt for informatikk 13. mars 2003 4
Variant 2: MVC-prinsippet MVC: overordnet programstruktur Model: datamodellen, dvs datastrukturen og operasjonene på den En klasse for hver type objekt som datastrukturen skal inneholde En overordnet klasse som holder orden på datastrukturen ved hjelp av tabeller osv, og som inneholder metoder for alle de operasjonene vi måtte ønske å utføre på datastrukturen Controller fil Views Tre Sko g høy de 12.3 main Tre gran = new Tre ( ); Tre furu = new Tre ( ); årsvekst Tre bjørk = new Tre ( ); gran høy de 12.3 furu høy de årsvekst 12.3 bjørk årsvekst Model Ole Chr. Lingjærde Institutt for informatikk 13. mars 2003 5 View: grensesnittet mot brukeren Klasser som styrer programmets kommunikasjon med filer og terminal Controller: den delen av programmet som styrer det hele En klasse med metoden main som styrer programmet initialisering av datastruktur (model) og brukergrensesnitt (view) kommandoløkke avslutninger Ole Chr. Lingjærde Institutt for informatikk 13. mars 2003 6 Hvilken variant skal vi bruke? Eksempel: et personregister Avhenger av problemet Variant 1 Todeling: kontroll/grensesnitt + datamodell Lett å plugge inn en annen datamodell Holder for de fleste formål i kurset Variant 2 Tredeling: kontroll + grensesnitt + datamodell Lett plugge inn en annen datamodell Lett å plugge inn et annet grensesnitt Er godt egnet for større systemer Kontrollør og grensesnitt Datamodell class Hovedkontroll { public static void main { new Personregister class Register { Person [] medlem; int antmedlemmer, maxmedlemmer; <Ordre-metoder> <Metoder for operasjoner på hele registret> class Person { <Data om denne personen> <Metoder for endring av persondata> Ole Chr. Lingjærde Institutt for informatikk 13. mars 2003 7 Ole Chr. Lingjærde Institutt for informatikk 13. mars 2003 8
Hva designes som objekter? To små spørsmål Grunnregel: Objektet må enten ha egne data eller egne operasjoner (eller begge deler) som hører sammen - ellers kunne det like gjerne vært programmert som en enkel variabel eller en metode. I datamodellen: Et abstrakt eller konkret fenomen som skal representeres i datasystemet - en konto, en person, en type kaffe, et parti kaffe, en bil på en vei I grensesnittet: En mekanisme i et datasystem eller en annen gjenstand styrt av datateknikk - et skjermvindu, en fil, kanalvelgeren, lydstyrkeregulatoren Ole Chr. Lingjærde Institutt for informatikk 13. mars 2003 9 Hvor mange Person-objekter lages her: Person [] allepersonene = new Person[50]; Anta at vi har laget klassen Person: class Person { String navn; String fødselsnummer; String adresse; Hvordan ville du sjekke om to Person-pekere p1 og p2 faktisk representerer samme person? Ole Chr. Lingjærde Institutt for informatikk 13. mars 2003 10 Oppgave: hva gjøres når? I hvilken rekkefølge skjer de ulike tingene når dette programmet kjøres? class Oppgave2 { static double pi = 3.14; // (1) String navn; // (2) public static void main (String [] args) { Oppgave2 op = new Oppgave2("Petter"); // (3) op.skrivnavn(); // (4) Oppgave2 (String navn) { this.navn = navn; // (5) void skrivnavn() { System.out.println("Navnet er : " + navn); // (6) Ole Chr. Lingjærde Institutt for informatikk 13. mars 2003 11 Oppgave: hva skrives ut? class Oppgave3 { static String s1 = v('a'); String s2 = v('b'); public static void main (String [] args) { String s3 = v('c'); Oppgave3 op = new Oppgave3(); op.skrivut(); Oppgave3 () { s2 = v('d'); static String v (char c) { System.out.println(c); return "" + c; void skrivut() { Test programmet System.out.println('e'); Editer programmet Ole Chr. Lingjærde Institutt for informatikk 13. mars 2003 12
Eksempel: vareregister Framgangsmåte Anta at vi skal lese en fil med følgende format: Først er det en linje med 3 overskrifter (separert av blanke tegn) Deretter kommer det en eller flere linjer, som hver består av et heltall, et desimaltall og en tekststreng (separert av blanke tegn) Eksempel: Antall Pris Varenavn 35 23.50 Oppvaskkost 53 33.00 Kaffe 97 27.50 Pizza.................. Den første linja er spesiell, og vi tenker oss her at den ikke er så interessant - vi ønsker bare å få lest forbi den. Det kan vi gjøre med instringln(). De andre linjene har samme format, så vi kan lage en løkke hvor hvert gjennomløp av løkken leser de tre itemene på en linje. Vi bruker da henholdsvis inint(), indouble() og instringln(). For å vite når filen er slutt, kan vi enten bruke endoffile() eller lastitem(). Siden vi leser filen itemvis, er det mest naturlig å bruke lastitem(). Da får vi heller ikke problemer dersom det skulle ligge noen blanke helt på slutten av filen. Dataene som leses skal programmet ta vare på for senere formål. Ole Chr. Lingjærde Institutt for informatikk 13. mars 2003 13 Ole Chr. Lingjærde Institutt for informatikk 13. mars 2003 14 Å holde rede på dataene Hvert vareslag representeres som et objekt av klassen: class Vareslag { private String varenavn; private int antall; private double pris; Vareslag (String varenavn, int antall, double pris) { this.varenavn = varenavn; this.antall = antall; this.pris = pris; // I tillegg har vi metoder fåvarenavn(), osv Ole Chr. Lingjærde Institutt for informatikk 13. mars 2003 15 Å holde rede på dataene (forts.) Datamodellen representeres som et objekt av klassen: class Varer { private int MAX_ANT_VARER = 100; private int antallvarer = 0; private Vareslag [] varene = new Vareslag[MAX_ANT_VARER]; void nyvare(string varenavn, int antall, double pris) { Vareslag v = new Vareslag(varenavn, antall, pris); varene[antallvarer++] = v; boolean harvare(string varenavn) {... int fåantall(string varenavn) {... double fåpris(string varenavn) {... Ole Chr. Lingjærde Institutt for informatikk 13. mars 2003 16
Å holde rede på dataene (forts.) class LesVarerFraFil boolean harvare(string varenavn) { for (int i=0; i<antallvarer; i++) { if (varene[i].fåvarenavn().equals(varenavn)) return true; return false; int fåantall(string varenavn) { for (int i=0; i<antallvarer; i++) { if (varene[i].fåvarenavn().equals(varenavn)) return varene[i].fåantall(); return 0; Ole Chr. Lingjærde Institutt for informatikk 13. mars 2003 17 import inf101.*; class LesVarerFraFil { public static void main (String[] args) { Varer v = new Varer(); Inn fil = new Inn("varer.txt"); fil.instringln(); // Les forbi overskriften while (!fil.lastitem()) { int antall = fil.inint(); double pris = fil.indouble(); String varenavn = fil.instringln().trim(); v.nyvare(varenavn, antall, pris); if (v.harvare("kaffe")) { System.out.println("Pris kaffe: " + v.fåpris("kaffe")); Test programmet Editer programmet Ole Chr. Lingjærde Institutt for informatikk 13. mars 2003 18 En samtalepartner Lag programmet Test programmet Vi skal lage to programmer som tilsammen gjør det mulig å "snakke med maskinen", slik at hver gang maskinen gjenkjenner et ord i det vi skriver så gir den et bestemt (og tilnærmet fornuftig) svar. Det første programmet går i løkke og ber brukeren om å oppgi et ord og et tilhørende svar, og legger dette på en fil "svar.txt". Det andre programmet skal starte med å lese filen "svar.txt" og skal deretter gå i løkke og be brukeren skrive noe, hvoretter programmer skriver ut tilhørende svar (hvis ordet er registrert). Ole Chr. Lingjærde Institutt for informatikk 13. mars 2003 19 Ole Chr. Lingjærde Institutt for informatikk 13. mars 2003 20
Ole Chr. Lingjærde Institutt for informatikk 13. mars 2003 21 Ole Chr. Lingjærde Institutt for informatikk 13. mars 2003 22 Ole Chr. Lingjærde Institutt for informatikk 13. mars 2003 23 Ole Chr. Lingjærde Institutt for informatikk 13. mars 2003 24