TIE Ohjelmistojen suunnittelu

Samankaltaiset tiedostot
TIE Ohjelmistojen suunnittelu

TIE Ohjelmistojen suunnittelu. Viimeinen luento: kertaus

TIE Ohjelmistojen suunnittelu. Viimeinen luento: kertaus

TIE Ohjelmistojen suunnittelu

TIE Ohjelmistojen suunnittelu. Luento 8..9: moniperintä

TIE Ohjelmistojen suunnittelu

TIE Ohjelmistojen suunnittelu

TIE Ohjelmistojen suunnittelu

TIE Ohjelmistojen suunnittelu

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

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Huonon suunnittelun oireita. Hajuja ja sääntöjä. Hyvän suunnittelun periaatteet. Paha haju

Ohjelmistojen mallintaminen. Luento 11, 7.12.

Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 1

TIE Ohjelmistojen suunnittelu

Ohjelmistoarkkitehtuurit Komponentit Kevät 2014

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

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

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

Kehyspohjainen ohjelmistokehitys

TIE Ohjelmistojen suunnittelu

3. Komponentit ja rajapinnat

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

TT00AA Ohjelmoinnin jatko (TT10S1ECD)

JReleaser Yksikkötestaus ja JUnit. Mikko Mäkelä

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

TIE Ohjelmistojen suunnittelu

15. Ohjelmoinnin tekniikkaa 15.1

Liite 1: KualiKSB skenaariot ja PoC tulokset. 1. Palvelun kehittäjän näkökulma. KualiKSB. Sivu 1. Tilanne Vaatimus Ongelma jos vaatimus ei toteudu

Yksikkötestaus. import org.junit.test; public class LaskinTest public void testlaskimenluonti() { Laskin laskin = new Laskin(); } }

Ohjelmistojen mallintaminen, arkkitehtuuria ja rajapintoja

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

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

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

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

Ohjelmistotuotanto. Luento

Uudelleenkäytön jako kahteen

Testaus Korppi-kehityksessä. Panu Suominen THK / JYU

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

Kehyksillä toteuttettujen tuotelinjojen rakenteellinen optimointi

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

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

Tenttikysymykset. + UML-kaavioiden mallintamistehtävät

Test-Driven Development

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

Muutamia peruskäsitteitä

Ohjelmistoarkkitehtuurit kevät

C++11 Syntaksi. Jari-Pekka Voutilainen Jari-Pekka Voutilainen: C++11 Syntaksi

Komponentit ja rajapinnat

Tarjolla tänää: Ohjelmiston toteutuksesta. Kuinka tulla hyväksi ohjelmoijaksi? CRC-kortit. Testilähtöinen kehittäminen JOT2007. Uudelleenrakentaminen

Avoimen lähdekoodin kehitysmallit

Olio-ohjelmoinnissa luokat voidaan järjestää siten, että ne pystyvät jakamaan yhteisiä tietoja ja aliohjelmia.

Ohjelmistoarkkitehtuurit kevät

Ohjelmoinnin jatkokurssi, kurssikoe

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

812336A C++ -kielen perusteet,

Pakkauksen kokoaminen

Pong-peli, vaihe Koordinaatistosta. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 2/7. Tämän vaiheen aikana

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

Kertaus: yleistys-erikoistus ja perintä

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

812341A Olio-ohjelmointi, I Johdanto

Java kahdessa tunnissa. Jyry Suvilehto

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Ohjelmistoarkkitehtuurit Komponentit Kevät 2016

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Rajapinta (interface)

Tietokannat II -kurssin harjoitustyö

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

815338A Ohjelmointikielten periaatteet

Choose Finland-Helsinki Valitse Finland-Helsinki

Ohjelmointi 2 / 2010 Välikoe / 26.3

Ohjelmistotuotanto. Luento

TIE Ohjelmistojen suunnittelu

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

Lyhyt kertaus osoittimista

Pong-peli, vaihe Aliohjelman tekeminen. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 3/7. Tämän vaiheen aikana

C++11 lambdat: [](){} Matti Rintala

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Tehtävä 1. TL5302 Olio-ohjelmointi Koe Malliratkaisuja. Tässä sekä a)- että b)-kohdan toimiva ratkaisu:

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

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

Test-Driven Development

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi

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

Arkkitehtuuritietoisku. eli mitä aina olet halunnut tietää arkkitehtuureista, muttet ole uskaltanut kysyä

TIE Ohjelmistojen suunnittelu

Jypelin käyttöohjeet» Miten voin liittää törmäyksiin tapahtumia?

Laskennallisen fysiikan esimerkkejä avoimesta tutkimuksesta Esa Räsänen Fysiikan laitos, Tampereen teknillinen yliopisto

Security server v6 installation requirements

Ohjelmistojen suunnittelu

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

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

15. Ohjelmoinnin tekniikkaa 15.1

Pakkauksen kokoaminen

TIE Ohjelmistojen suunnittelu

Eclipse ja JUnit-ohjelmoijatestit

Testausdokumentti. Kivireki. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

Apuja ohjelmointiin» Yleisiä virheitä

Ohjelmistotuotanto. Luento

Transkriptio:

TIE-20200 Ohjelmistojen suunnittelu Luento 10: olioiden rakentelumalleja ja SOLID TIE-20200 Samuel Lahtinen 1

Ajankohtaista Harjoitustyössä välinäyttöjen ajanvaraus auki Viikkoharjoitukset ohi

Ohjelmassa tänään Kirjastoista ja plugineista kertausta SOLID, yleisiä olio-ohjelmoinnin suunnitteluperiaatteita

Ajoaikaiset kirjastot Mitä voidaan muuttaa ilman että kirjastoa käyttävää ohjelmaa tarvitsee päivittää? Toteutus: kunhan noudatetaan sopimussuunnittelun mukaisesti jälki- ja esiehtoja Rajapinta: Yleisohje, ei saa muuttaa Tarkemmin: Uusien ei-virtuaalisten funktioiden lisääminen mahdollista Vanhojen funktioiden muuttaminen, uusien virtuaalifunktioiden lisääminen myös kirjaston käyttäjät pitää kääntää uudelleen

Jaetut/dynaamiset kirjastot Ja asennukset Asennus tärkeää, minne kirjastokomponentit tulevat, että ohjelmat löytävät ne? vaihtoehtoja: Käyttöjärjestelmän hakemistoihin Ohjelman ajohakemiston alihakemistoon Erilliseen kirjastohakemistoon Mitä mukaan? C++, itse dll ja otsikkotiedostot, jos halutaan tukea muita kehittäjiä? Myös kehitystyökalun kirjastot Esim Qt:n kanssa http://doc.qt.io/qt-5/windows-deployment.html Yleensä asennusohjelma tarpeen/hyödyllinen

SOLID, hyviä periaatteita Viisi olio-ohjelmoinnin perusperiaatetta, muistisääntö S Single responsibility principle O Open/closed principle L Liskov substitution principle I Interface segregation principle D Dependency inversion principle Ei estä ketterää kehitystä tai muutakaan mukavaa, päin vastoin helpottaa näitä Muutokset, laajentaminen, päivittäminen helpompaa, voidaan toimia ketterästi ilman loppuun asti hiottua suunnitelmaa

Single responsibility principle Single responsibility principle (SRP) a class should have only a single responsibility. Vain yksi vastuualue/luokka Pohjautuu reason-to-change ajetelmaan, jokaisella luokalla pitäisi olla vain yksi huolehdittava asia, vain yksi syy, miksi luokan toteutusta pitäisi muuttaa. Jos luokalla kaksi tai useampi muutossyy, voi muutoksella yhden vastuualueen toimiin olla helposti vaikutusta toisen toimintaan (korjataan yhtä, rikotaan toinen) Uudelleenkäyttö ja eriyttäminen vaikeampaa, kun mukana tulee ylimääräistä kuormaa

Single responsibility principle, testaaminen jne. Testattavuus ja Single responsibility principle yksikkötestit jne. helpompi toteuttaa, kirjoittaa Virheiden löytäminen helpottuu, tiettyyn toimintoon liittyvät asiat samassa paikassa Virheiden korjaaminen helpompaa, vaikeampi hajottaa muuta toimivaa koodia

Single responsibility principle Saman luokan kaksi vastuuta (reason for change), muutos toiseen voi rikkoa toisen puolen toiminnallisuuden Vastuualueiden jako (esim. GUI-versio käyttää GeometrisenSuorakaiteen palveluita, laskentapuolella käytetään vain geom. osaa) Suorakaide +laskeala(): double +piirraruudulle() GUI Matemaattinen laskentaosuus GUIsovellus Vaarat: turha kompleksisuuden lisääminen, jos vastuualueet muuttuvat aina yhdessä, ei niiden eriyttämisestä ole iloa TIE-20200 Samuel Lahtinen Yleinen kompromissiratkaisu, tehdään erilliset rajapinnat, sama toteuttaja. Helpompi muuntaa ja korjata, jos tarve ilmenee.

Open-closed principle Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification You should be able to extend a classes behavior, without modifying it. Moduulit ja luokat: Ovat avoimia laajennuksille, toiminnallisuutta voidaan lisätä, rajapintaa laajentaa uusilla palveluilla Suljettu muutoksilta: moduulin tai luokan toteutusta ei saa muuttaa Koodi testattu, katselmoitu jne, sitä ei enää muuteta Kuulostaa ristiriitaiselta, ideana hyödyntää abstraktioita Voidaan käyttää hyväksi perintää, (abstrakteja) kantaluokkia Ohjelmat, joissa hyödynnetään open-closed periaatetta, muutetaan lisäämällä uutta koodia, ei muuttamalla olemassa olevaa Ei realistisesti mahdollista päästä tilanteeseen, jossa 100% koodista suljettuna muutoksilta pitää tehdä päätöksiä siitä, mihin panostetaan, missä ohjelman osissa tulee todennäköisimmin muutoksia? Abstraktiot, ja osan ohjelmakoodin sulkeminen.

Open-closed principle Vinkkejä noudattamisen helpottamiseen: Ei julkisia tai protected jäsenmuuttujia, ei globaaleja muuttujia Vältä: Olioiden omistaminen arvoina, arvoparametrien käyttö (C++) Viitteet, osoittimet, voidaan antaa käyttöön erikoistettu versio jne. Älä käytä dynamic_castiä tyyppitarkastusten tekemiseen, vain laajennettuun rajapintaan kiinni pääsemiseen (tai toteutetun rajapinnan toteuttamisen tarkastamiseen), esimerkki huonosta tavasta(taululle)

Liskov substitution principle Objects in a program should be replaceable with instances of their subtypes without altering the correctness of that program. Derived classes must be substitutable for their base classes Mikä tahansa aliluokan instanssi kelpaa kantaluokkaolion tilalle (ilman että ohjelman toiminta kärsii/muuttuu virheelliseksi) C++-maailmassa: mikä tahansa viitteen tai osoittimen luokkaan ottavan funktion on pystyttävä käyttämään mitä tahansa luokan aliluokkaa ilman että funktion toteutuksessa täytyy tietää todellinen tyyppi (taas vääränlaiset tyyppimuunnokset jne.) Toiminnalliset aliluokat: Toiminnallinen lisävaatimus pelkän syntaksivaatimuksen lisäksi (semantiikka), ei pelkkä syntaktinen yhteensopivuus (samat funktion protyypit jne.)

Liskov substitution principle, Rikkomisen seuraamuksia Otetaan esimerkkinä (taas) suorakaide ja siitä peritty neliö, vektori ja järjestetty vektori, perustietovarasto ja tilaoptimoiva tietovarasto Päästään takaisin is-a-suhteen merkitykseen Is-a-suhdetta ja Liskovin periaatetta ei pidä rikkoman koodirivejä säästääkseen tai pelkän käsitteellisen sukulaisuuden takia Sopimussuunnittelu ja Liskov: aliluokat eivät saa rikkoa kantaluokan sopimuksia Vain periaatetta noudattamalla on mahdollista kirjoittaa luokkia käyttävää koodia ja luottaa siihen, että uudet lisäykset (uudet luokat) eivät hajota olemassa olevan koodin toimintaa void testaa( Suorakaide& s ) { s.asetakorkeus( 6 ); s.asetaleveys( 3 ); assert( s.leveys()*s.korkeus() == 18 ); } class Suorakaide { public: virtual void asetakorkeus( int k ); virtual void asetaleveys( int l ); int leveys() const; int korkeus() const; private: int korkeus_; int leveys_; }; class Nelio: public Suorakaide { public: virtual void asetakorkeus( int k ); virtual void asetaleveys( int l ); };

Interface segregation principle many client-specific interfaces are better than one general-purpose interface. Make fine grained interfaces that are client specific Clients should not be forced to depend upon methods they do not use Rajapinnan käyttäjän ei pidä olla riippuussuhteessa palveluihin/funktioihin joita se ei tarvitse/käytä Jaetaan isommat rajapinnat pienemmiksi roolien mukaan, saadaan roolirajapintoja (role interfaces) Isompi ohjelma, jossa paljon keskinäisiä riippuvuuksia ja isoja möhkälerajapintoja pienikin muutos heijastuu joka puolelle muutoksen tekijä joutuu tonkimaan muutettavat asiat muun turhan sälän seasta yksittäiseen asiaan liittyvän toteutuksen vaihtaminen vaatii copy-pastea vanhoista koodeista Uusien ominaisuuksien lisääminen vaatii uuden asian lisäämisen lisäksi vanhan huomioimista

Interface segregation Anti-versio periaatteesta, yksi iso möhkäleluokka, joka tarjoaa lähes kaikki toiminnot. Vaikea hallita, päivittää, muuttaa, jos rinnakkaisuutta, saadaan suorituskykyongelmat mukaan Lihavat rajapinnat (fat interfaces), rajapintojen saastuminen (interface pollution)

Asiakas 1 Asiakas 2 palvelu Asiakas 3 Asiakas 1 Asiakas 2 Asiakas 3 Rajapinta 1 Rajapinta 2 Rajapinta 3 Palvelun toteutus

Interface segregation principle Rajapintojen saastuminen ja perintä: Ajastus, ovi, ajastettu ovi Tuote, Peli, CD, housut Käyttäjä (sisäänkirjautumisessa): aliluokat, vieras, normi, admin Mitä kantaluokkaan, mitä erillisiin rajapintoihin, mitä aliluokkiin?

Dependency inversion principle A) High-level modules should not depend on low-level modules. Both should depend on abstractions. B) Abstractions should not depend upon details. Details should depend upon abstractions. http://www.objectmentor.com/resources/articles/dip.pdf Riippuvuudet abstraktioihin, ei konkreettisiin toteutuksiin Huonon suunnittelun kriteeristöä: Ei siirrettävää koodia, ohjelman rakenne täynnä riippuvuuksia, komponentteja ei voi uudelleen käyttää tai siirtää näiden takia Jäykkyys, yksittäinen muutos vaikuttaa moneen muuhun osaan Hauraus, muutos yhteen osaan rikkoo asioita muualla

Korkea taso (sovelluslogiikan kannalta) Abstraktio(kerros) Rajapinnat Matalamman tason toteutus

Dependency inversion principle Korkeamman tason komponentit eivät saa olla riippuvaisia matalan tason toteutusyksityiskohdista, jotain ratkaisutapoja: Dependency injection Adapter-pattern, fasadit, sillat yms. Kerrosarkkitehtuurit Rajapinnat C++ ja toteutus- ja otsikkotiedoston erottaminen ei tarkoita toteutusriippuvuuden poistumista Periaate tärkeimpiä tapoja tehdä koodista: Muunneltavampaa, kestävämpää muutoksille (toteutusten muuttaminen ei hajota koko ohjelmaa) Ylläpidettävämpää Helpommin uudelleen käytettävää

Yhteenveto SOLID-periaatteet, samoja tavoitteita ja ideoita kuin muissakin kurssilla opituissa tekniikoissa. Esim. suunnittelumallit tarjoavat hyväksi havaittuja ratkaisuja näiden saavuttamiseen Lähdemateriaalia ja lisäluettavaa: http://www.objectmentor.com/resources/articles/principles_and_patterns.pdf http://www.codeproject.com/articles/703634/solid-architecture-principlesusing-simple-csharp http://www.codemag.com/article/1001061 http://lassala.net/2010/11/04/a-good-example-of-liskov-substitution-principle/ TIE-20200 Samuel Lahtinen 23