2016 IX Olioiden välisistä yhteyksistä
Sisältö 1. Johdanto 2. Kytkentä 3. Koheesio 4. Näkyvyydestä 2
Johdanto n Ohjelmassa syntyy kytkentöjä olioiden välille Toivottuja ja epätoivottuja n Näkyvyys vaikuttaa olioiden välisiin suhteisiin Näkyvyyssäännöt vaikuttavat saatavuuteen n Riippuvuus olioiden välillä: olio ei voi järkevästi olla olemassa ilman toista oliota Aito kooste Aliluokka riippuu yleensä emoluokastaan n Riippuvuutta arvioidaan käsitteillä kytkentä ja koheesio Stevens 1974 3
Kytkentä n Riippuvuus eri luokkien ja eri luokkien olioiden välillä n Tavoite: minimoidaan kytkennät n Muodot huonoimmasta parhaimpaan 1. Kytkentä olion jäsenmuuttujiin 2. Globaalin tiedon käytöstä aiheutuva kytkentä 3. Ohjelman suorituspolusta aiheutuva kytkentä 4. Komponenttien välinen kytkentä 5. Parametrien aiheuttama kytkentä 6. Luokan ja sen aliluokan kytkentä 4
Kytkentä olion jäsenmuuttujiin n Jonkin luokan instanssi muokkaa suoraan toisen luokan jäsenmuuttujaa n Yleensä erittäin epätoivottua n Heikentää ohjelman ymmärrettävyyttä Hankala havaita, miten ja missä jäsenmuuttujien arvot muuttuvat n Altistaa ohjelmointivirheille 5
Globaalin tiedon käytöstä aiheutuva kytkentä n Kahden eri luokan oliot voivat kommunikoida globaalin muuttujan välityksellä n Epäilyttävää: heikentää koodin ymmärrettävyyttä, virhealtis n Javassa ei globaaleja muuttujia, voidaan tehdä luokka, jossa kaikkialle näkyviä muuttujia 6
Ohjelman suorituspolusta aiheutuva kytkentä n Luokan operaatiot tehtävä tietyssä järjestyksessä, mutta toinen luokka kontrolloi suoritusta n Esimerkki: Internet-yhteyden toteuttava luokka. Metodit yhteyden avaus, yhteys palvelimeen, pyyntö, yhteyden sulkeminen Asiakkaan kutsuttava tässä järjestyksessä n Yleensä huonohkoa suunnittelua, joskus välttämätön n Luokan itsensä kontrolloitava, ettei väärä suoritusjärjestys onnistu 7
Komponenttien välinen kytkentä n Luokan jäsenmuuttuja toisen luokan olio n Hyvin toteutettuna ei haitallinen n Osaolio ei saisi tietää isäntäoliosta mitään n Erittäin yleinen kytkennän muoto 8
Komponenttien välinen kytkentä public class Main { public static void main(string [] args ){ Matkailija eka = new Matkailija(); eka.aloitamatka(); class Matkailija { Auto a = new Auto(); void aloitamatka(){ a.liiku(); class Auto{ void liiku(){ System.out.println("Hur hur..."); 9
Komponenttinen välinen kytkentä public class Main { public static void main(string [] args ){ Matkailija eka = new Matkailija(); Polkupyora p1 = new Polkupyora(); eka.asetakulkuvaline( b1 ); eka.aloitamatka(); Auto a1 = new Auto(); eka.asetakulkuvaline(a1); System.out.println("Eiku..."); eka.aloitamatka(); 10
Komponenttine välinen kytkentä public class Matkailija { Kulkuvaline kv; public void asetakulkuvaline(kulkuvaline kv) { this.kv = kv; } } void aloitamatka() { v.liiku(); } 11
Komponenttien välinen kytkentä public interface Kulkuvaline { void liiku(); public class Auto implements Kulkuvaline { public void liiku() { System.out.println("Hur hur"); class Polkupyora implements Kulkuvaline { public void liiku() { System.out.println("Pyorailemaan..."); 12
Parametrien aiheuttama kytkentä Luokan ja aliluokan kytkentä n Parametrien aiheuttama kytkentä Luokasta kutsutaan toisen luokan metodia n Ei muita suhteita kuin metodien parametreista ja paluuarvoista aiheutuva Yleinen ja ongelmaton Luokan ja aliluokan kytkentä Syntyy luokan ja sen perivän luokan välille Aliluokan oliota voidaan yleensä käsitellä myös emoluokan oliona Olennaista olio-ohjelmoinnissa 13
Kytkentöjen vähentäminen n Yleensä tavoiteltavaa n Yksi nyrkkisääntö toteuttamiseksi: n Demeterin laki, vahva muoto: Olion metodissa on sallittua kutsua vain seuraavien olioiden metodeja 1. Olion itsensä ja metodin parametriolioiden 2. Olion jäsenmuuttujien 3. Globaalien muuttujien 4. Metodin paikallisten muuttujien Auttaa ymmärtämään ohjelman koodia, koska luokat kytkeytyvät toisiin yksinkertaisesti ja hyvin määritellysti 14
Koheesio n Luokan sisäiset riippuvuussuhteet n Yleensä toivottavaa: sitoo luokan jäsenet luokan tehtävän suorittamiseen n Muodot huonoimmasta parhaimpaan 1. Satunnainen koheesio 2. Looginen koheesio 3. Temporaalinen koheesio 4. Kommunikaatioon perustuva koheesio 5. Suoritusjärjestykseen perustuva koheesio 6. Funktionaalinen koheesio 7. Datakoheesio 15
Satunnainen koheesio n Syntyy valittaessa luokan jäsenet ilman eritystä syytä Yleensä jaettaessa laaja ohjelma osiin sattumanvaraisesti n Esiintyy, kun luokan metodeilla ei ole yhteyttä toisiinsa n Yleensä merkki puutteellisesta suunnittelusta 16
Looginen koheesio Temporaalinen koheesio n Looginen koheesio Luokan metodit ovat loogisesti yhteydessä n Ei muuta yhteyttä Esimerkiksi kirjastoluokka, joka sisältää loogisesti samantapaisia hyötyfunktioita n Javan luokka Collections (sisältää tietosäiliöalgoritmeja) n Temporaalinen koheesio Luokan metodeja käytetään samaan aikaan ohjelmassa n Esim. alustustoimenpiteet Yleensä parempi jakaa toisiin luokkiin 17
Kommunikaatioon perustuva koheesio, Suoritusjärjestykseen perustuva koheesio n Kommunikaatioon perustuva koheesio Luokan metodit käsittelevät samaa laitetta tai input/ output- dataa Luokka toimii kommunikaation kontrolliluokkana n Suoritusjärjestykseen perustuva koheesio Luokan metodit on aktivoitava tietyssä järjestyksessä Syntyy usein poistettaessa ohjelman suorituspolusta aiheutuvaa kytkentää 18
Funktionaalinen koheesio, Datakoheesio n Funktionaalinen koheesio Tavoiteltavaa Syntyy, kun kaikki luokan jäsenet ovat yhteydessä yhden tehtävän suoritukseen n Datakoheesio Luokan metodit liittyvät jäsenmuuttujien datan käsittelyyn ja luokan jäsenmuuttujat muodostavat jonkinlaisen struktuurin Yleistä esimerkiksi tietorakenteita toteuttavissa luokissa 19
Näkyvyydestä Näkyvyys Javassa n Javan näkyvyysmääreet private, protected, public, oletus Oletus, kun jätetään määre merkitsemättä n Luokan jäsenten näkyvyys ei muutu perinnässä n public-jäsenet näkyvät kaikkialle Luokan julkinen rajapinta n private-jäsenet eivät näy luokan ulkopuolelle Näkyvät luokan sisäisissä luokissa 20
Näkyvyys Javassa n Pakkaukset (package) Tapa muodostaa näkyvyysalueita Oletusnäkyvyydellä varustetut jäsenet näkyvät kaikkialla pakkauksen sisällä protected-jäsenet pakkauksessa ja luokan aliluokissa n Suositus: Käytä protected-määrettä näkyvyyteen aliluokissa ja oletusta näkyvyyteen pakkauksessa 21