Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

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

Samankaltaiset esitykset


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

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

2 Luokkien koostamisesta olioiden koostamiseen Szyperski, 7.7 – 7.9 Toteutuksen (erityisesti metodien) perimisen keskeinen tavoite on koodin uudelleenkäyttö kopioimisen sijasta. Perintä ei ole ainoa mahdollisuus siihen. Sen sijaan, että luokka B perisi luokan A, jossa on hyödyllinen metodi M, B:n olio voisi kutsua A:n olion M-metodia. Tässä osassa tutkitaan, missä määrin perinnän mahdollisuuksia ja hyötyjä voidaan saada välttäen sen ongelmia. Sellainen tapaus, jossa M ei ollenkaan käytä nykyolionsa atribuutteja (suoraan eikä epäsuorasti) on triviaali. Riittää, että B:ssä on A-tyyppinen atribuutti. Muissa tapauksissa perintää vastaavan tilanteen aikaansaaminen vaatii jonkinlaista koostesuhdetta (aggregation, composition) luokkien A ja B välille. Perinnässä B-oliossa olisi myös kaikki A:n atribuutit (tai jopa A-aliolio). Ilman perintää B-olioon täytyy liittyä A-osaolio. Osaolioa sanotaan myös sisä- tai sisemmäksi olioksi (inner object) ja koosteolioa vastaavasti ulko- tai ulommaksi olioksi (outer object). Komponenttipohjainen ohjelmistotekniikka (Markku Sakkinen) – Osa 8 18. 3. 2010 2

3 Luokkien koostamisesta olioiden koostamiseen (jatkoa) Miten koostesuhde (olio P on olion O osa) eroaa assosiaatiosta (olio O sisältää viitteen olioon P)? Joissakin kielissä (esim. C++:ssa) P voi sisältyä fyysisesti O:hon. Jos O:ssa on vain P:n viite, puhutaan loogisesta koostamisesta. Seuraavat rajoitteet ovat fyysisessä koostamisessa automaattisia, mutta ainakin jokin niistä vaaditaan myös loogisessa koostamisessa: P luodaan ja tuhotaan aina O:n mukana. P:tä ei voida poistaa O:sta. P ei voi olla samalla minkään muun olion välitön osa. Kaksi ensimmäistä on aina voimassa myös alioliopohjaisessa periytymissuhteessa, mutta kolmas ei ole jakavassa haarautuvassa moniperinnässä. Szyperski: P on O:n osa, jos viitteitä siihen ei voi olla O:n ulkopuolella (O:n muutkin osaoliot ovat sisäpuolella). Juuri missään kielessä koostesuhdekaan ei aiheuta sitä, että myös P:ssä olisi viite O:hon. Sen sijaan periytymisessä itseviite (this, self) viittaa aina koko olioon, myös yliluokan metodia suoritettaessa. Komponenttipohjainen ohjelmistotekniikka (Markku Sakkinen) – Osa 8 18. 3. 2010 3

4 Luokkien koostamisesta olioiden koostamiseen (jatkoa) Jatkolähettämisellä (forwarding) tarkoitetaan sitä, että olio (O) välittää jonkin saamansa metodinkutsun edelleen toiselle oliolle (P) ja mahdollisen tuloksen sitten omalle kutsujalleen. Koostamisella ja jatkolähettämisellä saadaan jo suuri osa metodin toteutuksen perimisen eduista mutta ei sen haittoja. Jos osaolion luokassa metodia muutetaan, kaikki sitä hyödyntävät koosteluokat saavat muutetun metodin käyttöönsä. Oleellinen ero periytymiseen on siinä, että koostamisessa koosteella ja sen osilla ei ole yhteistä identiteettiä eikä siis yhteistä itseviitettä. Useimmissa kielissä osaolioiden viitteitä voi olla koosteolion ulkopuolellakin, ja silloin on vaikeaa tai mahdotonta todeta edes sitä, että ne ovat koosteen osia. Samanlaisia takaisinkutsuongelmia kuin periytymisessä ei synny. Koosteluokka on osaluokkien ominaisuuksien näkyvyydessä samassa asemassa kuin täysin vieraat luokat (ainakin melkein kaikissa kielissä). Komponenttipohjainen ohjelmistotekniikka (Markku Sakkinen) – Osa 8 18. 3. 2010 4

5 Luokkien koostamisesta olioiden koostamiseen (jatkoa) Koostamisessa ja jatkolähettämisessä on erikseen ohjelmoitava sellaisia asioita, jotka periytymisessä saadaan automaattisesti. Oletetaan, että aiemman esimerkin luokka Text olisi konkreetti, ja yritetään määritellä SimpleText luokka niin, että Text onkin sen osaluokka. showCaret -metodin määrittely tässä luokassa ei vaikuta mitään, koska metodia kutsutaan vain Text -luokan write -metodista eikä se puolestaan näe SimpleText -luokan metodeja. Haluttu vaikutus voidaan saada aikaan esim. lisäämällä sisemmän luokan write - metodiin parametri, jolla voidaan välittää ulomman olion viite. Tällöin metodinkutsua ei siis välitetä sellaisenaan eteenpäin. Olioiden välinen rekursio on siis konstruoitava. Tätä voidaan sanoa suunnitelluksi ja toteutettujen metodien perimistä suunnittelemattomaksi uudelleenkäytöksi. Koostamisen (ainakin loogisen) etuihin kuuluu suurempi dynaamisuus. Sisemmät oliot eivät välttämättä synny ja tuhoudu yhdessä ulomman olion kanssa. Tällaisia laajennuksia periytymiseenkin on kyllä ehdotettu. Komponenttipohjainen ohjelmistotekniikka (Markku Sakkinen) – Osa 8 18. 3. 2010 5

6 Luokkien koostamisesta olioiden koostamiseen (jatkoa) Delegoinnilla (delegation) saadaan koostamiseen mukaan melkein kaikki periytymisen hyödyt – mutta myös haitat. Ratkaiseva ero jatkolähettämiseen on se, että delegoituun kutsuun liittyy automaattisesti myös delegoivan olion itseviite ( this ). Sisäkkäisissä delegoinneissa säilyy sama this. Delegoitu kutsu vastaa dynaamisesti sidottua nykyolion oman metodin kutsua periytymisen yhteydessä. Periytymisen super -kutsua vasta uudelleenlähetys (resending). Kun sisemmän luokan olio saa metodinkutsun uudelleenlähetyksenä, delegointia ei tehdä vaan suoritetaan tämän luokan oma metodi. Delegointiin perustuvissa dynaamisissa kielissä delegointi tapahtuu automaattisesti, jos olion omassa luokassa ei ole kutsuttua metodia. Tätä varten jokaisessa oliossa on super -viite (joka voi kuitenkin olla nollaviite). Komponenttipohjainen ohjelmistotekniikka (Markku Sakkinen) – Osa 8 18. 3. 2010 6

7 Luokkien koostamisesta olioiden koostamiseen (jatkoa) Esimerkki: Oletetaan jälleen, että Text on konkreetti luokka, ja halutaan määritellä sitä hyödyntävä ulompi luokka NiceText, jossa kohdistin esitetään paremmalla tavalla. Tutkitaan kutsuketjua, kun NiceText -luokan olion nt metodia type suoritetaan. Luokassa on katsottu Text -luokan metodi kelpaavaksi, joten kutsu delegoidaan sisäoliolle t. Itseviite on siis nt. Tämä metodi kutsuu metodia setCaret delegoimalla, kutsu kohdistuu siis olioon nt. Luokan NiceText metodi ei toteuta toimintaa kokonaan itse, vaan kutsuu jossakin vaiheessa Text -luokan metodia. Tämän täytyy tapahtua uudelleenlähetyksenä oliolle t. Lopuksi t :n setCaret -metodista palataan nt :n setCaret -metodiin, siitä t :n type -metodiin, edelleen nt :n type -metodiin ja alkuperäiseen kutsujaan. Rekursio ja vapaakäyntisyys ei poikkea millään oleellisella tavalla periytymisvaihtoehdosta. Komponenttipohjainen ohjelmistotekniikka (Markku Sakkinen) – Osa 8 18. 3. 2010 7

8 Luokkien koostamisesta olioiden koostamiseen (jatkoa) Delegoinnin periaate on esitetty alun perin ns. prototyyppipohjaisten oliokielten yhteydessä (Henry Lieberman, OOPSLA’86). Luokkia ei ole, vaan olioita voidaan luoda määrittelemällä ne erikseen tai kopioimalla (kloonaamalla) entisistä olioista. Vanhin ja tunnetuin prototyyppipohjainen kieli on Self (David Ungar ja Randall Smith, OOPSLA’87). Ainakin Smalltalkissa metodinkutsujen dynaaminen sidonta tapahtuu itse asiassa luokkien välisenä delegointina (Lynn Stein, OOPSLA’87). Smalltalkissa myös luokat ja metaluokat ovat olioita. Delegointi on joka tapauksessa helpompi toteuttaa dynaamisesti tyypitetyissä kielissä. Useita päteviä delegointimekanismeja on myöhemmin toteutettu myös staattisesti tyypitettyjen kielten (varsinkin Javan) laajennoksina (esim. Günter Kniesel, ECOOP’99). Periytymisen ja delegoinnin välimuodot ja ”rauhanomainen rinnakkaiselo” ovat mahdollisia. Komponenttien välillä delegointi voi olla erityisen sopivaa, koska se on helpompi toteuttaa mustalaatikkoperiaatteella. Komponenttipohjainen ohjelmistotekniikka (Markku Sakkinen) – Osa 8 19. 3. 2010 8

9 Luokkien koostamisesta olioiden koostamiseen (jatkoa) Yksi esimerkki periytymisen laajentamisesta joustavammaksi ja dynaamisemmaksi luopumatta staattisesta tyypityksestä (Franz Hauck, OOPSLA’93) Artikkelissa on luonnosteltu oma kieli, joka muistuttaa esim. Eiffeliä ja C++:aa mutta sisältää uusia ominaisuuksia. Tyypit on erotettu luokista, ja periytyminen on vain tyyppien välistä (alityyppisuhde). Tyypissä määritellään sekä metodien kutsumuodot että atribuutit tyyppeineen (ero myöhempiin Javan rajapintoihin). Jokainen luokka toteuttaa yhden tyypin. T-tyyppinen muuttuja voi viitata minkä tahansa sellaisen luokan olioon, joka toteuttaa T:n tai jonkin sen alityypin. Olioiden välillä toimii delegointi. Jokaisessa tyypissä on määriteltävä myös olion itseviite eksplisiittisenä atribuuttina self. Itseviite asetetaan olioa luotaessa ja on sen jälkeen vakio. Se viittaa joko olioon itseensä (oletus) tai toiseen olioon, joka vastaa aliluokan osaolioa luokkapohjaisessa perinnässä. Komponenttipohjainen ohjelmistotekniikka (Markku Sakkinen) – Osa 8 19. 3. 2010 9

10 Luokkien koostamisesta olioiden koostamiseen (jatkoa) Olioiden välillä toimii delegointi. Itseviitteen tyypiksi voidaan määritellä olion (siis luokan) oman tyypin ylityyppi. Silloin sen kautta ei voida kutsua kaikkia metodeja. Avainsana here viittaa aina olioon itseensä. Sen käyttäminen metodin kutsussa tarkoittaa, että dynaamista sidontaa mahdollisen ”perivän” olion metodiin ei tapahdu. Jos luokkaa halutaan käyttää delegoinnissa, siinä pitää määritellä myös atribuutti super, jonka tyypin pitää olla self in tyypin ylityyppi. Moniperintää vastaava tilanne saadaan aikaan määrittelemällä useita super ia vastaavia atribuutteja. Delegaattiolio saa saman itseviitteen kuin sen ”perivä” olio. Siksi delegaattiolio täytyy luoda ”perivän” olion jälkeen. Oleellinen ero normaaliin periytymiseen on se, että saman luokan eri olioiden delegaatit voivat olla eri luokkien olioita, kunhan ne täyttävät tyyppivaatimuksen. Olisi mahdollista sallia myös delegaatin vaihtaminen. Komponenttipohjainen ohjelmistotekniikka (Markku Sakkinen) – Osa 8 19. 3. 2010 10


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

Samankaltaiset esitykset


Iklan oleh Google