Muutamia peruskäsitteitä Huom. 1: nämä peruskäsitteet eivät muodosta hyvin määriteltyä keskenään yhteensopivien käsitteiden joukkoa, vaan käsitteet ovat osittain päällekkäisiä ja eri yhteyksissä niillä saattaa olla hieman toisistaan poikkeavia tulkintoja. Huom. 2: tätä materiaalia ei löydy kirjasta mistään erityisestä kohdasta. Huom. 3: suurin osa käsitteistä on ainakin jossain määrin tuttuja otupk:lta. Attribuutit Metodit ja käyttäytyminen Vastuu Luokittelu, olioiden luonti ja tuhoaminen Assosiaatiot Koostaminen (agregointi) ja muodostuminen Interaktio, vuorovaikutus Periytyminen Kapselointi 1 Attribuutit, jäsenmuuttujat Attribuutit ovat asioita, jotka olio tietää Ympyrällä voi olla attribuutit x-koordinaatti koordinaatti, y- koordinaatti ja säde. Oliolla kirja voi olla attribuutit nimi, tekijät, kustantaja... Toteutetaan yleensä jäsenmuuttujilla (C++, Java) Jäsenmuuttujat t ovat siis tapa implementoida id attribuutteja (ja yhteyksiä), eivät sama asia Y 2
Metodit, jäsenfunktiot, rajapintafunktiot... ja käyttäytyminen Käyttäytyminen (behaviour) ~mitä olio osaa tehdä ympyrä osaa piirtää itsensä ruudulle, poistaa itsensä ruudulta kirja osaa tulla lainatuksi Olio saadaan käyttäytymään halutulla tavalla kutsumalla sen julkisen rajapinnan funktioita Funktioita it kutsutaan t myös metodeiksi, i jäsenfunktioiksi, palveluiksi, toiminnoiksi Rajapintafunktion kutsua sanotaan toisinaan sanoman lähettämiseksi Y get, gety show, hide move 3 Vastuu Vastuut (responsibility) kuvaavat, mistä asioista olio on vastuullinen huolehtimaan (olioiden työnjako ) Ympyrän vastuulla on tietää sijaintinsa, itsensä näyttäminen ja hävittäminen kuvaruudulla, itsensä siirtäminen toiseen paikkaan Kirjan on tiedettävä kirjaan liittyvät nimiöintitiedot ja sen on osattava hoitaa lainaamiseen ja palauttamiseen liittyvät tehtävät. Oliosuunnittelussa on alkuvaiheessa kyse olioiden löytämisestä ja järjestelmän toiminnallisuuden jakamisesta olioiden vastuiksi. Tätä seuraa tarkempi rajapintojen määrittely ja interaktioiden suunnittelu. 4
Luokittelu sekä olioiden luonti ja poistaminen Samoin käyttäytyvät oliot luokitellaan samaan luokkaan (samat attribuutit ja metodit). uusia ympyröitä voidaan instantioida ympyräluokasta, ympyräolio on ympyräluokan instanssi Tyypillisessä työasema- tai palvelinsovelluksessa uusia olioita luodaan kaiken aikaa tarpeen mukaan: (esimerkiksi p = new circle()) joissain kielissä tuhoaminen on automaattista (javan roskienkeruu) joissain kielissä tuhoaminen on tehtävä eksplisiittisesti (esimerkiksi c++: delete p). Olioiden luonti ja tuhoaminen voi aiheuttaa merkittävää yleisrasitetta (hidasta), epädeterministisiä vastausaikoja reaaliaikaisiin tapahtumiin ja vaikeasti havaittavia ja jäljitettäviä virheitä. Perinteisiä toteutusvälineitä (esim. C) käytettäessä oliot ovat tavallisesti koodimoduuleja, eli siis staattisia ja aina olemassa. Kovissa reaaliaikajärjestelmissä oliot usein luodaan käynnistysvaiheessa ja ne säilyvät ikuisesti. 5 Assosiaatiot Assosiaatiot ovat olioiden välisiä yhteyksiä, joiden avulla oliosta pääsee navigoimaan toiseen olioon. Kirjaluokan instanssi C++ -kirja voi olla parhaillaan lainattuna lainaajaluokan instanssille "Ahto Simakuutio Assosiaatiot toteutetaan tavallisesti olioiden jäsenmuuttujina, eli samalla tavalla kuin attribuutitkin. book is borrowed by borrower 6
Koostaminen ja muodostaminen Koostaminen, muodostaminen (aggregation and composition) ovat assosiaation erikoistapauksia Koostamisessa olion komponenttina on toisia olioita neliö-olio voi koostua neljästä viiva-oliosta moniosainen kirja voi koostua monesta kirjasta Network Computer Muodoste (tai vahva kooste) on koosteen vahva muoto, jossa komponenttiolio ei (yleensä) voi olla olemassa ilman isäntäoliota Cat Tail 7 Vuorovaikutus, kommunikointi (interaction) Järjestelmän toiminnot toteutetaan järjestelmän olioiden välisinä interaktioina neliön piirtämiseen kuvaruudulle voivat osallistua oliot neliö, viiva ja grafiikkakirjasto: Asiakas pyytää neliötä piirtämään itsensä neliö pyytää kaikkia neljää viivaansa piirtämään itsensä jokainen viiva pyytää grafiikkakirjastoa piirtämään itsensä Jotta voisi pyytää olion palvelua, on tiedettävä, missä se on olion voi löytää assosiaation avulla navigoimalla olio (tai oikeammin viite siihen) voidaan välittää parametrina metodilla voi olla paikallisia väliaikaisia olioita olio voi olla globaali (esimerkiksi tietokantarajapinta) jos olion toteutus on koodimoduuli (esim. C-kielinen) kielinen), ongelmaa ei ole, koska olion sijainti on tiedossa jo ennen ohjelman suoritusta 8
Periytyminen Periytyminen (Inheritance) on luokkien välinen suhde luokka on toisen luokan erikoistapaus Luokat, Point, Rectangle, Line... voidaan periyttää yhteisestä kantaluokasta Shape Luokan Shape olioilla on kaikille kuvioille yhteiset attribuutit ja käyttäytyminen, esimerkiksi attribuutit ja Y sekä metodit get, gety ja move. Metodeille hide ja show voidaan antaa jonkinlainen i oletustoteutus (jos halutaan). Jälkeläisluokat perivät attribuutit ja käyttäytymisen (uudelleenkäyttö) Jälkeläisluokkiin voi lisätä attribuutteja (esimerkiksi for luokkaan ) perityn käyttäytymisen voi määritellä uudelleen (esimerkiksi show ja hide) Periytymisen käyttötavat Shape Abstraktioiden määrittely: luodaan yleisiä käsitteitä, jotka kattavat Y joukon luokkia (esimerkiksi circle, point... -> shape) rajapintojen määrittely (määritellään esimerkiksi yhteinen rajapinta kaikille Shape-oilioille) uudelleenkäyttö (luokan Shape jälkeläisluokat uudelleenkäyttävät sen koodin) get() gety() move()... resize() Point 9 Kapselointi (encapsulation) Suunnittelunäkökulmasta tärkein käsite on kapselointi eli kotelointi (eikä siis esimerkiksi periytyminen). Kapselointitavat tiedon esitystavan kapselointi (esimerkiksi ja Y grafiikkaesimerkissä) metodien toteutuksen kapselointi koostaminen eli agregointi: asiakasolioiden ei tarvitse tietää olion sisäistä rakennetta (esimerkiksi neliön asiakas ei tiedä mitään viiva-olioista) periytyminen: kantaluokan olioita käsittelevän koodin ei tarvitse tuntea lapsiluokan olioita esimerkiksi shape* T[50]; for (i=0; i<50, i++) T[i]->; Kapseloinnin i ideana on yksinkertaistaa abstraktioita niin, ettei ole pakko tietää tarpeettomia yksityiskohtia suojata vaatimusmuutoksilta: kapseloituihin asioihin kohdistuvat muutokset eivät säteile ympäristöön Kapselointi voidaan toteuttaa ohjelmointisopimuksilla (esimerkiksi C-kieltä käytettäessä) ohjelmointikielten rakenteilla (package, class), jakamalla ohjelma keskenään kommunikoiviin prosesseihin ja/tai komponenttiteknologioilla (COM+,.NET, J2EE). 10