Ohjelmistotuotanto, s

Samankaltaiset tiedostot
Oliosuunnittelu. Oliosuunnittelu

1. Käyttötapalähtöinen suunnittelu. Ohjelmistotuotanto. Käyttötapalähtöinen suunnittelu. Käyttötapalähtöinen suunnittelu

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

Ohjelmistotekniikan menetelmät, suunnittelumalleja

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

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

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Suunnittelumalleja, MVC. Juha Järvensivu 2008

5. Suunnittelumallit. TTY Ohjelmistotekniikka

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

5. Suunnittelumallit. TTY Ohjelmistotekniikka

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


Ohjelmistojen mallintaminen, suunnittelumalleja

Hirviö. Design Patterns

Ohjelmistoarkkitehtuurit kevät

SEPA - Design Patterns

Sisällys. Ratkaisumallien historia. Ratkaisumalli. Ratkaisumalli [2] Esimerkki: Composite [2] Esimerkki: Composite. Jaakko Vuolasto 25.1.

Olio-ohjelmointi Johdanto suunnittelumalleihin. 1. Yleistä

Ohjelmistojen mallinnus Ohjelmistoarkkitehtuuri Harri Laine 1

Interaktiivisten järjestelmien arkkitehtuuriratkaisu, jolla käyttöliittymä erotetaan sovelluslogiikasta.

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

OSAII: Käytännön rutiinit. Ohjelmiston suunnittelu

Ohjelmistojen mallintaminen, sekvenssikaaviot

Muusta kuin vesisioista

12. Kehysarkkitehtuurit

Helsingin yliopisto, Tietojenkäsittelytieteen laitos Ohjelmistotuotanto, kurssikoe , H. Laine Arvostelu

T Henkilökohtainen harjoitus: FASTAXON

Interaktiivisten järjestelmien arkkitehtuuriratkaisu, jolla käyttöliittymä erotetaan sovelluslogiikasta.

Ohjelmistojen mallintaminen Olioiden yhteistyö Harri Laine 1

Kertaus: yleistys-erikoistus ja perintä

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

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

SEPA REFAKTOROINTI Antti Ahvenlampi, 57408L Erik Hakala, 57509T

Hirviö. Design Patterns

Olio-ohjelmointi Suunnittelumallit Observer ja State. 1. Observer (Tarkkailija)

Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 1

Tenttikysymykset. + UML-kaavioiden mallintamistehtävät

Ohjelmistotuotanto, suunnittelu Syksy Suunnittelu. Suunnittelun tulos. Suunnitteluprosessin työvaiheet. Suunnitteluprosessi.

Graafinen käyttöliittymä, osa 1

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

6. Suunnittelu. Suunnittelun tulos

Osio 4: Graafinen käyttöliittymä

Ohjelmistoarkkitehtuurit. Syksy 2010

Hakemistojen sisällöt säilötään linkitetyille listalle.

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Suunnittelumallit (design patterns)

TIE Ohjelmistojen suunnittelu

812341A Olio-ohjelmointi, IX Olioiden välisistä yhteyksistä

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

Olio-ohjelmointi Suunnittelumallit Adapter ja Composite. 1. Adapter

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

Ohjelmoinnin peruskurssien laaja oppimäärä

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

2. Olio-ohjelmoinnin perusteita 2.1

Ohjelmistojen mallintaminen Luokkakaaviot Harri Laine 1

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Suunnittelun tulos. 6. Suunnittelu. Suunnitteluprosessin työvaiheet. Suunnitteluprosessi. 6.1 Arkkitehtuurisuunnittelu.

Osio 4: Graafinen käyttöliittymä

Tenttikysymykset. + UML- kaavioiden mallintamistehtävät

Käyttöliittymät II. Käyttöliittymät I Kertaus peruskurssilta. Keskeisin kälikurssilla opittu asia?

Kehyspohjainen ohjelmistokehitys

Ohjelmistoarkkitehtuurit. Kevät

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

Viestinvälitysarkkitehtuurit

Ohjelmistotekniikan menetelmät, UML

Viestinvälitysarkkitehtuurit Lähtökohta:

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys

TIE Samuel Lahtinen. Lyhyt UML-opas. UML -pikaesittely

Johdatus sovellussuunnitteluun, s99, osa3 Helsingin yliopisto;/tktl Harri Laine 1. Olioiden väliset yhteydet. Olioiden väliset yhteydet

Johdatus sovellussuunnitteluun, s99, osa3 Helsingin yliopisto;/tktl Harri Laine 1. Olioiden väliset yhteydet. Olioiden väliset yhteydet

Suunnittelumallit. OULUN YLIOPISTO Tietojenkäsittelytieteiden laitos Oliosuuntautunut analyysi ja -suunnittelu 27. joulukuuta 2003

Sokkelon sisältö säilötään linkitetyille listalle ja tekstitiedostoon. Työ tehdään itsenäisesti yhden hengen ryhmissä. Ideoita voi vaihtaa koodia ei.

Ylläpitodokumentti. Boa Open Access. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

Ohjelmistotuotanto. Luento

Ohjelmistojen mallintaminen viikon 4 laskareiden mallivastauksia

HELIA 1 (14) Outi Virkki Käyttöliittymät ja ohjlmiston suunnittelu

UML -mallinnus LUOKKAKAAVIO EERO NOUSIAINEN

Ratkaisumallien historia

A TIETORAKENTEET JA ALGORITMIT

SEPA päiväkirja. Aihe: Suunnittelumallit Tekijät: Tuukka Laakso ja Antti Kettunen

TIE Ohjelmistojen suunnittelu

5. HelloWorld-ohjelma 5.1

18. Abstraktit tietotyypit 18.1

Ratkaisumallien hyväksikäyttö ohjelmistotyökaluissa

T Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

Järjestelmäarkkitehtuuri (TK081702)

T Ohjelmistojen määrittely- ja suunnittelumenetelmät Harjoitustyöraportti TNT - Tarkistetaan Ne Tentit Arkkitehtuuri- ja suunnittelumalli

13/20: Kierrätys kannattaa koodaamisessakin

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

Linkitetystä listasta perittyä omaa listaa käytetään muun muassa viestiin liittyvien vastausten säilömiseen.

Ohjelmistoarkkitehtuurit kevät

Työ tehdään itsenäisesti yhden hengen ryhmissä. Ideoita voi vaihtaa koodia ei.

Suunnittelumallien käyttö ohjelmistosuunnittelussa

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

15. Ohjelmoinnin tekniikkaa 15.1

Yhteydelle voi antaa nimen kumpaankin suuntaan Sille ei tarvise antaa lainkaan nimeä Yhteysnimen asemasta tai lisäksi voidaan käyttää roolinimiä

Ohjelmoinnin peruskurssien laaja oppimäärä

2. Olio-ohjelmoinnin perusteita 2.1

UML - unified modeling language

Transkriptio:

Ohjelmistotuotanto Suunnittelu 3 Kuvion piirtotavan erottaminen omaksi piirtoalgoritmin toteuttavaksi olioksi on esimerkki (strategy) suunnittelutason ratkaisumallista, joka lisää joustavuutta ja muunnettavuutta järjestelmään. Esim UML-kaavioiden laatimisohjelma, jossa käyttäjä saisi määritellä omat kuvasymbolinsa voisi käyttää tätä ratkaisumallia (tai jotain vielä paremmin soveltuvaa) 1 Harri Laine 2 (patterns) ovat systemaattisia hyviksi havaittuja tapoja ratkaista tietty usein esiintyvä ongelma taitotiedon, kokemuksen dokumentti yleiskäyttöisiä ratkaisuperiaatteita sovellusaluekohtaisia ratkaisuperiaatteita ratkaisumalleja voi liittyä kehittämisprosesiin (process pattern) määrittelyvaiheen ongelmiin (analysis pattern) suunnitteluvaiheen ongelmiin (design pattern) ohjelmointitason ongelmiin (idiom) Harri Laine 3 Analyysimallit (analysis patterns) Kuinka jäsentäisi ongelman jotta saavutettaisiin joustavuutta/muunnettavuutta/.? Suunnittelumallit (design patterns) Kuinka ongelma olisi hyvä ratkaista, jotta saavutettaisiin joustavuutta / muunnettavuutta / ylläpidettävyyttä / tilansäästöä / toimivuutta / siirrettävyyttä Idiomit (idioms) Kuinka asia pitäisi ratkaista esim. Javalla Harri Laine 4 Parantelumallit (Anti-patterns) Normaalisti ratkaisumalleissa kuvataan ongelma ja esitetään siihen ratkasutapa Parantelumalleissa lähtötilanteena on se, että jotain on jo tehty tavalla, joka aiheuttaa ongelmia. Mallit esittävät ratkaisutavan, jolla päästään nykyistä parempaan ratkaisuun Ratkaisumalli esittää yleisen idean, jonka voi toteuttaa eri tavoin. Tunnetuin lähde: Gamma E., Helm R., Johnson R., Vlissides J.: Design Patterns - Elements of Reusable Object- Oriented Software, Addison-Wesley, 1995 esittelee 24 ohjelmista etsittyä mallia Seuraavaksi käydään läpi muutama esimerkki yllä mainitun lähteen ratkaisumalleista Harri Laine 5 Harri Laine 6 1

- Composite (kooste) - Composite (kooste) Tarkoitus: Idea kokonaisuuden ja sen osien käsitteleminen samalla tavalla. Esimerkki: piirto-ohjelmassa kuvio voi koostua hierarkkisesti pienemmistä osakuvioista ja halutaan piirtää kaikki kuvioelementit samalla tavoin. Client Leaf Component Operation () : abstract Add (Component) Remove (Component) GetChild (int) Composite children Operation( ) foreach c in children c.operation Operation () Add (Component) Remove (Component) GetChild (int) Harri Laine 7 Harri Laine 8 - Composite (kooste) Määritellään abstrakti luokka, jonka konkreettisina aliluokkina (siis sellaisina, joilla on ilmentymiä) ovat alkeisluokat ja kokoelmat. Palvelut määritellään abstraktin luokan tasolla. Palvelut jakautuvat kokoelman hallintapalveluihin ja varsinaisiin palveluihin. Kokoelman varsinaiset palvelut suoritetaan välittämällä pyyntö kokoelman osille. Esimerkiksi abstrakti luokka voisi olla kuvio ja sen aliluokat olisivat alkeiskuvio ja koottu_kuvio. Varsinainen palvelu olisi piirrä. Kootun kuvion piirrä-palvelu toteutetaan kutsumalla kunkin sen osan piirrä-palvelua. - Composite (kooste) Ratkaisun etuna on se, että asiakas pystyy käsittelemään myös koosteoliota missä tahansa yhteydessä, missä se käsittelee alkeisoliota. Haittana on se että kaikki koosteoliot ovat rakenteeltaan samanlaisia (ei eri tavoin käsiteltäviä osia) Harri Laine 9 Harri Laine 10 Tarkkailija (Observer) esittää tavan välittää olion tilan muuttuminen tästä riippuville olioille ilman, että olioiden välillä olisi kumpaankin suuntaan vahva kytkentä. Kaksi roolia kohde ja tarkkilija. Tarkkailija rekisteröityy tarkkailemaan kohdetta. Kohde tiedottaa muutoksesta kaikille rekisteröityneille tarkkailijoilleen. Saatuaan ilmoituksen tarkkailija selvittää kohteen tilan. Abstract Subject Observers[] Join() Detach() Notify() Concrete Subject State getstate() setstate() Heikko kytkentä forall Observers update() Observer update() Concr. Observer subject update() Harri Laine 11 Vahva kytkentä subject.getstate Harri Laine 12 2

Rekisteröityminen tarkkailija kohde kohde Join() setstate tarkkailija Notify * update getstate Harri Laine 13 Vahva kytkentä Harri Laine 14 Käyttötilanteita näkymä - kohde taulukon alkio - laskettu alkio cache - tiedosto Laskentataulukko: viewa A B C=A+B cella Nuolet osoittavat tarkkailtavaan viewb cellb viewc cellc Harri Laine 15 Harri Laine 16 Vaaroja: Tarkkailija saa useita ilmoituksia saman kohteen muutoksista - turhia päivityksiä esim. jos kohdeluokan erikoistamiseen ei ole varauduttu,malli voi aiheuttaa useita ilmoituksia kohde muutos uusikohde muutos do_it(); notify() super.muutos(); omat_hommat(); notify() Ilmoitetaan keskeneräisestä tilasta Komento (command) suunnittelumalli soveltuu tilanteisiin, joissa operaation käynnistämiseen on erilaisia vaihtoehtoja, mutta lopputuloksen pitäisi kuitenkin olla sama järjestelmään pitäisi pystyä helposti liittämään uusia operaatioita puuttumatta järjestelmän perusrakenteisiin operaatioita pitäisi pystyä perumaan ja uudelleensuorittamaan Suunnittelumallissa varsinainen toiminta eristetään toimintapyynnöstä muodostamalla pyynnöstä erillinen komento-olio Kaikilla komennoilla on yhteinen rajapinta, joka pitää sisällään vähintään suorita (do, execute) palvelun Harri Laine 17 Harri Laine 18 3

Komennon rajapintaan voi lisäksi kuulua peruutus (undo) toimiakseen peruutus saattaa edellyttää muutosta edeltäneen tilan kirjaamista komennon tietorakenteisiin esim. Kun teksti korvataan toisella on peruutusta varten taltioitava korvattu teksti, sen alkukohta ja korvaavan tekstin pituus uudelleensuoritus (redo) edellyttää myös tilatietojen tallennusta Komentojen suorituksen ohjausta voidaan hallitta erityisen komentokäsittelijän (command processor) avulla komentokäsittelijä ei ole aina välttämätön, mutta se on tarpeen esimerkiksi peruutusten yhteydessä komentokäsittelijä ottaa vastaan komentoja (addcommand) ja tallentaa ne tyypillisesti komentojonoksi done previous next To do add Harri Laine 19 Harri Laine 20 Peruskuvio 1: Kun aiheuttaja (client, controller) haluaa saada aikaan toiminnon, se luo komennon ja joko aktivoi luomansa komennon suorituksen tai luovuttaa sen komentokäsittelijälle aktivoitavaksi Peruskuvio 2: Aiheuttaja reagoi käyttäjän toimenpiteeseen aktivoimalla siihen ennalta kytketyn komennon suorituksen Client (esim. Pääohjelma) luo konkreettisen komennon (esim. OpenFile). Se kytketään jotenkin aiheuttajaan (esim. MenuVaihtoehto - mainmenu. additem( Open, new OpenFile()) Harri Laine 21 Harri Laine 22 controller command processor receiver create addcommand(d) execute() d: delete command getselection() deletetext undo() undo() appendtext( stored, position) Harri Laine 23 Harri Laine 24 4

Yleensä on järkevää mahdollistaa myös komennot, jotka kootaan alkeellisemmista komennoista Tällöin koottu komento (makro) on syytä toteuttaa kooste (composite) ratkaisumallin mukaisesti: command execute() part Komentoja on suhteellisen helppo lisätä määritellään uusi komentoluokka Sama toiminto on kytkettävissä eri käynnistystapoihin Suuren komentomäärän välttämiseksi komentoja kannattaa yleistää ja parametroida macrocommand execute() For each part {part.execute()} Harri Laine 25 Harri Laine 26 Vierailija (visitor) ratkaisumallli soveltuu käytettäväksi kun erilaiset liittymät ja rakenteet omaaville kohteille halutaan suorittaa toimenpiteitä, jotka riippuvat konkreettisista luokista (esim. koodin generointi, raportin tuottaminen, ) yhteenliittyvää operaatiokokonaisuutta ei haluta sirotella luokkiin (esim. koodin generointi) eri käyttötilanteisiin liittyvän tilannekohtaisen koodin mukanaolo luokissa ei edistä uuskäyttöä rakenne on staattinen mutta operaatiot dynaamisia (esim. erilaisia raportteja samasta datasta) Harri Laine 27 Ratkaisumallissa kootaan luokkakohtaiset palvelut vierailijan metodeiksi. Vierailijalla on kutakin luokkaa kohti on oma erityismetodinsa. Oliot rekisteröivät vierailijan ja suorittavat palvelunsa kutsumalla vierailijan luokkakohtaista metodia. Vierailijan vaihtaminen vaihtaa palvelun. Vierailijan abstraktissa määrittelyssä on otettava huomioon kaikki konkreettiset luokat, joissa vierailija voi käydä => rakenne on ylläpidon kannata hankala Harri Laine 28 client ObjectStructure AbstractElement accept(visitor) Visitor1 visita() visitb() AbstractVisitor visita() visitb() Visitor2 visita() visitb() objectstructure elementa elementb visitor1 accept(visitor1) visita(elementa) operationa accept(visitor1) visitb(elementb) operationb v.visita(this); ElementA ElementB v.visitb(this); accept(visitor v) accept(visitor v) Harri Laine 29 Harri Laine 30 5

Toiminnallisia kokonaisuuksia saa lisättyä laatimalla uuden konkreettisen vierailijan. Elementeissä voidaan aina varautua vierailijoihin. Vierailija erottaa toiminnan ja tietorakenteen Tiukka sidos vierailijasta vierailtavaan. Vierailtavan muutos aiheuttaa yleensä aina muutoksen myös vierailijaan Epäsuora ajonaikainen kytkentä käynnistyvään toimintaan normaalisti (C++, Java) olion luokka ja palvelun nimi määräävät toiminnon, vierailijaa käytettessä mukaan tulee lisäksi vierailija Olioiden luominen on oliomalleissa ongelmallinen asia olion toiminnallisuus määräytyy sille luontihetkellä annetun konkreettisen luokan perusteella konkreettiset luokat eivät ole tiedossa kirjastoa laadittaessa - miten siis kirjaston pitäisi huomioida luonti erityiset luontiluokat, joilla abstraktit luontipalvelut Harri Laine 31 Harri Laine 32 Client AbstractProductA Esimerkkejä: Abstract Factory olioiden luontiin liittyvä olioiden välisiä suhteita hyödyntävä malli Tarkoitus: malli esittää tavan luoda tietyn luokan jälkeläisluokkien ilmentymiä tuntematta näitä luokkia Esimerkki: yleiskäyttöinen käyttöliittymäkirjasto windows kontrolli käyttöliittymä kontrolli motifkontrolli kontrollit erilaisia eri ympäristöissä kirjaston pitäisi olla yleinen, miten voidaan yleisellä tasolla. luoda ilmentymiä ympäristökohtaisille luokille ConcreteProductA1 AbstractFactory CreateProductA (...) : abstract CreateProductB (...) : abstract ConcreteProductB1 ConcreteFactory1 Concrete factory2 CreateProductA( ) CreateProductA( ) CreateProductB( ) CreateProductB( ) ConcreteProductA2 AbstractProductB ConcreteProductB2 Harri Laine 33 Harri Laine 34 Client (siis hyödyntävä ohjelma) tuntee abstraktin tehtaan ja abstraktit tuotteet ja kutsuu näiden tarjoamia palveluja. Abstraktin tehtaan palvelukutsu ohjautuu konkreettisen tehtaan vastaavaan luontipalveluun, joka siis luo ilmentymän kyseisen tyyppiselle tuotteelle esim windows-kontrollitehtaan luonappi-palvelu luo ilmentymän winnappi-luokkaan. Client KontrolliTehdas LuoNappi (...) : abstract LuoLiuku (...) : abstract winnappi winliuku Nappi motifnappi Liuku motifliuku KontrolliTehdasWin LuoNappi( ) LuoLiuku( ) KontrolliTehdasMotif LuoNappi( ) LuoLiuku( ) Harri Laine 35 Harri Laine 36 6

Mallilla eristetään konkreettiset tehtaat asiakkaasta Tuoteperhe voidaan helposti vaihtaa toiseksi Asiakkaan on tunnettava tuotetyypit, joten uusia tuotetyyppejä ei voida lisätä pelkästään aliluokkia lisäämällä, vaan tällöin on muutettava asiakkaan koodia ja abstraktin tehtaan koodia esim. kilistimen lisäys käyttöliittymäkontrolleihin Harri Laine 37 7