Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

Komponenttipohjainen ohjelmistotekniikka (TJTSS56) Osa 12 Kevätlukukausi 2010 Jyväskylän yliopisto Tietojenkäsittelytieteiden laitos Markku Sakkinen.

Samankaltaiset esitykset


Esitys aiheesta: "Komponenttipohjainen ohjelmistotekniikka (TJTSS56) Osa 12 Kevätlukukausi 2010 Jyväskylän yliopisto Tietojenkäsittelytieteiden laitos Markku Sakkinen."— Esityksen transkriptio:

1 Komponenttipohjainen ohjelmistotekniikka (TJTSS56) Osa 12 Kevätlukukausi 2010 Jyväskylän yliopisto Tietojenkäsittelytieteiden laitos Markku Sakkinen

2 Yhteyspohjainen ohjelmointi – edistyneitä käsitteitä (jatkoa) Esimerkki: geneerinen viestinvälityskanava Component Pascalilla. Kysymys ei siis ole operaationkutsuista, joissa tarvittaisiin paluuarvo tai ainakin kuittaus operaation päättymisestä. Liikenne on yksisuuntaista, ja siksi kanavan ei tarvitse tietää lähettäjiä. Jos haluttaisiin kaksisuuntainen liikenne (vastausviestit), tarvittava rakenne olisi symmetrisempi mutta mutkikkaampi. Geneerinen parametri määrittelee käsiteltävien viestien tyypin. DEFINITION ReceiverGroups; TYPE Sink (A) = POINTER TO ABSTRACT RECORD (s: Sink(A)) Receive (VAR message: A), NEW, ABSTRACT END; Group (A) = POINTER TO ABSTRACT RECORD (s: Group(A)) Register (s: Sink(A)), NEW, ABSTRACT; (s: Group(A)) Unregister (s: Sink(A)), NEW, ABSTRACT; (s: Group(A)) Send (VAR message: A), NEW, ABSTRACT; END; END ReceiverGroups. Tämä vastaa varsin tarkkaan seuraavaa Java-koodia: Komponenttipohjainen ohjelmistotekniikka (Markku Sakkinen) – Osa 12 18. 4. 2010 2

3 Yhteyspohjainen ohjelmointi – edistyneitä käsitteitä (jatkoa) package ReceiverGroups; interface Sink { void Receive (A message); } interface Group { void Register (); void Unregister (); void Send (A message); } Tässä ilmeneviä Component Pascalin eroja Javaan: Mitkään muuttujien tyypit eivät ole osoitintyyppejä (viitetyyppejä), ellei niitä määritellä sellaisiksi määreellä POINTER TO. Luokat katsotaan tietuetyypeiksi, joissa on myös metodeja. Metodin kutsumuodossa on ennen metodin nimeä esiteltävä nykyolio eksplisiittisesti nimettynä muuttujana. Määre VAR parametrin nimen edellä tarkoittaa viiteparametriä, jollaisia Javassa ei ole. Metodin määre NEW tarkoittaa, että se ei syrjäytä mitään perittyä metodia, on siis siinä mielessä uusi. Todelliset geneeriset parametrit voivat olla mitä tietotyyppejä hyvänsä (muitakin kuin luokkia). Komponenttipohjainen ohjelmistotekniikka (Markku Sakkinen) – Osa 12 18. 4. 2010 3

4 Yhteyspohjainen ohjelmointi – edistyneitä käsitteitä (jatkoa) Geneeristen tyyppien muodolliset geneeriset parametrit ympäröidään tavallisilla sulkeilla. Geneeristen metodien muodolliset geneeriset parametrit ympäröidään kulmasulkeilla; niiden todelliset geneeriset parametrit ovat aina implisiittisiä (päätellään tavallisten parametrien tyypeistä). Jokin viestityyppi ja sen vastaanottajan (nielun) tyyppi voitaisiin määritellä seuraavasti: TYPE MyMessage = EXTENSIBLE RECORD (* kentät *) END; MySink = POINTER TO RECORD (MessageGroups.Sink (MyMessage))... END; Tässä EXTENSIBLE tarkoittaa, että tyyppiä voidaan käyttää ylityyppinä periytymisessä – oletus konkreetille tietuetyypille vastaa sitä, että Javassa luokalla on määre final. Jälkimmäisellä määrittelyllä tarkoitetaan ilmeisesti Sink in osoittaman tietuetyypin perimistä, vaikka syntaksista päättelisi mieluummin vähän muuta. Olkoon joukkoja esittävä geneerinen tyyppi (luokka) esitelty seuraavalla tavalla: Komponenttipohjainen ohjelmistotekniikka (Markku Sakkinen) – Osa 12 18. 4. 2010 4

5 Yhteyspohjainen ohjelmointi – edistyneitä käsitteitä (jatkoa) DEFINITION Sets; TYPE Set (A) = POINTER TO LIMITED RECORD (s: Set(A)) Include (elem: POINTER TO A); (s: Set(A)) Exclude (elem: POINTER TO A); (s: Set(A)) Contains (elem: POINTER TO A): BOOLEAN; (s: Set(A)) Size (): INTEGER END; Op (A, B) = PROCEDURE (elem: POINTER TO A; VAR arg: B); PROCEDURE New (): Set(A); PROCEDURE Do (s: Set(A); op: Op (A, B); VAR arg: B); (* other definitions omitted *) END Sets. Tässä on huomattava, että Op ei ole metodi vaan geneerinen metodityyppi. Geneerisen metodin Do toisena tavallisena parametrinä on metodi. Määre LIMITED tarkoittaa, että ao. tyypin ilmentymiä voidaan luoda vain moduulissa, joka toteuttaa nämä määritelmät. Komponenttipohjainen ohjelmistotekniikka (Markku Sakkinen) – Osa 12 19. 4. 2010 5

6 Yhteyspohjainen ohjelmointi – edistyneitä käsitteitä (jatkoa) Seuraava moduuli toteuttaa joukkotyypin avulla geneerisen yleislähetyskanavan tyypin. Tästä luotava kanava siis välittää kaikki saamansa viestit siihen liittyneille vastaanottajille sellaisinaan. Kirjan esimerkissä metodiin SendOne on lipsahtanut virhe. MODULE Broadcast; IMPORT Sets, MessageGroups; TYPE BCaster (A) = POINTER TO RECORD (MessageGroups.Group(A)) sinks: Sets.Set (MessageGroups.Sink(A)) END; PROCEDURE SendOne (s:MessageGroups.Sink(A); VAR message: A); (* auxiliary for Send *) BEGIN s.Receive (message) END SendOne; PROCEDURE (g: BCaster(A)) Register (s:MessageGroups.Sink(A)); BEGIN g.sinks.Include (s) END Register; ; Komponenttipohjainen ohjelmistotekniikka (Markku Sakkinen) – Osa 12 19. 4. 2010 6

7 Yhteyspohjainen ohjelmointi – edistyneitä käsitteitä (jatkoa) PROCEDURE (g: BCaster(A)) Unregister (s:MessageGroups.Sink(A)); BEGIN g.sinks.Exclude (s) END Unregister PROCEDURE (g: BCaster(A)) Send (VAR message: A); BEGIN Sets.Do (g.sinks, SendOne, message) END Send; PROCEDURE New* (): MessageGroups.Group(A); (* simple factory *) VAR bc: BCaster (A); BEGIN NEW (bc); bc.sinks := Sets.New(); RETURN bc END New; END Broadcast. Tähti moduulin muuttujan, metodin tai muun aliohjelman nimessä ( New* ) tarkoittaa, että tämä on julkinen. Seuraavaksi kirjoitetaan testimoduuli, joka käyttää näin määriteltyä palvelua. Ensin näytetään tarvittavat osat sen käyttämien kirjastomoduulien määritelmistä. Komponenttipohjainen ohjelmistotekniikka (Markku Sakkinen) – Osa 12 19. 4. 2010 7

8 Yhteyspohjainen ohjelmointi – edistyneitä käsitteitä (jatkoa) DEFINITION Strings; TYPE String = POINTER TO ARRAY OF CHAR; PROCEDURE NewFrom (s: ARRAY OF CHAR): String; (* other definitions omitted *) END Strings; DEFINITION Out; PROCEDURE String (s: ARRAY OF CHAR); PROCEDURE Ln; (* other definitions omitted *) END Out; MODULE TestClient; IMPORT Strings, Out, MessageGroups, Broadcast; TYPE Message = RECORD famousWords: Strings.String END; Sink = POINTER TO RECORD (MessageGroups.Sink(Message)) name: Strings.String END; VAR sink1, sink2, sink3: Sink; group: MessageGroups.Group(Message) hello: Message; Komponenttipohjainen ohjelmistotekniikka (Markku Sakkinen) – Osa 12 19. 4. 2010 8

9 Yhteyspohjainen ohjelmointi – edistyneitä käsitteitä (jatkoa) PROCEDURE (s: Sink) Receive (IN m: Message); BEGIN Out.String ("sink" + s.name + " received message: “ + m.famousWords); Out.Ln END Receive; PROCEDURE NewSink (IN name: ARRAY OF CHAR): Sink; VAR s: Sink; BEGIN NEW (s); s.name := Strings.NewFrom (name); RETURN s END NewSink; BEGIN Out.String ("start of test"); Out.Ln; sink1 := NewSink ("ONE"); sink2 := NewSink ("TWO"); sink3 := NewSink ("THREE"); group := Broadcast.New (); group.Register (sink1); (* connect to group *) group.Register (sink2); group.Register (sink3); hello.famousWords := Strings.NewFrom ("Hello World!"); group.send (hello); (* static connection here: source sends to group *) Out.String ("end of test"); Out.ln END TestClient. Komponenttipohjainen ohjelmistotekniikka (Markku Sakkinen) – Osa 12 19. 4. 2010 9

10 Yhteyspohjainen ohjelmointi – edistyneitä käsitteitä (jatkoa) Kun tämä moduuli suoritetaan, saadaan seuraava tulostus: start of test sink ONE received message: Hello World! sink TWO received message: Hello World! sink THREE received message: Hello World! end of test Miten tämä toimisi hajautettuna? Oletetaan, että lähettäjiä (lähteitä), kanava ja vastaanottajia on eri koneissa. Kunkin lähettäjän koneessa tarvitaan tyyppiä MessageGroups.Group (Message) oleva tynkä (välitin), joka välittää Send -kutsut edelleen kanavalle. Kunkin vastaanottajan koneessa tarvitaan samaa tyyppiä oleva tynkä, joka välittää Register - ja Unregister -kutsut kanavalle. Tosin nämä kutsut voi tehdä joku muukin kuin vastaanottaja itse – näin tapahtuu testiohjelmassammekin. Kanavan koneessa luodaan tyyppiä MessageGroups.Sink (Message) oleva tynkä kullekin rekisteröitävälle vastaanottajalle. Komponenttipohjainen ohjelmistotekniikka (Markku Sakkinen) – Osa 12 19. 4. 2010 10


Lataa ppt "Komponenttipohjainen ohjelmistotekniikka (TJTSS56) Osa 12 Kevätlukukausi 2010 Jyväskylän yliopisto Tietojenkäsittelytieteiden laitos Markku Sakkinen."

Samankaltaiset esitykset


Iklan oleh Google