Konto - Universitetet i Oslo

Ins$tu' for informa$kk
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 Ins$tu' for informa$kk
Problem
Spesifikasjon
Program
2 Programvare-­‐arkitektur Ins$tu' for informa$kk
•  Hvordan programmet er bygget opp –  Klasser –  Objekter –  Hvordan disse klassene og objektene er koblet sammen –  Mapper, “packages” –  . . . 3 Kjente mønstre for programoppdeling Ins$tu' for informa$kk
•  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 Ins$tu' for informa$kk
(MVC -­‐ Model, View, Control) (funnet på av Trygve Reenskaug) 6 Et bankprogram Ins$tu' for informa$kk
•  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 
Ins$tu' for informa$kk
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 Ins$tu' for informa$kk
•  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 Ins$tu' for informa$kk
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
Ins$tu' for informa$kk
BankData-objekt
Mange Konto-objekter
11 UML – klassediagram for BankData
BankData
Ins$tu' for informa$kk
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
Ins$tu' for informa$kk
class BankData {
navn: konti
BankData( ) { . . .}
type: HashMap
private HashMap <String,Konto> konti =
new HashMap<String,Konto>( );
BankData( )
lagBankKunde (. . .)
public void lagBankKunde(String navn) {
...}
fjernBankKunde (. . .)
public void fjernBankKunde (String n) {
... }
settInn (. . .)
public void settInn(String n, double b) {
... }
sumAlleKonti ( )
double sumAlleKonti( ) {
... }
}
13 class Konto Ins$tu' for informa$kk
•  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)
Ins$tu' for informa$kk
class Konto {
Konto (String nvn) { . . . }
public void setInn(double belop) { . . . }
settInn(double belop)
public double hentSaldo ( ) { . . . }
double hentSaldo( )
public String hentEier( ) { . . . }
} // slutt klassen Konto
String hentEier( )
15 Modell – Utsyn – Kontroll = MVC: Model – View – Control Ins$tu' for informa$kk
–  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. Klienter
–  Omlag samme oppdeling som i klient/tjener baserte distribuerte systemer Tjener (med
•  Modell – database (server) •  Utsyn – klienten på distribuerte PCer •  Kontroll – tjener/server med forretningslogikken forretningslogikk)
Database
server
16 Modell -­‐ Utsyn -­‐ Kontroll (MVC) Ins$tu' for informa$kk
•  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 Ins$tu' for informa$kk
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 Bank-objekt
Java
datastruktur
oversikt –
Ins$tu' for informa$kk
BankData-objekt
konti
BankUtsyn-objekt
Konto-objekter
<Alt som har med
presentasjon og
interaksjon med
brukere>
19 Kontroll
Programmeringsmønsteret
Utsyn / View
Ins$tu' for informa$kk
Modell / Data
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
Bank-objekt
type: BankData
lagNyKunde
BankData-objekt
lagBankKunde
fjernBankKunde
fjernBankKunde
settInn
sumAlleKonti
sumAlleKonti
settInn
ordrelokke
navn: konti
navn: u
BankUtsyn-objekt
type: HashMap
type: BankUtsyn
Konto-objekter
lesKommando
beOmNavnOgBelop
hentNavn
hentBelop
beOmOgHentNavn
skrivSum
HashMap-objekt
22 Fullstendig program
/**
* Setter inn et beløp.
*
* @param b beløp
*/
public void setInn(double b) {
saldo += b;
}
import java.util.*;
/**
* En konto har en eier identifisert av en tekst (String)
*
* @author Stein Gjessing
* @version 13. januar 2011
**/
/**
* Henter saldoen.
*
* @return
saldo på konto
*/
public double hentSaldo() {
return saldo;
}
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;
}
Ins$tu' for informa$kk
/**
* Henter eier.
*
* @return
navn på eier
*/
public String hentEier() {
return navn;
}
}
23 Ins$tu' for informa$kk
/**
* 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 {
/**
* Summerer saldoen for alle kontoene i banken.
*
* @return
summen av saldo for alle kontoer
*/
public double sumAlleKonti() {
double sum = 0;
private HashMap <String,Konto> konti =
new HashMap<String,Konto>();
for (Konto s: konti.values())
sum+= s.hentSaldo();
return sum;
/**
* 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);
}
}
/**
* 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);
}
/**
Ins$tu' for informa$kk
* 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
25 } // end class Bank
/**
* 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() { Ins$tu' for informa$kk
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 Ins$tu' for informa$kk
/**
* 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 Ins$tu' for informa$kk
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 28
Ins$tu' for informa$kk
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 29
Top-down nedbrytning av en beregning
Ins$tu' for informa$kk
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 30
Ins$tu' for informa$kk
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 31
Ins$tu' for informa$kk
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 
Bøker, tidsskrifter, CDer, videoer, mikrofilmet materiale,
antikvariske bøker, flerbindsverk, oppslagsverk, upubliserte
skrifter, …
En del felles egenskaper
n 
n 
n 
n 
antall eksemplarer, hylleplass, identifikasjonskode (Dokument)
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
CD
Bok
UtlånbarBok
Dokument
IkkeLånbarBok
UtlånbarCD
Tidskrift
IkkeLånbarCD
Utlånbart
Tidsskriftnr
IkkeLånbart
Tidsskriftnr
34
Dokument
Omrokkering
uten suksess
UtlånbartDokument
IkkeLånbartDokument
CDU
BokU
Bok
CD
TidsskriftnrUtl
klassehierarki
Tidsskriftnr
Samle lik oppførsel: Interface
interface
TilUtlån
n 
class Dokument
class Bok
class CD
class UtlånbarBok
class UtlånbarCD
class Tidskriftnr
class Utlånbart
Tidsskriftnr
En klasse kan tilføres egenskaper fra et eller flere interface
(i tillegg til å arve egenskapene i klassehierarkiet)
36
Husk, et interface er
Ins$tu' for informa$kk
•  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 37
Arve fra flere grensesnitt
interface
TilUtlån
Dokument
interface
Antikvarisk
Verk
CD
Bok
UtlånbarBok
AntekvUtlånbrCD
AntikvariskBok
Video
Tidskriftnr
IkkeLånbarCD
Utlånbart IkkeLånbartTids
Tidsskriftnr
skriftnr
Utlånbart,
Antekvarisk
Tidsskrift
Antikvarisk
tidsskriftnr
En klasse kan tilføres et ubegrenset antall interface-er
n  Dvs. en klasse kan spille et ubegrenset antall roller
n 
38
Klassehierarki, forenklet bibliotek
Dokument
interface TilUtlån
Bok
BokTilUtlaan
BokIkkeUtlaan
CD
CDTilUtlaan
CDIkkeUtlaan
39
Forenklet bibliotek
Dokument
interface
TilUtlån
BokIkkeUtlaan
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
Bok
BokTilUtlaan
abstract class Dokument {
String tittel;
}
40
BokTilUtlaan
Dokument
interface TilUtlaan
Bok
BokTilUtlaan
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:
Ins$tu' for informa$kk
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() {
Dette er de tre
låner = ingen;
}
metodene som vi
public boolean utlånt() {
må love å
return låner != ingen;
implementere
}
}
42 42
interface TilUtlaan {
abstract void låne(String låner) ;
abstract void levere() ;
abstract boolean utlånt() ;
static final String ingen = ”ingen";
}
Dokument
interface TilUtlån
abstract class CD extends Dokument {
String komponist, artist, musikkforlag; CDTilUtlaan
}
CD
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; }
} // Slutt class CDTilUtlaan
Her er
de tre
metodene
igjen
43
Husk om interface:
Ins$tu' for informa$kk
•  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) {
Navn: t
TilUtlaan t = (TilUtlaan) d;
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 låne()
void levereTilbake() {
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) Ins$tu' for informa$kk
•  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 Ins$tu' for informa$kk
•  Flere tråder venter på hverandre •  Syklisk ven$ng Venter
på
Venter
på
Venter
på
Venter
på
48 Ins$tu' for informa$kk
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 Ins$tu' for informa$kk
•  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 Ins$tu' for informa$kk
Enkleste eksempel på vranglås: To biler kan risikere å vente på hverandre 2
2
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
Ins$tu' for informa$kk
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 Ins$tu' for informa$kk
•  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 Ins$tu' for informa$kk
Prosesskommunikasjon i høynivåspråk April 19, 2016 54 Kommunikasjon mellom Java-­‐prosesser: RMI: Remote Method Invoca$on (Norsk: Fjern-­‐metode-­‐kall) Ins$tu' for informa$kk
Dette ønsker vi å oppnå:
Et Java program
(på en maskin)
Et annet Java
program
(på en annen
maskin)
InterfaceNavn fjernPeker = …….;
...
fjernPeker.metodeNavn( );
...
metodeNavn
objekt av en klasse som
implementerer InterfaceNavn
Alternativt navn: RPC: Remote Procedure Call
55 RMI: Implementasjon
(bak kulissene)
En maskin
fjernPeker
en proxy for
fjern-objektet
Ins$tu' for informa$kk
Ikke pensum i INF1010
En annen
maskin
et skjelett
formidler
kall og retur
metodeNavn
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 Ins$tu' for informa$kk
Ikke pensum i INF1010
klient
tjener
3. oppgi navn på objekt
Register/
navnetjener
4. og få tilbake peker
2.
5. bruk peker til
fjernmetode-kall
(Remote Method
Invocation):
1. registrer (bind)
med navn
på objektet
objekt
fjernPeker.metodeNavn( );
Og det eneste som er kjent på begge maskinene
er Interfacet til objektet og navnet
57 CORBA, MPI Ins$tu' for informa$kk
•  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 P2
(MPI – Message-­‐Passing Interface) P1
P3
58