Luento 3 T-106.1240 Ohjelmoinnin jatkokurssi T1 & T-106.1243 Ohjelmoinnin jatkokurssi L1 Luennoitsija: Otto Seppälä Kurssin WWW: http://www.cs.hut.fi/opinnot/t-106.1240/s2007
Kertausta
Suorittaminen Kurssilla on kaksi pakollista osasuoritusta: Harjoitustehtävät (30% arvosanasta) 2 harjoituskierrosta Pääasiallinen tarkoitus on palauttaa koodausrutiini ennen projektin aloittamista Kurssilla on 6 harjoitusryhmää joissa voi vapaasti käydä hakemassa neuvoja harjoitusten avuksi. Toisella opetuskaudella vastaavasti ohjeistusta projektityöhön Projektityö (70% arvosanasta) Projektisuunnitelma Projektidokumentti Projektityön ohjelmakoodi
Suorittaminen Kaikki kurssin suoritukset ovat yksilösuorituksia! Plagiointi johtaa kurssilta poistamiseen ja jatkotoimenpiteisiin Luonnollisesti projektissa saa käyttää lähteitä (esim jokin tunnettu algoritmitoteutus) kunhan merkitsee ne oikein Olennaista on tietää minkä osan juuri SINÄ olet tehnyt.
Harjoitusryhmät Apua harjoituksiin ja projektiin Harjoitusryhmät aloittivat 17.9 Ma 8-10 Maari-C Ma 16-18 Maari-A Ti 12-14 Maari-C Ti 16-18 Maari-C To 14-16 Maari-A Pe 14-16 Maari-A Ryhmät ovat tauolla koeviikolla Viimeinen harjoitusryhmäviikko on marraskuun lopulla
Projekti
Projekti Projektin aikataulu karkeasti Aiheet julkaistaan iltapäivällä 24.9 Aihevalinta avautuu 25.9 Ykköskierroksen minimi pitää olla kasassa ennen kuin voi valita! Mahdolliset omat aiheet hyväksytetään luennoitsijalla Suunnitelmat palautetaan WebCAT:iin 6.10 Yleissuunnitelma 12.10 Tekninen suunnitelma Suunnitelmademot n. 15min, Maarilla 15.10 19.10 Aikaa koodata... Projektidemot n. 20min Maarilla Marras-joulukuun vaihde. Pääosa Joulukuun puolella
Projektityön suunnitelma Suunnitelma palautetaan kahdessa erässä 6.10 Yleistason suunnitelma Ohjelman sisältämät toiminnot Käyttöliittymän ulkoasu ja toiminnallisuus Ulkoisiin tiedostoihin tallennettu data ja näiden tiedostojen formaatti Järjestelmätestaussuunnitelma 12.10 Tekninen suunnitelma Ohjelman käyttämät algoritmit ja tietorakenteet Kuvaus ohjelmaan tulevista luokista ja haluttaessa myös luokkakaavio Työsuunnitelma, erityisesti etenemisjärjestys Yksikkötestaussuunnitelma
Projektityön suunnitelma Suunnitelma (sisältäen molemmat osat) esitellään assistentille suunnitelmademossa (15-20min.) Assistentti on tutustunut suunnitelmaan ennalta ja antanut sille alustavan arvosanan. Suunnitelmademossa opiskelija esittää suullisesti suunnitelmansa pääkohdat assistentille Assistentti antaa ohjeita mahdollisista puutteista tai ongelmista suunnitelmassa Kysymyksiä voi (ja ehkä kannattaakin) esittää Liian huono tai puuttuva suunnitelma voi johtaa työn hylkäämiseen Hyvin tehty suunnitelma on itsessään hyvä projektidokumentin pohja Suunnitelmademot pidetään välillä 15.10...19.10.
Projektityön dokumentti Dokumentti sisältää seuraavat osat Ohjelman käyttöohjeet Lista ohjelman sisältämistä ominaisuuksista Lista ohjelman tunnetuista bugeista / puutteista Luokkakaavio tms. Kuvaus ohjelman rakenteesta Tiedostoformaattien kuvaukset Toteutunut työjärjestys ja aikataulu Testit Itsearviointi 1-3 Mielestäni onnistuneinta osaa ohjelman rakenteessa/koodissa 1-3 Mielestäni heikointa osaa ohjelman rakenteessa/koodissa (parannusehdotukset)
Arvosteluperusteet Koodin dokumentointi Ohjelman rakenne ja laatu Jako luokkiin Jako metodeihin Laajennettavuus Uudelleenkäytettävyys Yleinen ratkaisu > Erikoistapaus Valitut algoritmit, tietorakenteet ja perustelut Toteutettujen piirteiden laatu ja vaikeus Bugilistan kattavuus Tiedostetut puutteet eivät ole yhtä pahoja kuin tiedostamattomat
Tiedostoformaateista
Tiedostoformaateista Luettavuus Editoitavuus Kirjoittaminen myös käsin Mahdollisuus lisätä väliin Virheherkkyys Yhtälailla formaatin kuin parserin(tiedoston tulkitsijan) tehtävä Tilankäyttö Formaatin laajennettavuus Nopeus Tunnetut formaatit (esim CSV)
Tiedostoformaateista Rakenteen kuvaus Tallennettavalla tiedolla on lähes aina jokin selkeä rakenne. Kuinka rakennetta voitaisiin kuvata tiedostossa? Voitaisiin kertoa rakennetieto datan seassa. Voitaisiin kertoa erikseen dataa koskevat tiedot. Molemmilla tavoilla on omat etunsa.
Esimerkki : HTML HTML (Hypertext Markup Language) sekoittaa datan ja käytetyt kontrollirakenteet toistensa lomaan Kontrollirakenteet erottuvat datasta erottimien avulla. HTML:ssä erottimia ovat mm. <, >, &, ; Rakennetta kuvaavat osat on erotettu muusta tekstistä aloittamalla < -merkillä ja lopettamalla > -merkillä. Esimerkiksi <P> aloita uusi kappale Merkistöön kuulumattomat kirjaimet esitetään kirjoittamalla kirjainta vastaava koodi merkkien & ja ; väliin äkirjain ä &-merkki on tässä ns. Escape character Kontrollirakenteissa käytettävät merkit täytyy myös esittää escape characterin avulla: & & < < > >
Esimerkki : HTML <H1>Alkeistyypistä char</h1> <p>yksittäisten merkkien tallentamiseen voidaan käyttää <b>char</b>-tyyppistä muuttujaa. Javassa <b>char</b>-tyypin arvo on kahden tavun kokoinen ja käyttää ns. <b>unicode</b>-koodausta.tämä tarkoittaa sitä, että hyvin monien kielien (esimerkiksi kreikka, venäjä, heprea, arabia, bengali, tamili), kirjain- ja numeromerkit voidaan esittää Javan <b>char</b>-tyypin avulla.</p>
3 esimerkkiä Esimerkkejä Seuraavilla sivuilla esitetään kolme erilaista tapaa tallentaa shakkipelin tilanne pelin myöhempää jatkamista varten. Kaikissa on tallennettuna sama data ja kaikki ovat ratkaisuina yhtä toimivia. Kaikilla on kuitenkin erilaisia etuja ja rajoituksia Jos kurssin projektissa joudut tallentamaan oman ohjelmasi tietoa tiedostoon, käytä riittävästi aikaa tiedostoformaatin suunnitteluun. Muista myös määritellä käyttämäsi formaatti työn dokumentissa.
Esimerkki 1 - Perus SHAKKI 1.2 Tallennustiedosto #Pelin tiedot Tallennettu 5.7.2001 Musta : Marko Valkoinen : Lauri #Kommentit Laurin revanssipeli, joskin huonosti on menossa... #Musta Kuningas : a4 Torni : a6 Sotilas : b3 Kuningatar : c8 #Valkoinen Kuningas Ratsu : d3 : f1
Esimerkki 2 - XML <SHAKKI VERSIO= 1.2 TALLENNETTU= 5.7.2001 > Laurin revanssipeli, joskin huonosti on taas menossa... <PELAAJA VARI= MUSTA NIMI= Marko > <KUNINGAS SIJAINTI= A4 /> <TORNI SIJAINTI= A6 /> <SOTILAS SIJAINTI= B3 /> <KUNINGATAR SIJAINTI= C3 /> </PELAAJA> <PELAAJA VARI= VALKOINEN NIMI= LAURI > <KUNINGAS SIJAINTI= D3 /> <RATSU SIJAINTI = F1 /> </PELAAJA> </SHAKKI>
Esimerkki 3 - Chunks P a ik k a (ta v u in a ) T ie d o s to n s is ä ltö S iis v a in tä m ä k u u lu u tie d o s to o n 0 SHAKKI12 : 8 merkkiätiedos ton tunnis te ja vers ionumero 8 05072001 : 8 merkkiä päiväys 16 CMT54Lau : K ommenttilohko, datan pituus 54 merkkiä 24 rin reva : 32 nssipeli : 40,joskin : 48 huonosti : 56 on taas : 64 menossa : 72...PLR17 : Pelaajalohko, datan pituus 17 merkkiä 80 M5MarkoK : Pelaajan väri, nimen pituus 5, nimi 88 A4TA6B3C : K uning as a4,torni a6, s otilas b3, s otilas c3 96 3PLR13V5 : Pelaajalohko, datan pituus 13 merkkiä 104 LAURIKD3 : Pelaajan väri, nimen pituus 5, nimi 112 RF1END00 : K uning as d3,rats u f1 Terminaattorilohko (ei enää lohkoja), datan pituus 0
Esimerkit Esimerkki 1 - Perus Helppo kirjoittaa parseri Etsi risuaita, lue lohkon nimi, lue nimen perusteella seuraavaan risuaitaan asti. Helppo ja nopea kirjoittaa ja lukea käsin Esimerkki 2 XML Vie enemmän tilaa Valmiita työkaluja lukemiseen olemassa Helppo kuvata sisäkkäiset rakenteet Esimerkki 3 Chunks chunkin päättymistä ei tarvitse tarkastella (pituus tiedossa) Virheherkkä ainakin käsieditoinnille
Esimerkit Mitä etuja esitetyissä formaateissa yleisesti oli? Kaikkiin esitettyihin esimerkkeihin voidaan lisätä uusia lohkoja, mutta tiedot voidaan yhä ladata vanhalla ohjelmalla, jos se ohittaa tuntemattomat lohkot. Mikään formaateista ei rajoittanut osioiden määrää ennalta Formaateissa oli versionumerointi Jos formaatti muuttuu, niin uudempi ohjelman versio voi silti lukea vanhaa formaattia Formaatti identifioi käytetyn ohjelman Voidaan hylätä väärät tiedostot pikaisesti Monissa oikeissa tiedostoformaateissa ns. MAGIC NUMBER Mitä puuttui?
Tiedonsiirto ohjelmien välillä Formaattia ei ole pakko keksiä itse jos pystyy lukemaan tai kirjoittamaan jotakin tunnettua formaattia Helpottaa ohjelman testausta, koska syötedataa helppo luoda muilla ohjelmilla. Osa tunnetuista formaateista helppolukuisia Esim 3DStudion ascii export, pakkaamaton BMP, Rich text format (RTF) Joitakin formaatteja on ainakin helppo kirjoittaa kun ei tarvitse tukea kaikkia ominaisuuksia Java API:ssa tuki esim seuraavien formaattien lukemiseen JPG, GIF, WAV Monille formaateille olemassa valmiita kirjastoja Saa käyttää, lähdeviitteet tulee olla kunnossa Arvosteltava osa : kirjastoa käyttävä koodi
Raakadata Raakadata Jos ohjelma käsittelee raakadataa (numeroarvoja, tekstiä jne.) on erittäin hyvä saada raakadataa myös tiedostoon/tiedostosta CSV, comma separated values Tieto jaettu riveihin, rivin sisällä jaettu pilkuilla (tai puolipisteillä) Erittäin yleinen: esim Excel, Impress TXT, raakateksti Pelkkää tekstiä ilman erikoiserottimia. Kappalejako merkitty joskus yhdellä tai kahdella rivinvaihdolla Esim kaikki tekstinkäsittelyohjelmat
Properties Properties-luokka java.util-pakkauksessa on tarkoitettu tallentamaan avain-data pareja joiden arvoja voi asettaa ja kysellä Esim: käyttäjä = matti Otsikko = omaohjelma Properties osaa tallentaa sisältämänsä tiedon tietovirtaan ja vastaavasti alustaa tietonsa tietovirrasta Sekä perinteinen että XML-formaatti
Design
Top-Down Top-down toteutuksessa ja suunnittelussa aloitetaan koko järjestelmän suunnittelusta Tämä määrittely on hyvin suurpiirteinen Määrittely jakaa järjestelmän alijärjestelmiin ja kertoo järjestelmän tasolla kuinka se käyttää alijärjestelmiä joiden kuvitellaan olevan olemassa Yllämainittu toistetaan alijärjestelmän tasolla Alijärjestelmä kuvataan käyttäen apuna pienempiä osasia Lopulta päästään alimmalle tasolle Yksittäiset luokat, metodit Todennäköisesti suunnitelmaa pitää tarkentaa useaan kertaan ennenkuin se on toteutettavissa
Top-Down Suunnitellessa määritellään järjestelmien ulkoiset rajapinnat ennen niiden toteutusta Toteutettaessa koodi rakennetaan käyttämään osia joita ei vielä ole olemassa Voidaan kirjoittaa tynkiä jotta päästään testaamaan...ja kääntämään Kirjoita ensimmäinen versio pseudokoodilla Älä kiinnitä alussa lainkaan huomiota syntaksiin tms. Kun runko on kasassa on suunnittelua helppo tarkentaa
Bottom-up Bottom-up strategia taas lähtee liikkeelle yksittäisistä osasista ja yhdistää niitä kierros kerrallaan suuremmiksi kokonaisuuksiksi Ohjelmointi ja testaus voidaan aloittaa heti Osasten yhdistely myöhemmin voi olla hankalaa koska ne on suunniteltu itsenäisesti Bottom-up tukee koodin uudelleenkäyttöä Vanhat osat saadaan sellaisenaan käyttöön Top-down suunnittelussa syntyvät rajapinnat eivät välttämättä sovi sellaisenaan vanhalle koodille
Top-Down + Bottom-Up Design Top-Down, Implement Bottom-Up Paras lopputulos saadaan yhdistämällä Top-down suunnittelulla vältetään moduulien yhteensopivuusongelmia ja saadaan kokonaiskuva projektista Yhdistettynä Bottom-up suunnitteluun koodin uudelleenkäyttö helpottuu Bottom-up toteutuksella päästään (yksikkö)testaamaan koodin osaset heti niiden valmistuessa
Design Suunnittelussa ohjelma kannattaa jakaa jonkinlaisiin alijärjestelmiin Tarpeettomia riippuvuuksia näiden välillä vältettävä Sykliset riippuvuudet voivat aiheuttaa ongelmia Esimerkki : Käyttöliittymän ja logiikan erottaminen GUI ohjaa, pyytää tietoa Aivot Logiikka (pelin logiikka, numeroilla tehtävä simulointi, tietokanta jne) kirjoitetaan itsenäiseksi osaksi joka ei tiedä millaisella käyttöliittymällä sitä käytetään. Pohdi millaisia metodeja luokkien julkiseen rajapintaan tarvitaan että eri käyttöliittymät voivat ohjata logiikkaa ja hekea tietoa Käyttöliittymä (GUI) on oma osionsa. Käyttäjän toimet kutsuvat GUI:n kautta logiikan metodeita. Käyttöliittymä hakee logiikalta ruudulla näyttämänsä tavaran.
Esimerkki Ristinolla-peli Logiikka GUI Pelilauta.java (Kuvaa pelilautaa: merkintöjen lisäys, voittotilan havaitseminen jne) Pelaaja.java (Rajapinta: 1 metodi jolla kerrotaan että nyt on pelaajan vuoro) Katsoja.java (Rajapinta: 1 metodi jolla kerrotaan että pelilauta päivittyi) TietokonePelaaja (täyttää rajapinnan pelaaja) Joitakin graafisia elementtejä jotka piirtävät pelilaudan Pelilautaluokalta pyytämänsä datan perusteella. Jokin luokka täyttää rajapinnan Katsoja. Tämä päivittää graafisen näkymän. Vastaavasti jokin luokka täyttää rajapinnan Pelaaja.
Design Model-View-Controller Tämä suunnittelumalli menee vielä askeleen pidemmälle, erottaen GUI:n osat(controller) jotka muuttavat mallia(model) ja osat(view) jotka vain esittävät mallin sisältämää tietoa Controller Tiedot päivittyivät ohjaus muutoskäskyt View Esitettävän datan kysely Tiedot päivittyivät, käy kysymässä Model
Design Turhien riippuvuuksien välttäminen kannattaa myös alemmilla tasoilla Toisaalta samasta tiedosta ei yleensä kannata pitää useita kopioita Yhtä päivitettäessä pitää aina päivittää muutkin Myös riippuvasta datasta olevat kopiot voivat olla ongelmallisia Tällöin riippuvan datan turha uudelleenlaskeminen voi olla hyödyllistä.
Tulevia luentoja (alustava) 17.9 Rajapinnat, Generics, Design Patterns I Olioiden tyypeistä: Luokat, interfacet, geneeristen luokkien kirjoittaminen. Rajapinnat Java APIssa. Mikä on suunnittelumalli? Muutama suunnittelumalli. 24.9 Projektiohjeistusta Ohjeita projektin aihevalintaan ja suunnitelman kirjoitukseen. Projektin jakaminen hallittaviin ja testattaviin kokonaisuuksiin. Toteutusjärjestys. Tiedostoformaattien suunnitteluperiaatteita. 1.10. Design for re-use, Design Patterns II, kirjastot Ohjelmien rakentaminen tulevia muutoksia ajatellen, defensive programming, muunneltavuutta edistävät suunnittelumallit. Katsaus joihinkin Java API:n kirjastoihin ja ideoihin niiden suunnittelussa.
Tulevia luentoja (alustava) 8.10 Graafiset käyttöliittymät, Versionhallinta Tapahtumat ja tapahtumankäsittely, GUI:n perustoiminnallisuus, Grafiikan piirtäminen. Versionhallinta. 15.10 Rinnakkaisohjelmoinnin alkeet Javan rinnakkaisuusprimitiivit, Luokka Thread, Runnablerajapinta, Perus Producer-Consumer esimerkkitoteutus, blocking, potentiaaliset ongelmat kuten deadlock. Graafiset käyttöliittymät ja rinnakkaisuus 22.10 Vaihtelevia aiheita Esim. Ohjelmien profilointi ja profiilien tulkinta, asiaa koodin optimoinnista, Lisää kirjastoja, yleiskatsaus palautettuihin suunnitelmiin ja ohjeistusta projektiin.