Ohjelmoinnin peruskurssien laaja oppimäärä, kevät

Samankaltaiset tiedostot
Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

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

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä, kevät

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

11/20: Konepelti auki

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

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 5: Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

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

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

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

Tämän lisäksi listataan ranskalaisin viivoin järjestelmän tarjoama toiminnallisuus:

Luento 3. T Ohjelmoinnin jatkokurssi T1 & T Ohjelmoinnin jatkokurssi L1. Luennoitsija: Otto Seppälä

Ohjelmoinnin peruskurssien laaja oppimäärä

Tutoriaaliläsnäoloista

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssien laaja oppimäärä

Luento 17: Perintä. self.points = 0 self.status = 'Student'

1. Olio-ohjelmointi 1.1

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

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Groovy. Niko Jäntti Jesper Haapalinna Group 31

Ohjelmoinnin perusteet Y Python

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op

Ohjelmoinnin peruskurssien laaja oppimäärä

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

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

8/20: Luokat, oliot ja APIt

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

Ohjelmistotuotanto. Luento

Ohjelmistojen mallintaminen luokkamallin lisäpiirteitä

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

Ohjelmoinnin peruskurssi Y1

13/20: Kierrätys kannattaa koodaamisessakin

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Muusta kuin vesisioista

GIS-automatisointi ja ohjelmointi/skriptaus. Harri Antikainen

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssien laaja oppimäärä

Java kahdessa tunnissa. Jyry Suvilehto

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

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Ohjelmoinnin peruskurssi Y1

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

7/20: Paketti kasassa ensimmäistä kertaa

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmistojen mallintaminen viikon 4 laskareiden mallivastauksia

Soveltuvuustutkimus Lifebelt-ohjelman ideologian käytettävyydestä olioorientoituneeseen

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

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 6: Python

815338A Ohjelmointikielten periaatteet

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi

Sukupuu -ohjelma. Ossi Väre ( ) Joni Virtanen ( )

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

Osoitin ja viittaus C++:ssa

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

Ohjelmoinnin peruskurssi Y1

1 Tehtävän kuvaus ja analysointi

Ohjelmointi 1 / syksy /20: IDE

Perintä (inheritance)

19/20: Ikkuna olio-ohjelmoinnin maailmaan

2) Aliohjelma, jonka toiminta perustuu sivuvaikutuksiin: aliohjelma muuttaa parametrejaan tai globaaleja muuttujia, tulostaa jotakin jne.

Rajapinta (interface)

Ohjelmistojen mallintaminen. Luento 11, 7.12.

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

Ohjelmoinnin peruskurssien laaja oppimäärä

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

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

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

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

Transkriptio:

Ohjelmoinnin peruskurssien laaja oppimäärä, kevät Luento 2: Ohjelman suunnittelua, miten oliot toimivat Riku Saikkonen (osa kalvoista on suoraan ei-laajan kurssin luennoista) 21. 1. 2013

Sisältö 1 Suunnittelua: top-down- ja bottom-up-menetelmät 2 Suunnittelua: Model-View-Controller -malli 3 Miten oliot ja metodikutsut toimivat?

(ei-laajan kurssin kalvo: luento 2 sivu 4) 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 11:31

(ei-laajan kurssin kalvo: luento 2 sivu 5) Top-Down Suunnittelussa määritellään järjestelmien ulkoiset rajapinnat ennen niiden toteutusta Toteutusvaiheessa 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 11:31

Top-down-menetelmän ongelmia top-down-menetelmällä voi päätyä suunnittelemaan pitkäänkin ennen kuin kokeilee suunnitelman toimivuutta käytännössä usein vasta ohjelmoidessa huomaa, ettei suunniteltu rajapinta toimikaan hyvin jos suuri osa muusta ohjelmasta on jo valmiiksi suunniteltu, rajapintojen muuttaminen voi olla työlästä suunnitelmasta saattaa unohtua ominaisuus, jota on hankala lisätä siihen jälkeenpäin tai siihen voi tulla turhaa monimutkaisuutta esim. suunnitellaan (ehkä tehdäänkin) monipuolinen apukirjasto, josta loppujen lopuksi tarvitaankin vain yksinkertaista erikoistapausta

(ei-laajan kurssin kalvo: luento 2 sivu 6) 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 11:31

Bottom-up-menetelmän ongelmia bottom-up-menetelmässä ohjelmoidaan yksittäisiä palasia miettimättä kovin paljon sitä, miten ne sopivat yhteen rajapinnat voivat olla sekavia moduulijako voi olla huono: eri moduulit eivät ole itsenäisiä tai riippuvat toisistaan syklisesti yleinen tapa, jonka ongelmat muistuttavat bottom-upia: tehdään aluksi nopeasti pieni prototyyppi ai niin, siihen pitää vielä lisätä... ja lopulta suunnittelematta tehty prototyyppi jääkin käyttöön, koska se tekee jo niin paljon, ettei sitä ehditä toteuttaa uudelleen oikein

(ei-laajan kurssin kalvo: luento 2 sivu 7) 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 toteutukseen koodin uudelleenkäyttö helpottuu Bottom-up toteutuksella päästään (yksikkö)testaamaan koodin osaset heti niiden valmistuessa 11:31

Entä käytännössä? sopiva yhdistelmä top-down- ja bottom-up-menetelmiä riippuu tilanteesta ja ohjelmoijista jotkut ohjelmat vaativat enemmän suunnittelua kuin toiset jotkut vähemmän

Entä käytännössä? sopiva yhdistelmä top-down- ja bottom-up-menetelmiä riippuu tilanteesta ja ohjelmoijista jotkut ohjelmat vaativat enemmän suunnittelua kuin toiset esim. ohjelma tekee monimutkaisia asioita tai on iso tai sen toimivuus tai turvallisuus on tavallista tärkeämpää jotkut vähemmän ohjelman rakenne voi olla etukäteen pitkälle tiedossa (esim. edellisestä versiosta tai muista samanlaisista ohjelmista) tai se on yksinkertainen (onkohan tosiaan?) joskus tätä ei tiedä etukäteen esim. tekee jotain niin uutta, ettei etukäteen tiedä, mitä ohjelman pitäisi tehdä tai miten se kannattaa tehdä usein (melkein aina?) ohjelman tavoitteet muuttuvat sitä tehdessä

Sisältö 1 Suunnittelua: top-down- ja bottom-up-menetelmät 2 Suunnittelua: Model-View-Controller -malli 3 Miten oliot ja metodikutsut toimivat?

(ei-laajan kurssin kalvo: luento 2 sivu 8) Sunnittelu 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 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. GUI ohjaa, pyytää tietoa Aivot 11:31

(ei-laajan kurssin kalvo: luento 2 sivu 10) Suunnittelu Model-View-Controller Tämä suunnittelumalli menee vielä askeleen pidemmälle, erottaen GUI:n (Controller) osat jotka muuttavat mallia (Model) ja osat jotka vain esittävät mallin sisältämää tietoa(view) Controller Tiedot päivittyivät ohjaus muutoskäskyt View Esitettävän datan kysely Tiedot päivittyivät, käy kysymässä Model 11:31

Lisää ModelViewControllerista Model, malli: sisältää ohjelman tallettaman datan ja tavat kysellä ja muuttaa sitä usein myös lähettää tietoja muutoksista niitä pyytäneille datan esitysmuotoa voisi vaihtaa pelkkää mallia muuttamalla joskus osa mallista on tietokannassa View, näkymä: käyttöliittymä tai erityisesti sen osa, joka näyttää asioita sillä voi olla omaa tilaa, jota esim. ei talleteta (mikä kohta datasta on tällä hetkellä näkyvissä?) perusideaan kuuluu, että näkymiä voisi olla yhtäaikaisesti monta erilaista (joskus onkin) Controller, ohjain: mallia muuttavat osat ohjelmasta (sekä käyttöliittymästä että automaattisesti esim. laskemalla) ei kerro näkymälle datasta (näkymä hakee ne mallilta) käytännössä MVC:tä käytetään harvoin täsmälleen näin: useimmiten jollain tilanteeseen sopivalla tavalla muokattuna

Käytännön esimerkki ConvertAll on pieni GUI-ohjelma yksikkömuunnoksiin http://convertall.bellz.org/download.html katsotaan sen asetuksien muokkaamista (Options-ikkunaa) voit ensiksi miettiä top-down-tyyliin miten tekisit tämän osan ohjelmasta: noin 10 yksinkertaista asetusta (esim. taustaväri, luvuissa näytettävien desimaalien määrä) käyttöliittymä niiden näyttämiseen ja muuttamiseen yksi kerrallaan kaikki talletetaan automaattisesti tekstitiedostoon

Käytännön esimerkki ConvertAll on pieni GUI-ohjelma yksikkömuunnoksiin http://convertall.bellz.org/download.html katsotaan sen asetuksien muokkaamista (Options-ikkunaa) voit ensiksi miettiä top-down-tyyliin miten tekisit tämän osan ohjelmasta: noin 10 yksinkertaista asetusta (esim. taustaväri, luvuissa näytettävien desimaalien määrä) käyttöliittymä niiden näyttämiseen ja muuttamiseen yksi kerrallaan kaikki talletetaan automaattisesti tekstitiedostoon MVC-malli sopii tähän esimerkkiin osittain: Model: source/option.py luokka Option (sekä oletusarvot source/optiondefaults.py) View: lähinnä source/optiondlg.py sekä source/convertdlg.py metodi changeoptions Controller: lähinnä source/optiondlg.py:n updatedata-metodit (toteutus olisi todennäköisesti lähempänä puhdasta MVC:tä, jos olisi tarpeen olla useita eri View-näkymiä samaan dataan)

Sisältö 1 Suunnittelua: top-down- ja bottom-up-menetelmät 2 Suunnittelua: Model-View-Controller -malli 3 Miten oliot ja metodikutsut toimivat?

Minkä luokan metodia kutsutaan? Python-esimerkki import math class Point(object): def init (self, x, y): self.x = x self.y = y def dist(self, point): def square(x): return x*x return math.sqrt(square(self.x - point.x) + square(self.x - point.x)) def pprint(self): print 'Point at '+str(self.x)+', '+str(self.y) class ColoredPoint(Point): def init (self, x, y, color): Point. init (self, x, y) # tai: super(coloredpoint, self). init (x, y) self.color = color def pprint(self): print 'Colored point at '+str(self.x)+', '+str(self.y)+\ ' colored '+self.color p1 = Point(5, 8) p2 = ColoredPoint(2, 3, 'black') p1.pprint() # "Point at 5, 8" p2.pprint() # "Colored point at 2, 3 colored black" print p1.dist(p2) # 4.24264068712 print p2.dist(p1) # 4.24264068712 point.py

Dynaaminen metodinvalinta Jatkoa edelliseen esimerkkiin def printpoint(p): print "The point is:" p.pprint() printpoint(p1) printpoint(p2) printpoint(p2) kutsuu aliluokan ColoredPoint metodia koska p2-muuttuja osoittaa tämän luokan olioon mutta printpoint-funktio ei etukäteen tiedä, mitä metodia p.pprint() kutsuu (riippuu p:n arvosta) kutsuttava metodi valitaan siis dynaamisesti eli vasta ajon aikana (dynamic dispatch, dynamic method lookup) eli ajon aikana joudutaan tekemään hiukan ylimääräistä työtä proseduurikutsuun verrattuna pohjimmiltaan juuri tämä ominaisuus määrittelee, mikä on olio-ohjelmointikieli kieli tukee olio-ohjelmointia, jos se tarjoaa mahdollisuuden tehdä dynaamista metodinvalintaa

Staattinen metodinvalinta toinen vaihtoehto olisi valita metodi staattisesti esim. olion käännösaikaisen tyypin tai jonkun muun koodissa esiintyvän tyyppinimen mukaan Pythonissa esim. yliluokan konstruktorin kutsu Point. init (self, x, y) (luokan nimi annetaan koodissa) samoin Javan ja Pythonin super tekee staattisen metodinvalinnan (super-kutsun sisältävän luokan isäluokka) ja C++:n ei-virtuaaliset metodit (joita kutsutaan muuttujan käännösaikaisen tyypin mukaan) entä jos metodi valittaisiin aina staattisesti? kieli ei tukisi olio-ohjelmointia (vrt. edellinen kalvo) monet moduulijärjestelmät toimivat periaatteessa näin (esim. ML) koska metodi on tiedossa käännösaikana, metodinvalinnan voisi toteuttaa esikäsittelemällä koodia (automaattisesti tai käsin): staattisesti kutsuttava metodi käyttäytyy kuten globaali funktio monissa kielissä on molemmat metodikutsutavat (esim. C++:ssa tapa valitaan metodia määriteltäessä, Pythonissa kutsussa)

Mitä oliosta on tallessa muistissa? ajon aikana luokat ja metodit ovat jo tiedossa: ne on luotu käännösaikana tai luokkia määritellessä sen sijaan kenttien arvot ovat jokaiselle oliolle yksilöllisiä ajon aikana jokaisesta oliosta on tallessa: kenttien arvot viittaus luokan tiedot (mm. metodit) sisältävään tietorakenteeseen mikä sitten on metodi? proseduuri, joka saa implisiittisenä argumenttina olion, jonka kautta metodia kutsuttiin (Javassa tästä tulee this; Pythonin self näkyy eksplisiittisesti metodin määritelmässä, muttei näy kutsussa) metodista on siis (esim. Javassa) muistissa vain koodi vrt. proseduuri Scheme-tulkissa: koodi ja määrittely-ympäristö (sisäkkäisten luokkien tukemiseen voisi tarvita myös määrittely-ympäristöä) monissa kielissä metodia ei kuitenkaan voi käyttää esim. funktioargumenttina (Pythonissa voi)

Miksi perintä on tärkeää? miksi olio-ohjelmoinnissa puhutaan niin paljon juuri perinnästä? sen käyttäminen on monimutkaista... vaikka olio-ohjelmoinnissa on paljon muutakin, perinnän tuki erottaa olio-ohjelmointikielet muista kielistä usein monimutkaisemmat olio-ohjelmoinnin rakenteet (esim. suunnittelumallit) tarvitsevat perintää ilmankin perintää voi tehdä paljon olio-ohjelmointia esim. SICPin message passing -olioesimerkit moduuli joka käsittelee tiettyä tietorakennetta olio joten olioihin pohjautuvaa suunnittelua voi tehdä myös muissa kuin oliokielissä oliosuunnittelun perusidea: mallinnetaan ratkaistava ongelma itsenäisinä olioina, jotka kommunikoivat viesteillä toteutuksen ei tarvitse olla oikea olio näin vältetään perinnän aiheuttamia ongelmia, mutta menetetään osa abstraktiomahdollisuuksista jotkut eivät kuitenkaan pidä tätä varsinaisena olio-ohjelmointina