Analyysi


Olio-ohjelmointi Javalla

Olioparadigman määrittelyä

Olioperustainen ohjelmistokehittäminen on ohjelmiston koko elinkaaren mittainen systemaattinen prosessi, jossa ohjelmistot kuvataan joukkona olioita, jotka simuloivat järjestelmän kuvaamaa maailmaa. Mallinnusmenetelmänä nykyään usein UML, joka sisältää välineet kuvata olioperustaisen ohjelmistokehityksen vaiheita: analyysia (object oriented analysis), suunnittelua (object oriented design) ja toteutusta (object oriented programming).

Booch Spagettikoodista olio-ohjelmointiin
  • Spagetti - Dataa, ohjelmakoodia, hyppykäskyjä ja lippuja
  • Strukturoitu - Ohjelman toimintojen osittaminen. Huono ylläpidettävyys, globaalit tietorakenteet. (Pankkiesimerkki)
  • Modulaarisuus David Parnas (1972):
    • Tietorakenteet moduulien sisään ja käyttäjälle funktiorajapinta
    • Ei globaaleja muutujia
    • Moduulilla sisäinen tila, jota voidaan muuttaa vain rajapintojen avulla
    • Moduulien testaaminen ja toteuttaminen toisistaan riippumatta
    • Moduulit voivat käyttää toisien moduulien palveluita
  • Kapseloituja moduuleja alettiin kutsua olioiksi (Booch 1982)

Käsitteitä

Oliolähestymistapa (object oriented) tarkoittaa kehittämis- ja ohjelmointiparadigmaa, jonka mukaan todellisuus nähdään joukkona toisiinsa vuorovaikutuksessa olevia olioita.

Olio(object) on rajattavissa ja yksilöitävissä oleva asia tai käsite, joka on merkityksellinen käsillä olevan tarkastelun kannalta, ja joka kattaa sekä rakenteen että käyttäytymisen. Voidaan käyttää myös nimitystä olioilmentymä (object instance = olio on luokan ilmentymä).

Olio voi olla esimerkiksi:

  • Liiketoimintaolio (business object, application-domain object), joka vastaa liiketoiminnan käsitettä tai asiaa.
  • Käyttöliittymäolio (boundary object), joka on toteutettavan järjestelmän käyttäjärajapinnan tekninen komponentti.
  • Ohjausolio (control object), jonka vastuulla on ohjata ja koordinoida muiden olioiden toimintaa.

Olioluokka(class) kuvaa joukkoa, joka muodostuu rakenteeltaan ja käyttäytymiseltään samanlaisia olioita; eräänlainen "muotti".

Tehtävä 1: pohdi, millaiset reaalimaailman ilmiöt ovat miellettävissä olioiksi ja luokiksi.

Attribuutti (attribute) kuvaa luokkaan kuuluvien olioiden rakenteellista ominaisuutta. Esimerkiksi pituus, paino, nimi.

Attribuuttiarvo(attribute value) yksilöi ominaisuuden. Esimerkiksi 180, 75, "Pekka".

Operaatio (operation) on olion käyttäytymisen määrittelyä; voidaan ymmärtää määritykseksi palvelusta, jonka olio tarjoaa. Saman luokan olioilla on samat operaatiot.

laskePalkka();

Operaatioon voi liittyä parametreja (parameter):

muutaPalkka(uusiPalkka);

Metodi (method) on luokan olioihin sovitettu operaation toteutus. Toisin sanoen, olion operaatio = metodi. Metodeilla voi olla parametreja ja palautustyyppi (return value):


public double laskePalkka() {

    palkka=tunnit * tuntipalkka;
    return palkka;
}
                     

Viesti (signal) on olioiden kommunikaatiota ja se voidaan ymmärtää palvelupyynnöksi; viestin vastaanottaminen saa aikaan olion aktivoitumisen ja viestissä mainitun operaation  toteuttamisen. Viestin lähettäjä ei välttämättä tiedä täsmällisesti vastaanottavan olion luokkaa - suoritettava metodi määräytyy dynaamisen sidonnan (dynamic binding) mukaan.

Assosiaatio (association) on kahden tai useamman luokan välinen rakenteellinen suhde. Esim. Töissä-assosiaatio Työntekijän ja Osaston välillä.

Kardinaalisuus  (multiplicity) eli kuinka monta oliota kustakin olioluokasta osallistuu kerrallaan assosiaatioon.

Olion ja luokan eron ymmärtäminen:

Dog object and class Koira-luokka ja koiraolioita. Ensimmäinen merkkijono Itse tehty merkkijonoluokka (String) Toinen merkkijono Kaksi luokasta perittyjä merkkijono-olioita

Tehtävä 2: Toteuta luokkakaavio, jossa on yksi luokka sisältäen attribuutit ja operaatiot.

Tehtävä 3: Tee laatimastasti luokkakaaviosta oliokaavio.

Tehtävä 4: Lisää kaavioosi kaksi uutta luokkaa. Toteuta sen jälkeen luokkakaavion pohjalta oliokaavio

Olioparadigman perusperiaatteita

Abstrahoinnilla (abstracting) nostetaan esille ongelman kannalta relevantit piirteet ja jätetään huomiotta epärelevantit; tehdään tarkastelukohteen yksinkertaistamiseksi tiettyä tarkoitusta varten.

Identiteetin (identity) avulla oliot ovat yksikäsitteisesti tunnistettavissa muiden kuin ominaisuuksiensa avulla. Käsitettä on verrattu käsitteelliseen "kahvaan" (handle, UML), jonka avulla muut oliot voivat tunnistaa olion ja lähettää sille viestejä. Teknisesti esimerkiksi muistipaikan osoite, jossa olio sijaitsee.

Kapseloimalla (capseling) kootaan yhteen toisiinsa liittyvät asiat: olion rakenne ja käyttäytyminen. Yksityiskohtaiset piirteet oliosta salataan sellaisilta olioilta, joiden ei kuulu niitä tuntea. Määritetään olioile rajapinnat, joiden takana oleviin toteutuksen yksityiskohtiin (implementaatioon) ei muilla ole pääsyä.

Olioparadigmassa tieto kapseloidaan. Oliolähestymistavassa tieto kapseloidaan.

Periytymisellä (inheritance) tarkoitetaan sitä, että aliluokat perivät yliluokkansa ominaisuudet, jolloin aliluokkien olioilla on samantapainen rakenne ja käyttäytyminen kuin vastaavan yliluokan olioilla. Aliluokille voidaan määritellä lisäominaisuuksia.

Työntekijä määrittää operaation LaskePalkka, jonka aliluokat Tuntityöläinen ja Kuukausipalkkalainen toteuttavat eri tavoin (polymor]ismi). Dynaamisen sidonnan ansiosta suoritus ohjautuu ajonaikana oikeaa tyyppiä olevalle oliolle. Esim. laskettaessa kaikkien Työntekijöiden palkat käytetään Tuntityöläisen tai Kuukausipalkkalaisen metodeja olion konkreettisesta tyypistä riippuen, vaikka kutsujan kannalta tietorakenne sisältää vain Työntekijä-viitteitä.

Polymofrismi (polyfmorfism) eli monimuotoisuus  on periaate, jonka mukaan tietty operaatio voidaan toteuttaa eri tavoin  eri luokissa ja niiden olioissa riippuen luokan  yksityiskohtaisesta luonteesta tai rakenteesta.

Periytyminen Luo() –operaation toteuttamiseksi voidaan määritellä erilainen metodi Tiedoston, Kuvakeen ja Ikkunan yhteyteen tai laskePalkka() toteutetaan eri tavalla riippuen siitä, onko kysymyksessä kuukausi-, viikko- tai tuntipalkalla oleva Henkilö.

Alla sama esimerkki ohjelmakoodina:


public abstract class Tyontekija {
    public abstract Valuutta laskePalkka (aika);
}

public class Tuntityolainen extends Tyontekija {
    public Valuutta laskepalkka (aika) { return tunnit * tuntipalkka; }
}

public class Kuukausipalkkalainen extends Tyontekija {
    public Valuutta laskepalkka (aika) { return (tyopaivat-lomapaivat) * kuukausipalkka; }
}

Älä sekoita monimuotoisuutta moniperintään (multiple inheritance). Moniperinnässä aliluokalla on useampia yliluokkia, joilta se voi periä ominaisuuksia, esimerkiksi Asunto, Laiva -> Asuntolaiva. Huonosti käytettynä moniperintä johtaaluokkahierarkian rämettymiseen. Kaikissa oliokielissä, esimerkiksi Java ja Smalltalk, ei ole tämän vuoksi suoraa tukea moniperinnälle.

Viikkotehtävä 1: etsi olemassa oleva ohjelmisto, josta haluat tehtävän tehdä. Tunnista ohjelmistosta 5-10 luokkaa. Lisää luokille attribuutit ja operaatiot. Yhdistä luokat assosiaatioilla ja merkitse kaardinaalisuudet. Toteuta luokkakaavio käyttäen GenMyModel-ohjelmaa. Muodosta ohjelmalla raportti ja palauta se GitHubiin kurssin sivulle.

Toteuta luokkakaavion pohjalta oliokaavio tai ainakin muutamia olioita.

Teoria: mitä eroa on olioilla ja alkeistietotyypeillä?