INF1010 våren januar. Objektorientering i Java

Like dokumenter
IN1010 våren januar. Objektorientering i Java

INF1010 våren Grensesnitt

INF1010 våren Grensesnitt (interface)

INF1010 våren Interface (Grensesnitt)

INF1010 våren Grensesnitt

INF1010, 15. januar time. Parametriserte klasser (generiske klasser) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

INF1010, 21. januar Klasser med parametre = Parametriserte klasser = Generiske klasser

2 Om statiske variable/konstanter og statiske metoder.

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

INF1010 våren Arv, subklasser og grensesnitt - del 2

INF våren 2017

IN1010 våren 2018 Tirsdag 15. mai. Repetisjon av subklasser og tråder. Stein Gjessing Institutt for informatikk Universitetet i Oslo

Enkle generiske klasser i Java

INF1000 (Uke 12) Sortering

INF Seminaroppgaver til uke 3

UNIVERSITETET I OSLO

INF1010, 21. februar Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

IN våren 2019 Onsdag 16. januar

IN våren 2018 Tirsdag 16. januar

UNIVERSITETET I OSLO

INF Objektorientert programmering. Datastrukturer i Java Klasser med parametre

Introduksjon til objektorientert programmering

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

LC191D Videregående programmering Høgskolen i Sør-Trøndelag, Avdeling for informatikk og e-læring. Else Lervik, januar 2012.

Gjennomgang av eksamen H99

UNIVERSITETET I OSLO

Seminaroppgaver IN1010, uke 2

INF1010 våren Arv og subklasser del 1

Lenkelister. Lister og køer. Kopi av utvalgte sider fra forelesningen.

INF1010 våren 2019 Onsdag 30. januar. Mer om unntak i Java (med litt repetisjon av I/O først)

Uke 8 Eksamenseksempler + Ilan Villanger om studiestrategier. 11. okt Siri Moe Jensen Inst. for informatikk, UiO

Velkommen til. INF våren 2016

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I

Eks 1: Binærtre Binærtretraversering Eks 2: Binærtre og stakk

Eksamen INF1010 V2009 Del B prøveeksamen V2010 Vekt 60 %

INF1010 våren 2017 Onsdag 25. januar. Litt om unntak i Java

2 Om statiske variable/konstanter og statiske metoder.

INF1010 våren Arv og subklasser del 1

UNIVERSITETET I OSLO

INF Objektorientert programmering. Datastrukturer i Java Klasser med parametre

UNIVERSITETET I OSLO

Dagens forelesning. Java 13. Rollefordeling (variant 1) Rollefordeling (variant 2) Design av større programmer : fordeling av roller.

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

OPPGAVE 5b og 8b Java Kode

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Endret litt som ukeoppgave i INF1010 våren 2004

Dagens tema Kapittel 8: Objekter og klasser

Gjøre noe i hele treet = kalle på samme metode i alle objekten. Java datastruktur Klassestruktur

Forelesning inf Java 4

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

1. Krav til klasseparametre 2. Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Innhold. INF1000 Høst Unified Modeling Language (UML) Unified Modeling Language (UML)

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

UNIVERSITETET I OSLO

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

UNIVERSITETET I OSLO

klassen Vin må få en ny variabel Vin neste alle personvariable (personpekere) i listeklassen må byttes til Vin

Forelesning inf Java 5

Dagens tema INF1010 INF1010 INF1010 INF1010

Forelesning inf Java 5

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

INF1000: Forelesning 7

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

UNIVERSITETET I OSLO

Kapittel 5: Objektkommunikasjon

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

INF januar 2015 Stein Michael Storleer (michael) Lenkelister

(MVC - Model, View, Control)

IN1010 våren Repetisjon av tråder. 15. mai 2018

INF1000: Forelesning 6. Klasser og objekter del 1

Løsningsforslag Test 2

UNIVERSITETET I OSLO

Hva er en metode? INF1000 Forelesning 8. Hva skjer når vi kaller en metode? Hvorfor bruke metoder?

INF1010. Grensesnittet Comparable<T>

INF1000: Forelesning 7. Konstruktører Static

Hva er en metode. Hva skjer når vi kaller en metode

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

INF Våren Li' repe$sjon om Tråder og GUI. Stein Gjessing, Ins$tu' for informa$kk, Universitetet i Oslo. Ins$tu' for informa$kk

INF Løsning på seminaropppgaver til uke 8

Lese fra fil. INF1000 : Forelesning 5. Eksempel. De vanligste lesemetodene. Metoder:

Fra Python til Java. En introduksjon til programmeringsspråkenes verden. Dag Langmyhr

Lenkelister, iteratorer, indre klasser. Repetisjonskurs våren 2018 kristijb

INF1000 Forelesning 8. Litt repetisjon: Metoder og klasser Innkapsling av variable og metoder Hvordan gripe an et stort problem?

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

Eksamen IN1010/INF1010 våren 2018

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I Løsningsforslag

Obligatorisk oppgave 4: Lege/Resept

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) Løsningsforslag

INF 1000 høsten 2011 Uke september

UNIVERSITETET I OSLO

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

Transkript:

INF1010 våren 2017 25. januar Objektorientering i Java Om enhetstesting (Repetisjon av INF1000 og lær deg Java for INF1001 og INF1100) Stein Gjessing

Hva er objektorientert programmering? F.eks: En sort boks som tar vare på ett tall: settinn(int tall) Masse problemer, selv med et så lite eksempel: taut( ) Hvordan virker settinn hvis det er et tall der fra før? Hvordan virker taut hvis det ikke er noe tall i boksen? Så: Hvilke metoder trengs? Hvordan skal disse metodene virke?

Hva er objektorientert programmering? Hva er et objekts grensesnitt mot omverdenen? Svar: De public metodene. F.eks: En sort boks som tar vare på ett tall: public void settinn(int tall) public int taut( ) public boolean ertom( ) Ukjent implementasjon av metode Ukjent implementasjon av metode Ukjent implementasjon av metode Ukjente private data og ukjente private metoder Dette er IKKE nytt. 3

Vi lager en klasse som vi kan lage objekter av: class EnkelHeltallsbeholder { private new EnkelHeltallsbeholder() gir dette objektet: public void settinn(int tall) { public int taut( ) { public void settinn(int tall) public int taut( ) public boolean ertom( ) privat datastruktur public boolean ertom ( ) { Objekt av klassen EnkelHeltallsbeholder Dette er en historie fra virkeligheten! 4

Metodenes signaturer public void settinn(int tall) public int taut( ) public boolean ertom( ) Dette kaller vi metodenes signaturer (skrivemåte, syntaks) Signaturen til en metode er - navnet på metoden - navnene, typene og rekkefølgen til parametrene - retur-typen (ikke i Java) 5

Metodenes semantikk public void settinn(int tall) public int taut( ) public boolean ertom( ) Hva gjør disse metodene? Hvordan virker de? Hva er sematikken til metodene? Semantikk betyr virkemåte 6

Metodenes semantikk public void settinn(int tall) public int taut( ) public boolean ertom( ) Forslag til semantikk: Metoden settinn gjør at objektet tar vare på tallet som er parameter til metode. Hvis det er et tall der fra før, har metoden ingen virkning. Metoden taut tar ut av objektet det tallet som tidligere er satt inn Metoden returnerer det tallet som slettes Metoden ertom returnerer sann om objektet er tomt, usann ellers. 7

Informatikkens 3. lov: J Først betemmer vi semantikken og signaturene Deretter implementerer vi metodene samtid som vi bestemmer oss for hva de private dataene skal være Dette gjelder for alle programmeringsspråk, det er ikke Java-spesifikt. J Dette er en spøk. Informatikken har ikke nummererte lover 8

Testing -- Enhetstesting n n n n Når vi planlegger og skriver programmer prøver vi å overbevise oss selv (og dem vi skriver sammen med) at den koden vi skriver kommer til å utføre det vi ønsker Men vi kommer alltid til å tenke og skrive feil Derfor må vi teste programmet vårt Objektorientering / modularisering: n n Test et objekt eller en modul om gangen n Sørg for at den er så riktig som mulig Deretter kan vi test sammensettingen av objektene / modulene 9 9

class EnkelHeltallsbeholder { private public void settinn(int tall) { public int taut( ) { public boolean ertom ( ) { class VeldigEnkelTestAvBeholder { public static void main (String[ ] arg) { EnkelHeltallsbeholder beholder = new EnkelHeltallsbeholder(); Type: EnkelHeltallsbeholder Navn: beholder public void settinn(int tall) public int taut( ) public boolean ertom( ) privat datastruktur Objekt av klassen EnkelHeltallsbeholder

Veldig enkel test av beholder class EnkelHeltallsbeholder { private int tallet; private boolen tom = true; public void settinn(int tall) { if (tom) tallet = tall; public int taut( ) { tom = true; return tallet; public boolean ertom ( ) { return tom; FULLSTENDIG KJØRBART PROGRAM Type: EnkelHeltallsbeholder Navn: beholder public void settinn(int tall) public int taut( ) public boolean ertom( ) class VeldigEnkelTestAvBeholder { public static void main (String[ ] arg) { EnkelHeltallsbeholder beholder = new EnkelHeltallsbeholder(); beholder.settinn(17); if (beholder.taut() == 17) {System.out.println ( Riktig ); else {System.out.println( Feil ); nmos:programmer steing$ java VeldigEnkelTestAvBeholder nriktig nmos:programmer steing$ privat datastruktur Objekt av klassen EnkelHeltallsbeholder

Enkel test av heltallsbeholder public class EnkelTestAvHeltallsbeholder { public static void main (String[ ] arg) { EnkelHeltallsbeholder beholder = new EnkelHeltallsbeholder(); beholder.settinn(17); if (beholder.taut() == 17) {System.out.println ("Riktig 1"); else {System.out.println("Feil 1"); beholder.settinn(18); beholder.settinn(17); if (beholder.taut() == 18) {System.out.println ("Riktig 2"); else {System.out.println("Feil 2"); if (beholder.ertom()) {System.out.println ("Riktig 3"); else {System.out.println("Feil 3"); beholder.settinn(19); if (! beholder.ertom()) {System.out.println ("Riktig 4"); else {System.out.println("Feil 4"); mos:programmer steing$ java EnkelTestAvHeltallsbeholder Riktig 1 Feil 2 Riktig 3 Feil 4 mos:programmer steing$ Metoden settinn gjør at objektet tar vare på tallet som er parameter til metoden. Hvis det er et tall der fra før, har metoden ingen virkning. Metoden taut tar ut av objektet det tallet som tidligere er satt inn Metoden returnerer det tallet som slettes Metoden ertom returnerer sann om objektet er tomt, usann ellers class EnkelHeltallsbeholder { private int tallet; private boolen tom = true; public void settinn(int tall) { if (tom) tallet = tall; public int taut( ) { tom = true; return tallet; public boolean ertom ( ) { return tom; Hvor er feilen??

/** Objekter av denne klassen tar vare på * ett heltall. * Initielt er beholderen tom * * @author Stein Gjessing * versjon 5. januar 2017 */ public class Enkelheltallsbeholder { private boolean tom = true; private int tallet; /** * Gjør at objektet tar vare på tallet som * er parameter til metoden. * Hvis det allerede er lagret et tall i objektet, * dvs. at beholderen ikke er tom, har denne * metoden ingen virkning * *@param tall tallet som objektet skal * ta vare på */ public void settinn(int tall) { if (tom) tallet = tall; tom = false; Med Javadoc (og uten? feil) /** * Sjekkeren om objektet er tomt * *@return objektet er tomt */ public boolean ertom ( ) { return tom; /** * Tar ut av objektet det tallet objektet * tar vare på. * Om objektet alt er tomt, returneres en * ubestemt verdi. * Etter dette kallet er objektet tomt. * *@return tallet som tas ut. eller en * ubestemt verdi om objektet er tomt */ public int taut( ) { tom = true; return tallet; 13

Javadoc resultat mos:programmer steing$ javadoc Enkelheltallsbeholder.java Loading source file Enkelheltallsbeholder.java... Constructing Javadoc information... Standard Doclet version 1.8.0_31 Building tree for all the packages and classes... Generating./Enkelheltallsbeholder.html.... Generating./deprecated-list.html... Building index for all classes... Generating./allclasses-frame.html... Generating./allclasses-noframe.html... Generating./index.html... Generating./help-doc.html... mos:programmer steing$ 14

Bare du, som er et menneske, kan sjekke at implementasjonen overholder de SEMANTISKE KRAVENE til metodene (?) /** Objekter av denne klassen tar vare på * ett heltall. * Initielt er beholderen tom * * @author Stein Gjessing * versjon 5. januar 2017 */ public class Enkelheltallsbeholder { private boolean tom = true; private int tallet; /** * Gjør at objektet tar vare på tallet som * er parameter til metoden. * Hvis det allerede er lagret et tall i objektet, * dvs. at beholderen ikke er tom, har denne * metoden ingen virkning * *@param tall tallet som objektet skal * ta vare på */ public void settinn(int tall) { if (tom) tallet = tall; tom = false; /** * Sjekkeren om objektet er tomt * *@return objektet er tomt */ public boolean ertom ( ) { return tom; /** * Tar ut av objektet det tallet objektet * tar vare på. * Om objektet alt er tomt, returneres en * ubestemt verdi. * Etter dette kallet er objektet tomt. * *@return tallet som tas ut. eller en * ubestemt verdi om objektet er tomt */ public int taut( ) { tom = true; return tallet; (Samme Java-kode som på lysark 13) 15

har 12 forskningsgrupper. En av disse heter Presis Modellering og Analyse (PMA). Her arbeider de bl.a. med å formalisere disse sematiske kravene, slik at du kan få hjelp av datamaskinen til å sjekke at implementasjonen overholder de semantiske kravene. Litt mer på en senere forelesning. Implementasjon public void settinn(int tall) public int taut( )? Beskrivelse av objektets semantikk De sematiske kravene kalles også en kontrakt (mellom brukerene av objektet og objektet selv) 16

Flere eksempler: Kaniner og kaninbur class Kanin{ String navn; Kanin(String nv) {navn = nv; class Kaninbur { private public boolean settinn(kanin k) {... public Kanin taut( ) {.. 17

Igjen: Signatur (syntaks) og Sematikk Signaturer: class Kaninbur { public boolean settinn(kanin k) { public Kanin taut( ) { Semantikk: Hvis objektet er tomt vil metoden settinn gjøre at objektet tar vare på kaninen som er parameter til metoden, og metoden returnerer sann. Hvis objektet allerede inneholder en kanin gjør metoden ingen ting med objektet, og metoden returnerer usann. Metoden taut tar ut kaninen som er i objektet og returnerer en peker til denne kaninen. Metoden returnerer null hvis objektet allerede er tomt.

class Kanin{ String navn; Kanin(String nv) {navn = nv; Kaniner og kaninbur: Full kode class Kaninbur { private Kanin denne = null; public boolean settinn(kanin k) { if (denne == null) { denne = k; return true; else return false; public Kanin taut( ) { Kanin k = denne; denne = null; return k; 19

Som bakgrunn for enhetstesting: Modifikatorer og Observatorer En modifikator-metode forandrer tilstanden til et objekt En observator-metode leser av tilstanden uten å forandre den Et objekt Tilstand som er skjult utenfor Modifikatorer Observatorer........ Modifikator, f.eks. set(), Observator, f.eks. les()

Testing - - Enhetstesting n Når vi skal teste et objekt kan vi først kalle en modifikator-metode og deretter en observator-metode og se om vi observerer det ønskede resultat Modifikatorer Observatorer Et objekt........ Modifikator, f.eks. set(). Observator, f.eks. les()

Enhetstesting av class Kaninbur class Kanin{ String navn; Kanin(String nv) {navn = nv; class Kaninbur {... // Testprogram: public static void main ( ) { Kaninbur detguleburet = new Kaninbur( ); Type: Kaninbur Navn: detguleburet Kanin kalle = new Kanin("Kalle"); Type: Kanin Type: Kanin Navn: kalle detguleburet.settinn(kalle) Navn: denne Objekt av klassen Kanin Kanin sprett = new Kanin("Sprett"); boolean settinnok = detguleburet.settinn(sprett); test( Test inn i fullt bur, settinnok);... Kanin taut( ) Objekt av klassen Kaninbur Type: Kanin Navn: sprett...... boolean settinn (Kanin den) Objekt av klassen Kanin

Enhetstest av class Kaninbur Lag egne testmetoder (IKKE slik jeg har gjort her) Kalle class LittenTestKaninbur { public static void main (String [ ] args) { Kaninbur detguleburet = new Kaninbur( ); Kanin kalle = new Kanin("Kalle"); detguleburet.settinn(kalle); Kanin sprett = new Kanin( Sprett ); // tester at andre kanin ikke kommer inn i buret: booelan settinnok = detguleburet.settinn(sprett); if (settinnok) { System.out.prinln( Feil sett inn ); else {System.out.prinln( Riktig sett inn ); // tester at den som først ble satt inn nå tas ut: Kanin enkanin = detguleburet.taut( ); if (enkanin.navn.equals( Kalle ) { System.out.prinln( Riktig ta ut ); else {System.out.prinln( Feil ta ut ); Enhetstesting bør vi gjøre av alle klasser Sprett Pelle 23

Eksempel på kaninbur til mange kaniner 3 observatorer 2 modifikatorer class KaninGård { public boolean full( ) { public boolean tom ( ) { public Kanin finnen(string navn) { public void settinn (Kanin kn) { public void fjern(string navn) { Men at reglen om at vi bare skal ha helt rene observator-metoder og helt rene modifikator-metoder er kanskje å drive det litt langt. For eksempel public Kanin hentut(string navn) { Veldig forenklet kaningård på neste side 24

Objekt av klassen ForenkletKaninGård Navn: antall public void settinn (Kanin en) Her mangler det mye Kanin [ ] alle Type: int alle [antall] = en; antall ++; public Kanin taut( ) antall --; return alle [antall]; class ForenkletKaninGård { private int antall = 0; private Kanin [] alle = new Kanin[100]; public void settinn(kanin peker) {alle[antall] = peker; antall ++; public Kanin taut( ) { antall --; return alle[antall]; Oppgave: skriv ferdig klassen KaninGård fra forrige side 25