Ohjelmistojen mallintaminen, suunnittelumalleja

Samankaltaiset tiedostot
Ohjelmistotekniikan menetelmät, suunnittelumalleja

Ohjelmistotekniikan menetelmät, arkkitehtuuria ja rajapintoja

Ohjelmistojen mallinnus Ohjelmistoarkkitehtuuri Harri Laine 1

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. IX Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton

Olio-ohjelmointi Johdanto suunnittelumalleihin. 1. Yleistä

Oliosuunnittelu. Oliosuunnittelu

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VII Suunnittelumallit Adapter ja Composite

T SEPA - päiväkirja: Design Patterns. ETL työkalu

Ohjelmistojen mallintaminen, arkkitehtuuria ja rajapintoja

Olio-ohjelmointi Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton. 1. Proxy (Edustaja)

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

T SEPA - päiväkirja: Design Patterns. ETL työkalu

T Henkilökohtainen harjoitus: FASTAXON

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat

Tenttikysymykset. + UML-kaavioiden mallintamistehtävät

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

Olio-ohjelmointi Javalla

Java kahdessa tunnissa. Jyry Suvilehto

Hirviö. Design Patterns

Ohjelmistojen mallintaminen, sekvenssikaaviot

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VIII Suunnittelumallit Observer ja State

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Tenttikysymykset. + UML- kaavioiden mallintamistehtävät

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

15. Ohjelmoinnin tekniikkaa 15.1

Mikä yhteyssuhde on?

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

12. Kehysarkkitehtuurit

15. Ohjelmoinnin tekniikkaa 15.1

9. Periytyminen Javassa 9.1

UML ja luokkien väliset suhteet

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

Rajapinta (interface)

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

9. Periytyminen Javassa 9.1

Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi.

Olio-ohjelmointi Syntaksikokoelma

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

12. Monimuotoisuus 12.1

Ohjelmistotuotanto, s

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

Kehyspohjainen ohjelmistokehitys

Sunnittelumallit Harjoitustehtävät syksy 2015 / Simo Silander

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Ohjelmointi 2 / 2010 Välikoe / 26.3

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VI Johdanto suunnittelumalleihin

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

Hirviö. Design Patterns

14. Poikkeukset 14.1

Ohjelmistojen suunnittelu

Periytyminen (inheritance)

Javan perusteita. Janne Käki

Sisällys. JAVA-OHJELMOINTI Osa 6: Periytyminen ja näkyvyys. Luokkahierarkia. Periytyminen (inheritance)

Ohjelmistojen mallintaminen, arkkitehtuuria ja rajapintoja

Suunnittelumalleja, MVC. Juha Järvensivu 2008

Suunnittelumallien käyttö ohjelmistosuunnittelussa

Kertaus: yleistys-erikoistus ja perintä

Ohjelmistotuotanto. Luento

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Muutamia peruskäsitteitä

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Pakkaukset ja määreet

Olio-ohjelmointi Suunnittelumallit Adapter ja Composite. 1. Adapter

Ohjelmistojen mallintaminen Olioiden yhteistyö Harri Laine 1

UML -mallinnus LUOKKAKAAVIO EERO NOUSIAINEN

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 1

5. Suunnittelumallit. TTY Ohjelmistotekniikka

public static void main (String [] args)

Metodien tekeminen Javalla

1 Tehtävän kuvaus ja analysointi

12. Monimuotoisuus 12.1

Sisältö. 2. Taulukot. Yleistä. Yleistä

14. Poikkeukset 14.1

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 1

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

Listarakenne (ArrayList-luokka)

Aalto Yliopisto T Informaatioverkostot: Studio 1. Oliot ja luokat Javaohjelmoinnissa

TIETORAKENTEET JA ALGORITMIT

Sisältö. 22. Taulukot. Yleistä. Yleistä

Ohjelmoinnin peruskurssien laaja oppimäärä

KOHDELUOKAN MÄÄRITTELY

A TIETORAKENTEET JA ALGORITMIT

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. II Johdanto olio-ohjelmointiin

KYMENLAAKSON AMMATTIKORKEAKOULU Tietotekniikka / Ohjelmistotekniikka. Esa Knaapi SUUNNITTELUMALLIT OHJELMOINNISSA.

Muusta kuin vesisioista

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

- Komposiittityypit - Object (Mukaanlukien funktiot) - Array. - Erikoisdatatyypit - null - undefined

Ohjelmoinnin peruskurssien laaja oppimäärä

4. Luokan testaus ja käyttö olion kautta 4.1

Delegaatit ja tapahtumakäsittelijät

TIE Ohjelmistojen suunnittelu

TIE Ohjelmistojen suunnittelu

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Ohjelmistoarkkitehtuurit. Syksy 2010

16. Javan omat luokat 16.1

Transkriptio:

582104 Ohjelmistojen mallintaminen, suunnittelumalleja 1

Suunnittelumallit (design patterns) Kuvaus sellaisesta luokkarakenteesta & olioiden vuorovaikutuksesta, joka ratkaisee tietyn yleisen ongelman tiettyjen reunaehtojen vallitessa Keskeinen lähde suunnittelumalleihin Gamma et al., Design Patterns Elements of Reusable Object-Oriented Software, Addison-Wesley, 1995 2

Ongelma kontekstissaan Gamma & al. dokumentoivat suunnittelumallinsa dokumentoidaan standardoidussa formaatissa: 1. Nimi 2. Ongelmakuvaus 3. Ratkaisu 4. Seuraukset Mallit ovat sidottuja johonkin ympäristöön Ei-olioympäristössä voisivat oliomaaliman peruskäsitteet perintä, kapselointi ja polymorfismi olla omia suunnittelumallejaan 3

Mallien luokittelu Gamma et al. jaoittelevat mallinsa kolmeen pääkategoriaan 1. Olioiden luontimallit (creational) 2. Olioiden käyttäytymismallit (behavioral) 3. Luokkien rakenteelliset mallit (structural) Mallien tunteminen ja käyttäminen helpottaa kommunikaatiota suunnittelijoiden välillä Yhteinen sanasto Ohjelmakoodia korkeampi abstraktion taso 4

Luokkien ilmentymien luonti Kuka kutsuu luokan konstruktoria uuden ilmentymän luomiseksi? Koska ilmentymiä pitäisi luoda? jotkut oliot luodaan ohjelman käynnistyessä main- tai alustusoperaatiossa monet oliot luodaan dynaamisesti suoritusaikana, mutta niiden luoja on tiedossa staattisesti (käännösaikana) joissain tapauksissa olion luoja määräytyy dynaamisesti vasta suoritusaikana 5

Luontimalli new() Yksinkertaisin, ja kaikkien monimutkaisempien luontimallien hyödyntämä olion luontitapa on käyttää kielen new-avainsanaa: new Kirahvi(); new-avainsanaa käyttäessä kiinnitetään se konkreettinen luokka, josta olio halutaan instantioida Tämä vaikeuttaa geneeristen, uudelleenkäytettävien ohjelmien tekemistä Luontimalleja: abstrakti tehdas, rakentaja, tehdasmetodi, prototyyppi, ainokainen 6

Luontimalli tehdasmetodi (factory method) Määritellään luokkaan metodi, jonka tehtävä on luoda halutunlaisia olioita. Merkitys 1 (puhtaampi oliotapa) Aliluokka kiinnittää luotavan olion tyypin syrjäyttämällä yliluokan metodin Merkitys 2 (yleisempi) Metodi jollain keinoin päättää, minkä luokan olio instantioidaan 7

Esimerkki tehdasmetodista public static Frequency getfrequency(double d) { Frequency f; if(testing) { f = new MockFrequency(d); else { f = new ObservableFrequency(d); return f; 8

Luontimalli abstrakti tehdas Erilaisten, yhteenkuuluvien olioperheiden tuottamiseksi sopii luontimalli abstrakti tehdas Abstrakti rajapinta yhteenkuuluvien olioiden luomiseksi kiinnittämättä niiden konkreettisia luokkia Mahdollistaa sovelluksen konfiguroimisen luomaan tietyn konkreettisten aliluokkien perheen ilmentymiä 9

Abstrakti tehdas UML:nä Client AbstractFactory createproducta() createproductb() ConcreteProductA1 AbstractProductA ConcreteProductA2 ConcreteFactory2 ConcreteFactory1 AbstractProductB createproducta() createproductb() createproducta() createproductb() ConcreteProductB1 ConcreteProductB2 10

Olioiden käyttäytymismallit Olioiden ajonaikaisen käyttäytymisen mallintaminen Käyttäytymismalleilla tyypillisesti pyritään parantamaan järjestelmän joustavuutta mahdollistamalla käyttäytymisen parametrointi ja/tai yksityiskohtien piilottaminen Malleja esim. vastuuketju, iteraattori, hiutale, operaatiorunko, vierailija,.. (Chain of responsibility, Iterator, Flyweight, Template method, Visitor).. 11

Tapahtumakäsittely Synkroninen kommunikointi aiheuttaa operaatioriippuvuuksia moduulien välille Asynkronisessa kommunikoinnissa palvelun käyttäjä on löyhemmin sidottu palvelun tarjoajaan Eräs asynkronisen kommunikoinnin muoto on tapahtumaperustainen kommunikointi voidaan toteuttaa esimerkiksi Observersuunnittelumallin avulla [Gamma et al., 1995] Javassa valmis tuki rajapinnalla java.util.observer ja kantaluokalla java.util.observable 12

Tapahtumankäsittelyn toteutus Tapahtuman lähettäjä (event originator, publisher) luo tyypillisesti tapahtumaolion (event object), joka kuvaa tapahtumaan liittyvää informaatiota (esim. ButtonEvent: mikä painike) Tapahtuman käsittelijät (event listener, observer, subscriber) ovat aiemmin ilmoittautuneet halukkaiksi tulemaan informoiduksi kyseisenlaisista tapahtumista tapahtumaolio välitetään niille kaikille käsiteltäväksi sopivasti Laajoissa järjestelmissä voi olla erillinen rekisteröijä (registrator object), jolle tapahtuman käsittelijät ilmoittautuvat ja joka huolehtii lähettäjien ja käsittelijöiden välisestä kättelystä 13

Tapahtumankäsittelyn aiheuttamat riippuvuudet Tapahtuman lähettäjä ei tiedä (eikä haluakaan tietää), kuinka käsittelijä tulee tapahtumaan reagoimaan lähettäjä riippuu käsittelijästä vain hyvin löyhästi käytännössä se yleensä tuntee vain joukon tietyn kuuntelijarajapinnan toteuttavia olioita Käsittelijän ja lähettäjän välinen kättely aiheuttaa vahvemman riippuvuuden jos käytetään erillistä rekisteröijäoliota, se riippuu sekä tapahtuman lähettäjästä että käsittelijästä jos käsittelijä rekisteröityy suoraan lähettäjälle, se riippuu lähettäjästä rajapintojen käytöllä voidaan löyhentää riippuvuuksia 14

PDialogEvent PDialog +adddialoglistener() -firedialogevent() +dook() Kuuntelijarajapinnan käyttäminen tapahtumankäsittelyssä «layer» presentation «uses» PWindow +init() IPDialogListener +processdialogevent() «layer» control ICPresenter +init() CActioner CInit «uses» +processdialogevent() public class PDialog { private CActioner IPDialogListener act; lst; private PDialogEvent evt; public class CActioner { public void adddialoglistener(ipdialoglistener adddialoglistener(cactioner a) { l) act { lst = = a; l; public void processdialogevent( private void firedialogevent() { PDialogEvent evt) { if (evt!= null) evt = new PDlgEvent(); // do something with evt if (act (lst!= null) lst.processdialogevent(evt); act.processdialogevent(evt); 15/26 public void dook() { firedialogevent(); 15

Iteraattori Iteraattorilla erotellaan oliokokoelman sisäinen rakenne ja kokoelman läpikäymisen logiikka toisistaan Käyttö hyvin yksinkertaista: List<Radio> radios = new ArrayList<Radio>();. for(radio r : radios) { print ( r ); Iterointirajapinnan tarjoaminen ns. asiakaspalvelua 16

Operaatiorunko (template method) Määritellään operaatiolle yleinen runko, yksityiskohdat vaihtelevat olioverkon konfiguraation mukaan 17

Operaatiorunko checkfrequency() protected boolean checkfrequency(int frequency) { int nextstep = 0; while(nextstep < 1000) { if(!checkfrequency(frequency, nextstep)) { return false; nextstep += 25; return true; checkfrequency(int, int) antaa variaatiopisteen operaatiorungolle 18

Vastuuketju (chain of responsibility) Erotetaan palvelupyynnön lähettäjä palvelun toteuttajasta antamalla useammalle oliolle mahdollisuus huolehtia palvelun toteutuksesta Toteuttaja delegoi palvelupyynnön ketjussa seuraavalle, jos se ei itse pysty toteuttamaan palvelua (kokonaan) Client Handler handlerequest() successor ConcreteHandler1 handlerequest() ConcreteHandler2 handlerequest() 19

Radiotarkistuksen vastuketju public boolean check() { for(radio radio : radios) { if(!radio.check()) { return false; return true; 20

Rakennemallit Rakennemallit käsittelevät tapoja järjestää luokka- ja oliorakenteita Esim. sovitin (adapter), hiutale (flyweight), edustaja (proxy), silta (bridge), rekursiokooste (composition), 21

Sovitin Olemassaolevaa luokkarakennetta uudelleenkäytettäessä rajapinnat eivät aina ole yhteensopivia Sovitin-mallilla rajapintojen väliin sijoitetaan.. sovitin 22

Hiutale (flyweight) Hiutale-mallilla yhdistetään samanlaisia tai samankaltaisia olioita muistin säästämiseksi Esim. tekstinkäsittelyjärjestelmässä jokainen yksittäinen kirjain Sivuvaikutuksena samankaltaiset oliot voivat myös toimia kommunikaatioyhteyksinä 23

Frequency-flyweight public static Frequency getfrequency(double d) { Frequency f = frequencycache.get(d); if(f == null) { f = new MockFrequency(d); frequencycache.put(d, f); return f; 24

Yhteenvetona Nyt läpikäytiin vain muutamia yleisesti esiintyviä suunnittelumalleja, hyvin yleisellä tasolla Mallien käyttö on monesti eri mallien koostamista ja yhteensovittamista Esim. Flyweight + Factory method 25