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
© Copyright 2024