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).
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:
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.
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
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ä.
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.
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ä?