Oliosuunnittelu Perinnän ja dynaamisen sidonnan hyödyntäminen Tarkastellaan ohjelmaa, jonka tehtävänä on tuottaa erilaisista kuvioista muodostuva kuvaesitys Ratkaisu 1: perinteinen malli - ei perintää Kuvio Tyyppi Piirrä if Tyyppi= ympyrä then piirrä_ympyrä(.) else if Tyyppi= suorakaide then piirrä_suorakaide(.) else. Oliosuunnittelu Perintää ja syrjäyttämistä hyödyntävä Kuvio Piirrä: abstract Ympyrä Piirrä Suorakaide Piirrä Uusimuoto Piirrä piirrä_ympyrä piirrä_suorakaide uusitapa Harri Laine 1/12
Suunnittelumallit (Design Patterns) Suunnittelumalli on systemaattinen tapa ratkaista tietty usein esiintyvä ongelma taitotiedon, suunnittelukokemuksen dokumentti yleiskäyttöisiä ratkaisumalleja sovellusaluekohtaisia ratkaisumalleja Malli on suunnittelutason kuvaus ratkaisusta, sen voi toteuttaa eri ohjelmointikielillä tietylle kielelle voidaan tarjota valmiita kirjastoluokkia jonkin suunnittelumallin hyödyntämiseen Suunnittelumallit (Design Patterns) Tyypillisesti suunnittelumallista esitetään: tarkoitus eli ratkaistava ongelma sovelluskohteet rakenne, mistä komponenteista malli muodostuu ja miten komponentit liittyvät toisiinsa mallin edut ja haitat sovellimerkkejä toteutusvaihtoehtoja (koodirunkoja) Harri Laine 2/12
Suunnittelumallit (Design Patterns) suunnittelumalli voidaan kehittää ideoimalla - puhtaalta pöydältä etsimällä olemassaolevista ohjelmista periaate: tulisi löytää toimivia, hyväksihavaittuja ratkaisuja Gamma E., Helm R., Johnson R., Vlissides J.: Design Patterns - Elements of Reusable Object- Oriented Software, Addison-Wesley, 1995 esittelee 24 ohjelmista etsittyä mallia Suunnittelumallit (Design Patterns) Gamma et al. luokittelu: Laajuus (scope) luokkien väliset (staattiset) suhteet olioiden väliset (dynaamiset) suhteet Tarkoitus (purpose) olioiden luonti luokka-/oliorakenteet olioiden yhteistyö Harri Laine 3/12
Suunnittelumallit (Design Patterns) 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 Suunnittelumalli Abstract Factory Client AbstractProductA ConcreteProductA1 ConcreteProductA2 AbstractFactory CreateProductA (...) : abstract CreateProductB (...) : abstract AbstractProductB ConcreteProductB1 ConcreteProductB2 ConcreteFactory1 CreateProductA( ) CreateProductB( ) Concrete factory2 CreateProductA( ) CreateProductB( ) Harri Laine 4/12
Suunnittelumalli Abstract Factory 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. Abstract Factory sovelle Client Nappi winnappi motifnappi KontrolliTehdas LuoNappi (...) : abstract LuoLiuku (...) : abstract Liuku winliuku motifliuku KontrolliTehdasWin LuoNappi( ) LuoLiuku( ) KontrolliTehdasMotif LuoNappi( ) LuoLiuku( ) Harri Laine 5/12
Suunnittelumalli Abstract Factory 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 Composite (Kooste) Esimerkiksi Suunnittelumalli Composite (Kooste) on luokka-/oliorakenteisiin liittyvä olioiden välisiä suhteita hyödyntävä malli. Tarkoitus: Malli esittää tavan kokonaisuuden ja sen osien käsittelemiseen samalla tavalla. Esimerkki: piirto-ohjelmassa kuvio voi koostua hierarkkisesti pienemmistä osakuvioista ja halutaan piirtää kaikki kuvioelementit samalla tavoin. Harri Laine 6/12
Composite (Kooste) malli Component Client Operation () : abstract Add (Component) Remove (Component) GetChild (int) children Leaf Operation( ) foreach c in children c.operation Composite Operation () Add (Component) Remove (Component) GetChild (int) Composite (Kooste) Määritellään abstrakti luokka komponentti, jonka konkreettisina aliluokkina (siis sellaisina, joilla on ilmentymiä) ovat alkeisluokat ja kokoelmat Esimerkiksi abstrakti luokka voisi olla kuvio ja sen aliluokat olisivat alkeiskuvio ja koottu kuvio. 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. Harri Laine 7/12
Composite (Kooste) sovelle Kuvio Client Piirrä () : abstract Add (Component) Remove (Component) GetChild (int) children Alkeiskuvio Piirrä( ) Ympyrä Piirrä( ) foreach c in children c.piirrä; Koottukuvio Piirrä () Add (Component) Remove (Component) GetChild (int) Strategy Strategia (strategy) on esimerkki olioiden vuorovaikutukseen perustuvasta oliotason suunnittelumallista. Tarkoitus: mahdollistaa sovellettavan algoritmin vaihtaminen ja uusien lisääminen. Esimerkki: CASE-väline lukee tietokannan SQLlauseet ja tuottaa näiden perusteella kannan rakenteen näyttävän kuvaesityksen. Kuvasymbolien sijoitteluun tarvittavan sijoittelualgoritmin pitäisi olla vaihdettavissa. Harri Laine 8/12
Strategy malli Context ContextInterface( ) Strategy Algorithm( ) ConcreteStrategyA Algorithm( ) ConcreteStrategyB Algorithm( ) ConcreteStrategyC Algorithm( ) Strategy sovelle Network AddLayout( ) SelectLayout( ) UseLayout( ) Layout dolayout( ) getname( ) CGD dolayout( ) getname( ) Spring dolayout( ) getname( ) Stt dolayout( ) getname( ) getname() {return 'CGD'}; Harri Laine 9/12
Sovelluskehykset (application frameworks) Sovelluskehyksellä tarkoitetaan uudelleenkäytettäväksi tarkoitettua kokoelmaa yhdessä toimivia yleensä abstrakteja luokkia, jotka tarjoavat perusrakenteen ja -toiminnallisuuden tietyn tyyppiselle sovellukselle käyttöliittymäkehykset yleiset sovelluskehykset (MacApp, Borland OWL, ) sovellusaluekohtaiset kehykset, Sovelluskehykset (application frameworks) Sovelluskehys tarjoaa rungon, johon esim. perintää jä syrjäyttämistä hyväksikäyttäen voidaan liittää sovelluskohtaista toiminnallisuutta. Runkoluokat kutsuvat abstraktien luokkien operaatioita, jotka sitten konkreettisten jälkeläisluokkien oliot toteuttavat hollywood-periaate: don t call us we call you, kirjastosta kutsutaan sovelluskohtaisia rutiineja Harri Laine 10/12
Sovelluskehykset (application frameworks) kirjaston käyttö sovelluskehystä käytettäessä sovelluskehyskerros= kirjastokerros sovelluskerros Sovelluskehykset (application frameworks) normaali aliohjelmakirjaston käyttö sovellustoiminnot function aliohjelmakirjasto Harri Laine 11/12
Sovelluskehykset (application frameworks) Sovelluskehys toteuttaa joitain suunnittelumalleja ja tarjoaa niihin perustuvan yleisrakenteen Sovelluskehys voi tarjota myös joitakin tietylle sovellusalueelle (application domain) tyypillisiä erityispalveluja esim. CASE-kehys voisi tarjota valmiina kaavioikkunoiden hallinnan kaavioelementtien luonnin, poiston ja siirtelyn kaavioelementtien välisten yhteyksien käsittelyn kaavion paperitulostuksen kaavioelementin piirtäminen jäisi kuitenkin sovelluskohtaisen aliluokan tehtäväksi näkymä HYTKY/anycase kehykseen kaavioikkuna suunnitelma kaavio case-tool työkalu kaavioelementti... solmu yhteys luonti_tk siirto_tk tarkentuva solmukuva viiva Harri Laine 12/12