TIE Ohjelmistojen suunnittelu

Samankaltaiset tiedostot
TIE Ohjelmistojen suunnittelu

TIE Ohjelmistojen suunnittelu. Kopiointia ja sijoittelua

TIE Ohjelmistojen suunnittelu

TIE Ohjelmistojen suunnittelu. Kopiointia ja sijoittelua

Rajapinnat ja olioiden välittäminen

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

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

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

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

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

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

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

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

15. Ohjelmoinnin tekniikkaa 15.1

Osoitin ja viittaus C++:ssa

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

15. Ohjelmoinnin tekniikkaa 15.1

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

TIE Ohjelmistojen suunnittelu

Rajapinta (interface)

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Ohjelmoinnin jatkokurssi, kurssikoe

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

9. Periytyminen Javassa 9.1

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

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

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Javan perusteita. Janne Käki

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

Oliot viestivät metodeja kutsuen

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

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi

Kooste. Esim. Ympyrän keskipiste voidaan ajatella ympyrän osaksi.

Java kahdessa tunnissa. Jyry Suvilehto

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

9. Periytyminen Javassa 9.1

16. Javan omat luokat 16.1

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

Ohjelmoinnin peruskurssien laaja oppimäärä

1. Omat operaatiot 1.1

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

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

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

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

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

TIE Ohjelmistojen suunnittelu

Olio-ohjelmointi Javalla

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

4. Lausekielinen ohjelmointi 4.1

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

Ohjelmistojen mallintaminen, sekvenssikaaviot

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

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

Lyhyt kertaus osoittimista

Haaga-Helia/IltaTiko ict2tcd005: Ohjelmiston suunnittelutaito 1/7 Anne Benson. Tällä opintojaksolla käytämme VS:n kolmen kokonaisuuden luomiseen:

Tietueet. Tietueiden määrittely

8. Näppäimistöltä lukeminen 8.1

4. Olio-ohjelmoinista lyhyesti 4.1

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

TIE Ohjelmistojen suunnittelu

Virtuaalifunktiot ja polymorfismi

7. Oliot ja viitteet 7.1

TIE Ohjelmistojen suunnittelu

Graafisen käyttöliittymän ohjelmointi Syksy 2013

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

ELM GROUP 04. Teemu Laakso Henrik Talarmo

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

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

2. Olio-ohjelmoinista lyhyesti 2.1

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

.NET ajoympäristö. Juha Järvensivu 2007

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

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

11/20: Konepelti auki

BlueJ ohjelman pitäisi löytyä Development valikon alta mikroluokkien koneista. Muissa koneissa BlueJ voi löytyä esim. omana ikonina työpöydältä

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

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Dart. Ryhmä 38. Ville Tahvanainen. Juha Häkli

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

TIE Principles of Programming Languages CEYLON

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit

Ohjelmointi 2 / 2010 Välikoe / 26.3

Taulukot. Jukka Harju, Jukka Juslin

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2007

TIE Principles of Programming Languages. Seminaariesityksen essee. Ryhmä 18: Heidi Vulli, Joni Heikkilä

ITKP102 Ohjelmointi 1 (6 op)

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

12. Näppäimistöltä lukeminen 12.1

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

Metodien tekeminen Javalla

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

Suunnittelumalleja, MVC. Juha Järvensivu 2008

8. Näppäimistöltä lukeminen 8.1

TIE Ohjelmistojen suunnittelu

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Ohjelmistojen mallintaminen, mallintaminen ja UML

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

D-OHJELMOINTIKIELI. AA-kerho, 33. Antti Uusimäki. Arto Savolainen

Transkriptio:

TIE-20200 Ohjelmistojen suunnittelu Luento 7: kopiot, kloonaus, olioiden rakennuttaminen 1

Ajankohtaista Suunnittelusessioiden ajanvaraukset tyrkylle huomenna Viikkoharkkakertoja jäljellä vielä 3 kpl Viikkoharjoituksissa tarjolla rakennuttajaa/tehdasta

Ohjelmassa tänään Suunnittelusessioiden infoa, elinaikajuttuja, rakennuttajat, tehtaat, kopiointia

Suunnittelusessiot, vaatimuksia Yleisrakenne, tarkempi suunnitelma toteutettavasta pelistä. Miltä peli rakenne/suunnittelutasolla näyttäisi? Edellä mainitun dokumentointi kaavion/kaavioiden kera Mitä eri osakokonaisuuksia peliin tulee, mitkä ovat niiden vastuualueet? Miten käyttöliittymä ja muu ohjelma on erotettu toisistaan? Minkälaista työnjakoa olette ajatelleet? Mitä ominaisuuksia toimitatte seuraavaan sprinttiin mennessä?

Kaavioista Mieti aina mitä kaaviolla/kuvalla on tarkoitus kertoa Keskity olennaiseen, älä läiski kuvaan kaikkea mahdollista Esim. tavoitteena kertoa uusien komentojen lisääminen ja siihen liittyvät asiat keskity tähän & dokumentoi siihen liittyvät asiat huolella (ja jätä muut pois) Dokumentaatio, selitä kuva sanallisesti/tekstissä

Väreillä vai ilman? http://docs.oracle.com/cd/e12440_01/rpm/pdf/141/html/operations_guide/rpm-og-architectur e.htm 6

Värien käytön kunniamaininta? 7

Väreistä Uusi väri, samanlainen muoto uusi elementtityyppi Paljon erilaisia tyyppejä, hankalampi pysyä mukana Rumat värit ihmiset ei tykkää kaavion lukeminen haastavaa kun asiasisältöön keskittymisen sijaan katsojan mielessä onpas karseen näkönen, varmaan sisältökin sitä samaa

Kaavion/toteutuksen evaluointia Red: pattern style violation Green: recognized & follows rules Yellow: need manual review Black: 9

Entäs jos vähän parannan UML-syntaksia? 10

UML vs vapaamuotoisemmat kaaviot UML toimii, jos löytyy sopiva kaaviotyyppi Keskityt yhteen näkymään järjestelmästä Lukija tuntee UML-syntaksin Vapaamuotoisemmat kaaviot Kerro semantiikka Älä pillastu erilaisten värien ja muotojen käytössä Selitä kaaviot, katsoja ei välttämättä suoraan samalla aaltopituudella kanssasi

Koolla on väliä? Image source: https://tinmantex.wordpress.com/ 12

Koolla on väliä TIE-20200 Image Samuel source: Lahtinen http://pool.cern.ch/coral/currentreleasedoc/userguide.html 13

Onks tää sit parempi?

Tuttu kaavio viikkoharkoista 15

Lisätään tietoa, tulee parempi 6. Create undo-instance 1. Clicked event 1.1 handleevent 7. Update view 5. Validate move, update board 2. MakeMove 3. Check if Ai, forward move 4. Make move Sharer pointer relation with conditional instantiation Lazy copying Addable on runtime Turn-based instances created every round 16

Sekvenssikaavioista Suunnitteluvaiheessa: oliot, niiden välisen vuorovaikutuksen havainnollistaminen, vastuualueiden konkretisointi ja jakaminen yms. Dokumentaatio: Havainnollistaa ohjelman ajoaikaista käytöstä, esimerkki normaalista toiminnasta, poikkeustoiminnasta jne. Helpottaa ohjelman kulun ymmärtämistä, missä kaikkialla suorituksen aikana käydään (voi olla useampi abstraktiotaso)

Elinaikajuttuja

Kertausta Mitä eri kopiointitapoja C++:ssa on? 19

Viime viikon viikkoharkka Kuvien kanssa käytetty osoittimia, mitäs jos vaihdetaan käyttöön arvoparametrit? Laiska kopiointi käytössä (implicit data sharing) http://doc.qt.io/qt-5/implicit-sharing.html#implicitdata-sharing http://doc.qt.io/qt-5/qpixmap.html 20

Elinkaari Olion elinkaari: olion tapahtumat luomisesta tuhoutumiseen Ei-olio-ohjelmoinnissa ei yleensä tärkeä(?) Olio-ohjelmoinnissa merkitys korostuu Miksi? Eroja eri oliokielissä 21

Olion syntymä ja kuolema Olion syntyessä: Jäsenmuuttujien luominen Muistinvaraus Muut tarvittavat oliot Rekisteröitymiset Resurssit... Osa automatisoitu, osa ohjelmoijan vastuulla Olion tuhoutuessa yleensä vastakkaiset toimenpiteet Automaattisuus jälleen kieliriippuvainen 22

Elinkaaren määräytyminen Riippuu kielestä: Vain muistinvaraus Muistinvaraus & roskienkeruu Alustustoimenpiteet automaattisia Siivoustoimenpiteet automaattisia, ajankohta ei määrätty Siivous automaattista, tuhoutumishetki määrätty 23

Rakentajien ongelmia C++ Jos käyttäjä ei määrittele yhtään rakentajaa, luodaan automaattisesti oletusrakentaja Generoitu rakentaja ei alusta muuttujia mihinkään arvoon Älä siis luota generoituun rakentajaan, vaan määrittele aina rakentaja itse. Rakentaja voi toimia tyyppimuunnosoperaattorina // Paivays( int p = 1, int k = 1, int vuosi = 2016 ); // funktio laskee montako päivää on tuomiopäivään int paiviatuomiopaivaan( Paivays pvm ); int jaljella = paiviatuomiopaivaan( 4 ); // Mitäs tuossa yllä tapahtuikaan, virhe? 24

Tyyppimuunnokset Älä käytä c-tyylin tyyppimuunnoksia. Jos haluat tehdä tyyppimuunnoksen, käytä C++:n tyyppimuunnoksia static_cast< uusityyppi >( muunnettava ); Esimerkki: char mychar = 'c'; int charval = static_cast< int >( mychar ); // charval = 99 --charval; mychar = static_cast< char >( charval ); // mychar = b Jos implisiittiset tyyppimuunnokset haluaa kieltää, pitää käyttää explicit avainsanaa rakentajan yhteydessä: class Paivays { public: explicit Paivays( unsigned int paiva=1, unsigned int kk=1, unsigned int vuosi=2013 ); 25

Olioiden purkaminen C# ja Java Roskienkeruu hoitaa purkamisen parhaaksi katsomaansa aikaan Olioiden "purkuvalmiutta" tarkastellaan olion saavutettavuuden avulla Javassa finalize, C# finalize/purkaja (C++:sta tuttu syntaksi vain hämäyksenä) C#:n purkaja, (unmanaged resources) Idisposableolioiden hävittäminen (Dispose) Roskienkeruun pakkokäynnistys (yleensä turhaa/huono ajatus) onnistuu Collect-funktiolla Roskienkeruuesimerkki (vs. C++) 26

Kaksivaiheinen purkaminen Purkajan kutsuhetki epävarma Jos halutaan poistaa olio ohjelmasta, voidaan käyttää kaksivaiheista purkamista Kontrolloitu resurssien vapauttaminen erillisellä funktiokutsulla, kun oliosta halutaan eroon Roskienkeruun käyttämä purkaja/metodi, jonka ajamishetkellä ei merkitystä (hoitaa muistin siivouksen) 27

Java/C# vs. C++ Javassa roskienkeruun hoitaa JVM (Java Virtual Machine) C# (ja Windows ympäristö), roskienkeruusta vastaa CLR (Common Language Runtime) Molemmissa sama idea, rauta/käyttöliittymätason päällä oma hiekkalaatikko/ajoympäristö, jossa sovellukset suoritetaan C++ sovellus käännetään kullekin ympäristölle (natiivikoodia) Virtuaalikone vaihtuu kun vaihdetaan alustasta toiseen, sama ("käännetty") koodi toimii kaikkialla 28

Olioiden luominen Uuden olion luominen, normaalissa tilanteessa pitää tietää oikea rakentaja, oikeat parametrit, muuttuu työläämmäksi erityisesti, jos paljon eri vaihtoehtoja koodi riippuvaista toteutuksesta, jokainen uusi lisätty luokka vaatii toteutuskoodin puukottamista Ongelmaan tarjolla erilaisia ratkaisuja, rakentajametodit, rakentajaluokat, erilaiset tehtaat

Ongelma: Miten varmistaa yhdenmukaiset oliot? Alusta TAI MUTTA EI:

Abstrakti tehdas suunnittelumalli AbsFactory createproducta(): ProductA createproductb(): ProductB ProductA2 opera ProductA opera ProductA1 opera Alusta ProductB operb ProductB2 ProductB1 operb operb Factory1 <<create>> Factory2 <<create>>

Abstract Factory abstrakti tehdas Tehdasmallin idea, käyttäjälle annetaan abstrakti tehdas (tai tehdasrajapinta) jonka avulla rakentaa komponentteja Erilaisia konkreettisia tehtaita, jotka toteuttavat varsinaisen rakentamisen Rakennettavat komponentit, abstrakti kantaluokka/rajapinta ja konkreettiset vastineet Tehtaan käyttäjä pyytää rakentamaan esim. uuden nappulan, tehdas Vertailu ideatasolla: olioiden kopiointi, virtuaalinen kopiointifunktio Fokus komponenttijoukon rakentamisessa

Abstract Factory abstrakti tehdas Erikoistetut tehtaat, eri ympäristöön, eri käyttöliittymään, eri käyttäjäprofiilille, jne. oma tehtaansa. Pyydetään haluttua tehdasta luomaan ohjelman käyttämät komponentit. Tehtaan käyttö samanlaista riippumatta rakennettavien olioiden tyypistä (esim. käyttöliittymäkomponenttitehdas ja eri ympäristöt, profiilit) Esimerkki: käyttöliittymäperhe ja eri ympäristöt/kirjastot Käyttöliittymätehdas rakentaa ikkunan ja sen eri osat (luox,y,z) Ikkuna kantaluokkana, erikoistetut versiot jokaiselle ympäristölle erikseen Käyttöliittymätehtaan erikoistetut versiot (vastaavat kuin komponenttien erikoistus) Mainissa tms. tarkistus, mitä versiota käytetään ja luodaan/otetaan käyttöön oikea tehdas. Muualla käytetään annettua tehdasta ja komponentteja, muu koodi toimii samoin riippumatta käytössä olevasta versiosta

Tehdasmetodi (Factory method) Editori, jonka pitäisi osata avata oikeanlainen tiedosto, eri tiedostojen avaamista ja käsittelyä varten omat tiedostolukijansa. Perinteinen tapa, jokainen eri tiedostotyyppi pitää rakentaa erikseen, if-elsejä tai vastaavia hässäköitä. Uuden tiedostotyypin lisääminen vaatii Editorin koodin puukottelua. Sama tapahtuu tiedoston muuntamisessa muodosta toiseen Olisi huomattavasti mukavampaa, jos saman voisi tehdä automaattisesti ja uusien tyyppien lisääminen ei vaatisi olemassa olevan koodin käpistelyä FileConverter Editor FileReader.rtf.doc.txt.rtf.doc.txt.docx.docx

Tehdasmetodi (Factory method) Yksinkertaisin rakentajametodi, tehdään kantaluokkaan luokkafunktio (static member function) joka hoitaa rakentamisen. Osaa päättää parametrin perusteella, mikä hierarkian olioista halutaan rakentaa Esimerkki tiedostojuttujen kanssa: Hifistelyä, jokainen aliluokka osaa rekisteröityä (automaattisesti) rakentajalle ja kertoa esim. parametrien sisällöstä (kuten tiedostotyyppi), rakentajafunktio/olio kutsuu parametrin perusteella oikeaa rakennusmetodia ja uusi oikeantyyppinen oli syntyy Funktion käyttäjän ei tarvitse tietää mitään toteutuksesta tai luokkahierarkiasta FileConverter Editor FileReader.rtf.doc.txt.rtf.doc.txt.docx.docx

Rakennuttajien automaattisesta rekisteröinnistä Automaattisesti tehtaalle/rakennuttajalle rekisteröityvien luokkien tekeminen Uusi luokka vaatii vain käännöksen ja kaikki toimii kivasti toteutustapoja luokkamuuttujat, luokkafunktiot static-muuttujat, joiden arvo alustetaan rekisteröintifunktion avulla Template-hässäkät C++11 ja lambdat Ongelmia: Kääntäjät turhan innokkaita optimoimaan ja saattavat jättää esim. muuttujien alustuksen tekemättä ennen kuin niitä käytetään ensimmäistä kertaa Lisää kompleksisuutta

Object Pool (olioiden kierrättämistä) Olioiden luominen ja tuhoaminen voi olla raskasta erityisesti jos niihin liittyy vähänkään monimutkaisempia alustustoimenpiteitä Uusien luomisen sijaan tarjotaankin olioita käytettäväksi olioaltaasta Kun tarve tulee, olioaltaasta voi noutaa olion ja käytön jälkeen palauttaa sen takaisin (kuten keilahalli ja keilakengät) Voidaan kontrolloida käytössä olevien olioiden määrää, saadaan kapseloitua olioiden luominen Käyttäjä ei huomaa eroa, kutsuna pyydetään olioita ja tuloksena voi olla joko uusi olio tai jo jonkun aikaisemmin palauttama Suorituskyvyn optimointi tai tarve kontrolloida olioiden määrää

Koodiesimerkki (olioallas C#)

Kloonien tekeminen Miten kopioida kantaluokan päässä oleva olio, jonka tyyppi voi olla mitä vaan? Käydään läpi kaikki vaihtoehdot tyyppitarkastuksilla, kutsutaan oikeaa kopiorakentajaa kun tyyppi selvillä, ei ehkä kätevin vaihtoehto Entä jos/kun hierarkiaa laajennetaan/muokataan? 39

Kloonien tekeminen, kloonit Viipaloituminen kierrettävissä C++:ssa matkimalla muita kieliä Luokkiin jäsenfunktio kloonaa: Luo new:llä kopion oliosta(kopiorakentajaa käyttäen) Palauttaa osoittimen uuteen olioon Virtuaalifunktio, määritellään uudelleen jokaiseen aliluokkaan Kutsuttaessa luo aina oikeantyyppisen kopion olioista Ongelmia: Kopion tuhoamisvastuu siirtyy kutsujalle (delete) tai fiksujen osoittimien käyttö Joka luokkaan muistettava kirjoittaa oma kloonausfunktio, mitä käy jos unohdetaan? Muuta: (Paluuarvo-osoittimen tyyppi vaihtuu aliluokassa kovariantit paluutyypit) 40

Java ja kloonailu Javassa kloonattavissa olevat oliot tukevat clone() funktiota Tehdään kertomalla, että tietotyyppi toteuttaa Cloneable rajapinnan (erikoisrajapinta) Jos toteutusta ei määritellä, tekee vakiona matalakopioinnin (täälläkin koodari joutuu erikseen määrittelemään, jos halutaan syvä kopio) Javassakaan kopiointi/kloonaus ei ole välttämättä ongelmaton public class Viesti implements Cloneable{ private String sisalto; private Paivays pvm; public Viesti( String animi, Paivays apvm ) { this.nimi = animi; this.pvm = apvm; } public Object clone() throws CloneNotSupportedException { Viesti clone = (Viesti)super.clone(); // kopioidaan myös viitteen päässä oleva Paivays-olio // (myös päiväyksen on oltava Cloneable) clone.pvm = (Paivays)pvm.clone(); return clone; } } 41

Tarkoituksella tyhjä

Yhteenveto Olioiden luomiseen liittyvät mallit/patternit, helpottavat laajennettavuutta, vähentävät suoria toteutusriippuvuuksia Lisäävät koodin määrää, tekevät ohjelmasta hieman monimutkaisemman Usein erittäin hyödyllisiä ohjelman muokattavuuden ja laajennettavuuden säilyttämiseksi 43

Yhteenveto Opittiin erilaisia tapoja huolehtia olioiden luomisesta ja elinajasta. Ongelma/tarve kertoo, minkätyyppinen ratkaisu olisi toimiva. Opittiin C++-koodarin hyvä ystävä RAII (tämä ei roskienkeruujärjestelmässä toimikkaan näin kivasti) Opittiin peruskäsitteistöä kirjastoista ja plugineista. Jatkossa myös jotain toteutustavoista jne.