torstai 26. helmikuuta 2009

Luento 13 - Subsumptioperiaate

Mitä subsumptio tarkoittaa? Merriam-Websterin mukaan seuraavaa: "to include or place within something larger or more comprehensive : encompass as a subordinate or component element subsumed under the term color". Eli vapaasti tulkittuna kysymys on sisältymissuhteesta. Subsumption avulla voidaan oleellisesti määritellä hierarkioita.

Tästä havainnosta, sisältymisestä, on johdettu subsumptioperiaate, joka vapaasti ilmaistuna sanoo, että tyyppiä voidaan käyttää ylityyppinsä sijalla. Eli esimerkiksi väriin voidaan sijoittaa sen konkreettinen ilmentymä vihreä. Toisaalta pätee myös, että voidaan ottaa alityypin alityyppi, esimerkiksi vihreän sävy jade, ja sijoittaa se ylityyppiinsä väriin. Eli sääntö pätee siis yleisellä tasolla.

Subsumptio pitänee nähdä polymorfismin, eli suomeksi jotakuinkin "monimuotoisuuden", yläkäsitteenä. Tähän liittyen luennolla esiteltiin Cardellin ja Wegnerin esittämä polymorfismin kategorisointi. On huomattava, että polymorfismi ei ole ainoastaan oliokielten ominaisuus vaikka käsite tuleekin oliokielistä puhuttaessa esille usein.

Tämä ilmeni esimerkissä, jossa tarkasteltiin lambda-kieltä ja tietueita. Jotta tietueita voidaan käsitellä lambda-lausekkeiden avulla, kuten intuitio ehkä opastaisi, tulee kielen määrittelyyn tehdä pieniä muutoksia. Osoittautui, että tietuiden käsittelyä voidaan helpottaa nimenomaan yllä esitetyn subsumptiolauseen avulla. Tässä tapauksessa subsumptiota sovelletaan tietueen tasolla. Toisin sanoen tietueesta voidaan karsia lambda-lausekkeen kannalta turha osa pois subsumption nojalla.

Oliokielten ja perinnän tapauksessa subsumptiolla osoittautui olevan kaksi varsin mielenkiintoista ominaisuutta. Olkoon luokat A ja B. B on A:n perillinen. Lisäksi B ylikirjoittaa A:n toteuttaman metodin foo. Voi olla mielekästä, että B saa muuttaa metodin palautusarvon tai parametrien tyyppejä. Kysymys kuuluukin, kuinka tämän tulisi tapahtua.

Subsumptioperiaatteen avulla havaitaan, että palautusarvon tulee olla vähintään alkuperäinen tyyppi tai sen alityyppi. Eli kyseessä on kovarianssi.

Parametrien tapauksessa perivä luokka ei voi rajoittaa vanhempansa määrittelemää tyyppiä, koska tämä sotisi subsumptioperiaatetta vastaan. Tässä tapauksessa tuleekin päteä, että perivän luokan ylikirjoittamien metodien tyyppien tulee olla vähintään alkuperäisiä tyyppejä ja niiden ylityyppejä. Tätä kutsutaan myös kontravarianssiksi.

Eiffelissä parametrien tyyppi on kenties hieman yllättäen toteutettu kovarianssia noudattaen (tekivät ehkä saman intuitiivisen virheen kuin minä alun perin :) ). Tästä seuraa, että tyyppejä joudutaan tarkastelemaan dynaamisesti ohjelman ajonaikana, koska ei voida taata, että parametrin tyyppi on korkeintaan metodin alkuperäisen määritelmän tyyppi. Eiffelin DbC (Design by Contract) on määritelty myös kovarianssin mukaisesti, mikä sinänsä tuntuu loogiselta.

Luennolla mainittiin myös Top ja Bot(tom) tyypeistä, jotka edustavat kaikkien tyyppien ylintä ja alinta tyyppiä. Usein Topin voidaan ajatella olevan ohjelmointikielen ns. Object-luokka. Bot edustaa pohjaa ja sitä voidaan ajatella myös noreturn tyyppinä, joka lopulta terminoi ohjelman suorituksen.

1 kommentti:

  1. Subsumptioperiaatteen merkitys korostuu käsittääkseni staattisesti tyypitetyissä järjestelmissä. Mikäli periaatetta rikotaan, joudutaan tyyppejä tarkastelemaan ajonaikana dynaamisesti, mikä on vastoin vahvasti staattisesti tyypitetyn kielen perusajatusta.

    Bot-tyypin kautta tyyppijärjestelmää voisi ehkä lähteä rakentamaan "väärinpäin". Matalimman tason (lähinnä konkretiaa) tyypit johdettaisiin Botista. Tällöin periytymissuhde kääntyisi päälaelleen (vrt. exheritance). Tässä tapauksessa hierarkia voisi olla esim. seuraavantapainen (alhaalta ylös):
    Bot
    float, int, string
    ... (tähän sitten noiden sopivia ylityyppejä tarpeen mukaan)

    Mikäli kielessä sallitaan myös tavallinen perintä Bot ratkaisee subsumptioon ja parametrien tyyppeihin liittyvän ongelman (eli Javassa equals(Bot other) toimisi myös aliluokissa, koska Bot voidaan korvata aliluokan tyypillä itsellään!).

    VastaaPoista