INF april 2016

Like dokumenter
INF april 2017

(MVC - Model, View, Control)

Velkommen til. INF våren 2012

INF våren 2015

Velkommen til INF våren 2011

Stein Gjessing. Institutt for informatikk. Universitetet i Oslo. Institutt for informatikk

Eksekveringsrekkefølgen (del 1) Oppgave 1. Eksekveringsrekkefølgen (del 2) Kommentar til oppgave 1. } // class Bolighus

Abstrakte metoder og klasser. Abstrakte metoder og klasser. Uke 9 INF1010, 27. februar 2007, Abstrakte klasser og grensesnitt (interface)

Uke 6 INF1010, 5. februar 2008, Abstrakte klasser og grensesnitt (interface) Stein Gjessing Inst for Informatikk Univ. i Oslo

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

INF våren Fra problem til program. Utvikling av store datasystemer. Eksempel: Lage en nytt hus. Oversikt:

Abstrakte metoder og klasser. Abstrakte metoder og klasser

Institutt for informatikk. INF1010, 18. februar 2010, Inst for Informatikk

INF1010, 10. februar 2009, Konstruktører. Inst for Informatikk

Fra problem til program. Stein Gjessing Inst. for informatikk

Abstrakte metoder og klasser

Abstrakte metoder og klasser

INF1010, 8. mars Om klassehierarkier, grensesnitt (interface) og multippel arv. Konstruktører i subklasser. Unntak.

IN1010 våren januar. Objektorientering i Java

INF1010 våren januar. Objektorientering i Java

Kom forberedt til tirsdag. INF1000 Tips til obligatorisk oppgave 4. Noen generelle tips. Oblig4: Komme igang

Oblig4 - forklaringer. Arne og Ole Christian

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

INF Uke 10. Ukesoppgaver oktober 2012

INF1000: Forelesning 7

Kapittel 5: Objektkommunikasjon

INF1010 våren Grensesnitt

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

Enkle generiske klasser i Java

Løsningsforslag til eksamen i INF1000 våren 2006

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

INF1010 våren Arv og subklasser del 1

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

INF1000: Forelesning 7. Konstruktører Static

INF1010 Tråder II 6. april 2016

INF1010 våren Grensesnitt

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

Oblig4 - forklaringer. Arne og Ole Christian

2 Om statiske variable/konstanter og statiske metoder.

UNIVERSITETET I OSLO

Repitisjonskurs. Arv, Subklasser og Grensesnitt

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

Velkommen til. INF våren 2016

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

1. Finn klassene (hvilke objekter er det i problemet) 1. Dataene som beskriver problemet (hvilke objekter har vi og hvor mange klasser er det?

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

Oblig 4Hybelhus litt mer tips enn i oppgaven

Gjennomgang av eksamen H99

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

INF1010 våren 2008 Uke 4, 22. januar Arv og subklasser

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

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF1010 våren Arv og subklasser del 1

Obligatorisk oppgave 4: Lege/Resept

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Fra problem til program

INF1010 våren Grensesnitt (interface)

Oblig 3 tips litt mer tips enn i oppgaven

Kapittel 7: Mer om arv

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

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

TDT4100 Objektorientert programmering

Oblig4 - obligatorisk oppgave nr. 4 (av 4) i INF1000

INF1010 MVC i tekstbaserte programmer

INF1000: Forelesning 6. Klasser og objekter del 1

Repetisjon. INF gruppe 13

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

INF Forelesning oppsummering forts. Et meget enkelt banksystem. Oppsummering om klasser, objekter, pekere og.

programeksempel Et større En større problemstilling Plan for forelesingen Problemstillingen (en tekstfil) inneholdt ordet "TGA"

INF1010. Grensesnittet Comparable<T>

UNIVERSITETET I OSLO

Løse reelle problemer

UNIVERSITETET I OSLO

INF våren 2017

Løsningsforslag Test 2

En implementasjon av binærtre. Dagens tema. Klassestruktur hovedstruktur abstract class BTnode {}

Fra krav til objektdesign

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

Uke 11 noen tips og råd + eksempel. Noen muligheter. Valg av datamodell: eksempel. Valg av datamodell: oblig 4

UNIVERSITETET I OSLO

INF1010 våren Arv og subklasser - del 2

INF1010 oversikt med

UNIVERSITETET I OSLO

2 Om statiske variable/konstanter og statiske metoder.

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

Løsningsforslag, inf101, våren 2001

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

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

Spesifikasjon av Lag emne. Kursregistrering bruksmønstermodell (ny versjon) Dagens forelesning. Fra krav til objektdesign

Oppgave 1. Oppgave 2. Oppgave 3. Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

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

INF1010 oversikt med. 23. mai Subklasser mm. Unntaksbehandling GUI Tråder. Stein Gjessing InsBtuC for informabkk Universitetet i Oslo

Innhold. Forord Det første programmet Variabler, tilordninger og uttrykk Innlesing og utskrift...49

Oppsummering. Kort gjennomgang av klasser etc ved å løse halvparten av eksamen Klasser. Datastrukturer. Interface Subklasser Klasseparametre

Transkript:

INF1010-21. april 2016 Programmeringsmønstre Patterns Oppgave med interface Vranglås blant tråder Prosesskommunikasjon Stein Gjessing Institutt for informatikk Universitetet i Oslo 1 1

Problem Spesifikasjon Program 2

Programvare- arkitektur Hvordan programmet er bygget opp Klasser Objekter Hvordan disse klassene og objektene er koblet sammen Mapper, packages... 3

Kjente mønstre for programoppdeling Det er mange kjente og velprøvde måter å dele opp programkode. Slike kjente måter kalles design pa*erns. Ta' fra The Timeless Way of Building, Christoffer Alexander, Oxford University Press, 1979, ISBN 0195024028 Each pa'ern describes a problem which occurs over and over again in our environment, and then describes the core of the solu$on to that problem, in such away that you can use this solu$on a million $mes over, without doing it the same way twice Et slikt programmeringsmønster har mange lært i INF1000 med kommandoløkka som skriver ut en meny og tar kommando fra brukeren. 4

Ins$tu' for informa$kk Arkitekturmønstre Snøhettas forslag til regjeringskvartal Typisk hus i by i USA

Et eksempel på et kjent programmeringsmønster: Modell - Utsyn - Kontroll (MVC - Model, View, Control) (funnet på av Trygve Reenskaug) 6

Et bankprogram Vi skal lage et program som håndterer kontoene i en bank. En konto eies av en kunde, og har en saldo. Programmet skal kommunisere med en bruker i Unix/DOS- vinduet Programmet skal kunne administrere kontoene i banken, og i første omgang 1) Oppre'e en ny konto 2) Fjerne en konto 3) Se'e inn penger på en konto 4) Skrive ut bankens forvaltningskapital 7

Et bankprogram n Vi skal lage et program som håndterer kontoene i en bank. En konto eies av en kunde, og har en saldo. Vi bruker substantivmetoden til å finne forslag til klasser (som vi kan lage objekter fra) class Bank class Konto class Kunde class Saldo For kunde og saldo satser vi i denne enkle versjonen av programmet på å bare bruke h.h.v. en String og en double 8

class Bank I en bank skal vi kunne legge inn en ny kunde, ferne en kunde, se'e inn penger på en kundes konto og finne forvaltningskapitalen $l banken (summen av alle beløpene på alle kontoene) class BankData Alle kontoene blir adminstrert av klassen BankData class Konto Data og metoder for en konto 9

UML klassediagram: Bank BankData 1 1 1 * Konto Sammenlign med Java datastrukturen på neste side (UML er ikke viktig i INF1010) 10

Skisse av Java datastruktur for banksystemet Bank-objekt BankData-objekt Mange Konto-objekter 11

UML klassediagram for BankData BankData Konto 1 * Kan f.eks. gi denne Java datastrukturen: Konto-objekter BankData-objekt navn: type: Bank type: HashMap type: Bank HashMap-objekt En Collection 12

Skisse av class BankData BankData-objekt navn: konti type: HashMap BankData( ) lagbankkunde (...) fjernbankkunde (...) settinn (...) sumallekonti ( ) class BankData { BankData( ) {... private HashMap <String,Konto> konti = new HashMap<String,Konto>( ); public void lagbankkunde(string navn) {... public void fjernbankkunde (String n) {... public void settinn(string n, double b) {... double sumallekonti( ) {... 13

class Konto Når en konto oppre'es oppgir vi dens eier, og saldoen se'es $l null. På en konto skal vi kunne se'e inn et beløp, finne navnet på eieren og finne innestående beløp 14

Skisse av class Konto Konto-objekt Konto(String nvn) class Konto { Konto (String nvn) {... public void setinn(double belop) {... settinn(double belop) double hentsaldo( ) String henteier( ) public double hentsaldo ( ) {... public String henteier( ) {... // slutt klassen Konto 15

Modell Utsyn Kontroll = MVC: Model View Control Modell En ren datastruktur som holder alle data om problemet. Utsyn Egen modul for å presentere modellen for brukeren på ulike måter valgt av brukeren (via kontrollen) Kontroll Egen modul/klasse for å mo'a ordre fra brukeren og enten endre modellen (legge inn nye data, endre, ferne data) eller kalle en funksjon i utsynet for å gi et ny' bilde av modellen. Omlag samme oppdeling som i klient/tjener baserte distribuerte systemer Modell database (server) Utsyn klienten på distribuerte PCer Kontroll tjener/server med forretningslogikken Tjener (med forretningslogikk) Klienter Database server 16

Modell - Utsyn - Kontroll (MVC) Her: Et svært enkelt system for å vise mekanismen. MVC er fortrukket ved noen hundre linjer kode og oppover. Grunnen $l å skille disse funksjonene fra hverandre, er at det gjør det le'ere : Å utvikle - Konsentrere seg om en $ng om gangen Å endre - Kode om en $ng er samlet e' sted F.eks.: Linjebasert vs. Vindusbasert utskrim 17

MVC løsning for banken vår Det skal da være klasser som håndterer : Klassen BankData med hjelpeklassen Konto Utsynet for hele systemet (BankUtsyn) Kontrollen for hele systemet (Bank) 18

Java datastruktur oversikt Bank-objekt BankData-objekt konti BankUtsyn-objekt Konto-objekter <Alt som har med presentasjon og interaksjon med brukere> 19

Program- merings- mønsteret Kontroll Modell / Data Utsyn / View En eller annen datastruktur <Alt som har med presentasjon og interaksjon med brukere> 20

Programskisse av hele Banksystemet /** Kontroll av Banksystemet */ public class Bank { private BankData b; private BankUtsyn u; public Bank( ) { b = new BankData( ); u = new BankUtsyn( ); public static void main (String [] args) { Bank bnk; bnk = new Bank( ); bnk.ordreløkke( ); void ordreløkke ( ) { // end Bank Prøv å kompilere (oversette) og kjøre denne skissen /** Utsyn for Bank*/ class BankUtsyn { <Alt som har med presentasjon og interaksjon med brukere> /** BankData */ class BankData { <administrerer alle kontoene> /** Konto */ class Konto <data om en konto>

Bankklassedatastruktur main navn: bnk type: Bank bnk = new Bank(); bnk.ordreløkke(); navn: b Bank-objekt Bank type: BankData BankData-objekt lagnykunde lagbankkunde fjernbankkunde fjernbankkunde settinn sumallekonti sumallekonti settinn ordrelokke navn: konti BankUtsyn-objekt leskommando beomnavnogbelop hentnavn hentbelop beomoghentnavn skrivsum navn: u type: BankUtsyn HashMap-objekt type: HashMap Konto-objekter 22

Fullstendig program import java.util.*; /** * En konto har en eier identifisert av en tekst (String) * * @author Stein Gjessing * @version 13. januar 2011 **/ class Konto { private String navn; private double saldo; /** * Konstruktør setter kontoens saldo til 0. * * @param n navn på kontoens eier */ Konto (String n) { navn = n; saldo =0; /** * Setter inn et beløp. * * @param b beløp */ public void setinn(double b) { saldo += b; /** * Henter saldoen. * * @return saldo på konto */ public double hentsaldo() { return saldo; /** * Henter eier. * * @return navn på eier */ public String henteier() { return navn; 23

/** * BankData er modellen / dataene i banksystemet. * * Denne klassen innehold er alle metoder som * er nødvendige for å manipulere kontoer. * En ny bank innholder ingen kontoer. * Alle kontoenes eiere må ha forskjellige navn * * @author Stein Gjessing * @versjon 13. januar 2011 */ class BankData { private HashMap <String,Konto> konti = new HashMap<String,Konto>(); /** * Oppretter en ny konto i banken. * * @param kunde navn på kunden */ public void lagbankkunde(string navn) { konti.put(navn, new Konto (navn)); /** * Fjerne en konto fra banken. * @param navn navn på kunde */ public void fjernbankkunde(string navn) { konti.remove(navn); /** * Summerer saldoen for alle kontoene i banken. * * @return summen av saldo for alle kontoer */ public double sumallekonti() { double sum = 0; for (Konto s: konti.values()) sum+= s.hentsaldo(); return sum; /** * Setter inn penger på en konto. * * @param navn navn på kunde * @param belop beløpet som settes inn. */ public void settinn (String navn, double belop) { Konto k = konti.get(navn); k.setinn(belop); 24

/** * Bank er kontrollklassen for dette banksystemet. * Her ligger ordreløkken som styrer det hele. * Denne klassen er bindeleddet mellom * utsynet og datamodellen. * * @author Stein Gjessing * @version 17. Januar 2011 */ public class Bank { private BankData b; private BankUtsyn u; Bank() { b = new BankData(); u = new BankUtsyn(); public static void main(string [] args) { Bank bnk = new Bank(); bnk.ordreløkke(); /** * Lager en ny konto. */ void lagnykunde () { String nvn = u.beomoghentnavn(); b.lagbankkunde(nvn); /** * Fjerner en konto. */ void fjernbankkunde () { String nvn = u.beomoghentnavn(); b.fjernbankkunde(nvn); /** * Setter inn penger på en konto. * Nødvendig informasjon hentes via ustynet. */ void settinn() { u.beomnavnogbelop(); String navn = u.hentnavn(); double bel = u.hentbelop(); b.settinn(navn,bel); /** * Henter summen av saldo fra alle kontoer * og viser resultatet ved hjelp av utsyn */ void sumallekonti() { double sum = 0; sum = b.sumallekonti(); u.skrivsum(sum); /** * Ordreløkken som styrer kommandoene. */ void ordreløkke () { int valg; valg = u.leskommando(); while(valg!= 0) { switch (valg) { case 1: lagnykunde(); break; case 2: fjernbankkunde(); break; case 3: settinn(); break; case 4: sumallekonti(); break; default: u.skrivfeil("gi tall mellom 0-4"); valg = u.leskommando(); // end ordreløkke // end class Bank 25

/** * BankUtsyn brukes til innlesing og vising av kundedata. * * @author Stein Gjessing * @version 13. Januar 2011 */ class BankUtsyn { private Scanner tast; // tast gir kortvarig oppbevaring av leste data private String navn; private double belop; /** * Konstruktør */ BankUtsyn( ) { tast = new Scanner(System.in); /** * Skriver ut menyen og leser inn kommandovalget. * * @return kommandovalget */ public int leskommando() { System.out.println("\nMeny: "); System.out.println("0 - avslutt"); System.out.println("1 - Opprett ny kunde "); System.out.println("2 - Fjern kunde"); System.out.println("3 - Sett inn penger"); System.out.println("4 - Finn forvaltningskapital"); System.out.print(" Velg funksjon: "); return (tast.nextint()); /** * Ber om navn og beløp og lagrer. */ public void beomnavnogbelop() { System.out.print("\nGi navn og beløp (på hver sin linje): "); navn = tast.next(); belop = tast.nextdouble(); /** * Henter navnet som er lest inn. * * @return navnet */ public String hentnavn() { return navn; /** * Henter bløpet som er lest inn. * * @return beløpet */ public double hentbelop() { return belop; /** * Ber om og henter et navn. * * @return navnet */ public String beomoghentnavn() { System.out.print("\nGi navn : "); return tast.next(); 26

/** * Skriver ut bankens forvaltningskapital. * * @param sum kapitalen som skrives ut */ public void skrivsum(double sum) { System.out.println("\nBankens forvaltningskapital: + sum); /** * Skriver ut en feilmelding. * * @param feil feilmeldingen */ public void skrivfeil(string feil) { System.out.println(feil); // end BankUtsyn Lag Javadoc: >javadoc -package Bank.java 27

Design - kjente grep for å strukturere koden Top-down nedbryting av moduler til flere enklere moduler i ett eller flere nivåer Objekter kan nyttes som moduler. Top-down nyttes for noen nivåer Bottom-up programmering Lage generelle klasser og operasjoner (metoder) vi vil trenge i systemet vårt fra bunnen av eller med grunnlag i biblioteker jfr. Java-biblioteket med mer enn 4000 klasser for de fleste behov. 28

Hvor skal vi legge metodene (funksjonene) Kan synes opplagt, men er det ikke alltid To prinsipper (gir ofte, men ikke alltid samme resultat): Legg en funksjon der (nesten alle) data er som funksjonen skal jobbe på Legg funksjonene der de hører hjemme naturlig / i virkeligheten Ofte samme resultet, men ikke her: Oppgave: I et student/eksamens-system skal det skrives ut vitnemål. Skal metoden skrivvitemål() legges i: Class Student - hvor data ligger Class SkoleAdministrasjon - hvor funksjonen utføres i den virkelige verden Velg det siste da blir det lettere å vedlikeholde systemet (SkoleAdministrasjon henter data fra Student) 29

Top-down nedbrytning av en beregning Eksempel værdata fra Met. Inst. : Anta at vi har en enkel modell av værobservasjoner for Meteorologisk institutt, og at observasjonene gjøres på værstasjoner. Annenhver time, hver dag, hele året igjennom registreres temperatur og nedbør siden forrige observasjon. Nå kan vi tenke oss at vi er interessert i maksimums- og minimumstemperatur hver dag, og i gjennomsnittlig temperatur og samlet nedbør hver dag, hver måned og for hele året fra disse observasjonene. UML klassediagram Hvordan skal vi regne ut gj.snitt nedbør for en stasjon per år? 30

Top-down: Gj.snitt nedbør per år og mnd. UML klassediagram Enten en metode i class Stasjon med tre løkker inne i hverandre, over alle Måneder, Dager, Observasjoner Komplikasjon: Håndtering av manglende data på alle nivåer Alternativt - bedre: Hver av klassene har sin beregngjennomsnittnedbør() metode, som bare kaller neste tilsvarende det riktige antall ganger (og som til sist leser av verdien i Observasjon) 31

Nytt eksempel: Oppgave som løses ved hjelp av Interface April 19, 2016 32

Oppgave: Lag et program som administrerer et bibliotek. Analyse av et bibliotek: n n n Bøker, tidsskrifter, CDer, videoer, mikrofilmet materiale, antikvariske bøker, flerbindsverk, oppslagsverk, upubliserte skrifter, En del felles egenskaper n antall eksemplarer, hylleplass, identifikasjonskode (Dokument) n n for det som kan lånes ut: Er utlånt?, navn på låner,... (TilUtlån) for det som er antikvarisk: Verdi, forskringssum,... (Antikvarisk) Spesielle egenskaper: n n n Bok: Forfatter, tittel, forlag Tidsskriftnummer: Årgang, nummer, utgiver CD: Tittel, artist, komponist, musikkforlag

Tvilsomt begrepshierarki Forslag til subklassehierarki Dokument Bok CD Tidskrift UtlånbarBok IkkeLånbarBok UtlånbarCD IkkeLånbarCD Utlånbart Tidsskriftnr IkkeLånbart Tidsskriftnr 34

Omrokkering uten suksess Dokument UtlånbartDokument IkkeLånbartDokument BokU CDU TidsskriftnrUtl Bok CD Tidsskriftnr klassehierarki

Samle lik oppførsel: Interface interface TilUtlån class Dokument class Bok class CD class Tidskriftnr class UtlånbarBok class UtlånbarCD class Utlånbart Tidsskriftnr n En klasse kan tilføres egenskaper fra et eller flere interface (i tillegg til å arve egenskapene i klassehierarkiet) 36

Husk, et interface er En samling egenskaper (en rolle) som ikke naturlig hører hjemme i et arve-hierarki En samling egenskaper som mange forskjellige ting av forskjellige typer kan anta For eksempel Kan delta i konkurranse (startnummer, resultat,.. Mennesker, biler, hester kan delta i konk.) Svømmedyktig (mennesker, fugler er svømmed.) Her: Antikvarisk (møbler, bøker,. ) Kan lånes ut (biler, bøker, festklær, ) Sammenlignbar (Comparable)... 37

Arve fra flere grensesnitt interface TilUtlån Verk Dokument interface Antikvarisk Bok CD Video Tidskriftnr UtlånbarBok AntekvUtlånbrCD IkkeLånbarCD Utlånbart Tidsskriftnr IkkeLånbartTids skriftnr AntikvariskBok Utlånbart, Antekvarisk Tidsskrift n En klasse kan tilføres et ubegrenset antall interface-er n Dvs. en klasse kan spille et ubegrenset antall roller Antikvarisk tidsskriftnr 38

Klassehierarki, forenklet bibliotek interface TilUtlån Bok Dokument CD BokTilUtlaan BokIkkeUtlaan CDTilUtlaan CDIkkeUtlaan 39

Forenklet bibliotek interface TilUtlån BokTilUtlaan Bok Dokument BokIkkeUtlaan abstract class Dokument { String tittel; abstract class Bok extends Dokument { String forlag; int trykningsår; abstract betyr at vi ikke kan lage slike objekter interface TilUtlaan { abstract void låne(string låner) ; abstract void levere() ; abstract boolean utlånt() ; static final String ingen = "ingen"; // Slutt interface TilUtlaan 40

interface TilUtlaan BokTilUtlaan BokTilUtlaan Bok Dokument BokIkkeUtlaan Bare disse to klassene kan vi lage objekter av BokTilUtlaan har både egenskapene til Bok og egenskapene til TilUtlaan. Objekter av denne klassen kan spille begge rollene! class BokTilUtlaan extends Bok implements TilUtlaan { String låner = ingen; public void låne (String l) { låner = l; public void levere() { låner = ingen; public boolean utlånt() { return låner!= ingen; // Slutt class BokTilUtlaan class BokIkkeUtlaan extends Bok { 41

Se på implementasjonen igjen: interface TilUtlaan { abstract void låne(string låner) ; abstract void levere() ; abstract boolean utlånt() ; static final String ingen = ingen"; Metodene i et interface er veldig polymorfe class BokTilUtlaan extends Bok implements TilUtlaan { String låner = ingen; public void låne (String l) { låner = l; public void levere() { låner = ingen; public boolean utlånt() { return låner!= ingen; Dette er de tre metodene som vi må love å implementere 42

interface TilUtlaan { abstract void låne(string låner) ; abstract void levere() ; abstract boolean utlånt() ; static final String ingen = ingen"; interface TilUtlån Dokument CD abstract class CD extends Dokument { String komponist, artist, musikkforlag; CDTilUtlaan CDIkkeUtlaan class CDTilUtlaan extends CD implements TilUtlaan { String låner = ingen; public void låne(string l) { låner = l; public void levere() { låner = ingen; public boolean utlånt() { return låner!= ingen; Her er de tre metodene igjen // Slutt class CDTilUtlaan 43

Husk om interface: Navnet på et interface kan brukes som typenavn når vi lager pekere. Vitsen med et grensesnitt er å spesifisere hva som skal gjøres (ikke hvordan) Ofte er det flere implementasjoner av et grensesnitt (flere klasser kan implementere det). En implementasjon (av et grensesnitt) skal kunne endres uten at resten av programmet behøver å endres. Men selv om et grensesnitt skal spesifisere hva (og ikke hvordan), spesifiseres bare syntaksen (signaturen) og ikke hva som gjøres (semantikken) 44

Metoden låne void låne() void låne() throws IOException { boolean utlånt() Dokument d = null; String h; void levere() System.out.println( Tittel: "); h = <les tittel>; d = alledokumenter.get(h); if (d==null) {System.out.println("Beklager, denne har vi ikke"); else if (d instanceof TilUtlaan) { TilUtlaan t = (TilUtlaan) d; Navn: t if (t.utlånt()) { System.out.println("Beklager, utlånt"); else { Type: TilUtlån System.out.print( Låners navn: "); String n = <les navn>; t.låne(n); else { System.out.println("Beklager, denne låner vi ikke ut"); 45

Metoden leveretilbake void leveretilbake() { void låne() Dokument d = null; boolean utlånt() String h; System.out.print( Tittel: "); void levere() h = <les tittel>; d = alledokumenter.get(h); if (d==null) {System.out.println("Beklager, feil tittel"); else if (d instanceof TilUtlaan) { TilUtlaan t = (TilUtlaan) d; Navn: t if (t.utlånt()) { t.levere(); Type: TilUtlån System.out.println("Takk"); else {System.out.println("Beklager, denne er ikke utlånt"); Slutt bibliotekeksempel 46

Mer om tråder: Vranglås (deadlock) Vranglås skjer når flere tråder venter på hverandre i en sykel: Eksempel Veikryss: alle bilene skal stoppe for biler fra høyre - > Alle stopper = VRANGLÅS 47

Vranglås betyr Flere tråder venter på hverandre Syklisk ven$ng Venter på Venter på Venter på Venter på 48

Vranglås kan oppstå når flere tråder kjemper om felles ressurser Det er en eller flere felles ressurser som ønskes av mer enn en tråd Hvis en tråd først tar en ressurs og dere'er en annen... 49 49

Enkleste eksempel på vranglås To tråder To ressurser Ressurs 1 Tråd 1 Tråd 2 Ta 1 Ta 2 Ta 2 Ta 1 Fri 1 og 2 Fri 1 og 2 Ressurs 2 50

Enkleste eksempel på vranglås: To biler kan risikere å 2 2 vente på hverandre 1 1 Venstre del Høyre del Smalt veistykke, to biler kan ikke passere hverandre. Bilene kan bare se den første delen. 51

Vranglås! Venstre del Høyre del Det smale veistykket består av to ressurser, og begge bilene venter på at den andre bilen skal bli ferdig med å bruke sin ressurs. 52

Unngå vranglås Ta bare en ressurs Ta alle (på en gang) eller ingen Alle tråder tar alle ressurser i samme rekkefølge Hvis vranglås har oppstå': Fri en og en ressurs $l det ikke lenger er vranglås 53 53

Prosesskommunikasjon i høynivåspråk April 19, 2016 54

Kommunikasjon mellom Java- prosesser: RMI: Remote Method Invoca$on (Norsk: Fjern- metode- kall) Et Java program (på en maskin) InterfaceNavn fjernpeker =.; Dette ønsker vi å oppnå: Et annet Java program (på en annen maskin)... fjernpeker.metodenavn( );... metodenavn objekt av en klasse som implementerer InterfaceNavn Alternativt navn: RPC: Remote Procedure Call 55

En maskin fjernpeker RMI: Implementasjon en proxy for fjern-objektet (bak kulissene) et skjelett formidler kall og retur En annen maskin metodenavn Ikke pensum i INF1010 tjenermetode... fjernpeker.metodenavn( );... en stub for fjern-metoden Odene proxy og stub brukes ikke alltid like konsistent fjern-objekt (kan også brukes av Javaprogrammet på denne maskinen) Parametere (og returverdi) pakkes ned og sendes mellom de to maskinen (marshaling) 56

RMI: Hvordan kalle metoder i (Java- )objekter på andre maskiner klient 3. oppgi navn på objekt tjener Ikke pensum i INF1010 Register/ navnetjener 4. og få tilbake peker 2. 5. bruk peker til fjernmetode-kall (Remote Method Invocation): fjernpeker.metodenavn( ); objekt 1. registrer (bind) med navn på objektet Og det eneste som er kjent på begge maskinene er Interfacet til objektet og navnet 57

CORBA, MPI CORBA (Common Object Request Broker Architecture) er (var) en språkuavhengig måte å definere kommunikasjon mellom fern- objekter (a la side 56-58) Et IDL (Interface Defini$on Language) definerer grensesni'et $l objektene (på samme måte som Interface i Java) En IDL- kompilator overse'er $l di' valgte språk (Java, C++, C#, Smalltalk, ) De'e gjør at prosesser skrevet i forskjellige objektorienterte språk og som kjører på forskjellige (eller samme) maskin kan kommunisere. Språk som ikke er objektorienterte: Send en melding (MPI Message- Passing Interface) P1 P2 P3 58