Ohjelmoinnin peruskurssien laaja oppimäärä

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ä, kevät

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssien laaja oppimäärä

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

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Ohjelmoinnin perusteet Y Python

Hakemistojen sisällöt säilötään linkitetyille listalle.

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssien laaja oppimäärä

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

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

Ohjelmoinnin perusteet Y Python

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

Ohjelmoinnin perusteet Y Python

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ä

Tietorakenteet ja algoritmit - syksy

Algoritmit 1. Luento 3 Ti Timo Männikkö

Ohjelmistojen mallintaminen viikon 4 laskareiden mallivastauksia

Ohjelmoinnin peruskurssien laaja oppimäärä

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos. Harjoitustyö 4: Cache, osa 2

Ohjelmoinnin jatkokurssi, kurssikoe

Ohjelmoinnin perusteet Y Python

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

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

Java kahdessa tunnissa. Jyry Suvilehto

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

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

TIE Ohjelmistojen suunnittelu

Ohjelmoinnin peruskurssi Y1

Test-Driven Development

T SEPA - päiväkirja: Design Patterns. ETL työkalu

Ohjelmoinnin peruskurssien laaja oppimäärä

15. Ohjelmoinnin tekniikkaa 15.1

Taulukot. Jukka Harju, Jukka Juslin

Harjoitustehtävät ja ratkaisut viikolle 48

Tutoriaaliläsnäoloista

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

Algoritmit 1. Luento 1 Ti Timo Männikkö

13/20: Kierrätys kannattaa koodaamisessakin

Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla

Perintä (inheritance)

Ohjelmoinnin perusteet Y Python

CUDA. Moniydinohjelmointi Mikko Honkonen

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

Zeon PDF Driver Trial

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

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

Ohjelmoinnin peruskurssien laaja oppimäärä

58131 Tietorakenteet ja algoritmit (syksy 2015)

Ohjelmoinnin perusteet Y Python

15. Ohjelmoinnin tekniikkaa 15.1

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

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

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

JUnit ja EasyMock (TilaustenKäsittely)

Ohjelmoinnin perusteet Y Python

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

Ohjelmoinnin perusteet Y Python

Harjoitustyö: virtuaalikone

Rajapinta (interface)

Ohjelmoinnin peruskurssi Y1

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

JWT 2016 luento 11. to klo Aulikki Hyrskykari. PinniB Aulikki Hyrskykari

Pythonin Kertaus. Cse-a1130. Tietotekniikka Sovelluksissa. Versio 0.01b

Ohjelmoinnin perusteet Y Python

Ohjelmistojen suunnittelu

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op

UML Luokkakaavio 14:41

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

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

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

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

Algoritmit 2. Luento 2 Ke Timo Männikkö

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

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

1. Olio-ohjelmointi 1.1

9. Periytyminen Javassa 9.1

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

Transkriptio:

Ohjelmoinnin peruskurssien laaja oppimäärä Luento 8: Lisää suunnittelumalleja, suorituskyvystä ja laadusta Riku Saikkonen (osa kalvoista on suoraan ei-laajan kurssin luennoista) 21. 3. 2012

Sisältö 1 Suunnittelumalleja: Decorator, Proxy ja Adapter 2 Suunnittelumalleja: Composite ja Double-dispatch 3 Suunnittelumalleja: Command, Strategy ja Template Method 4 Suorituskyky ja prolointi 5 Muuta ohjelmien laadusta

(ei-laajan kurssin kalvo: luento 10 sivu 10) Decorator Mahdollistaa lisäominaisuuksien lisäämisen olioon lennossa, muuttamatta alkuperäistä luokkaa. Perusidea on, että dekoraattori liittää johonkin alkuperäiseen toimintoon oman lisänsä ja pyytää sitten koristelemaansa oliota (oli se sitten dekoraattori tai varsinainen olio) suorittamaan alkuperäisen toiminnon. Lopulta varsinainenkin operaatio tulee tehtyä Koska sekä dekoraattorit että varsinainen koristeltava olio noudattavat samaa rajapintaa, ovat dekoraattorit käyttävälle luokalle näkymättömiä. Reunustaja Värittäjä TodellinenOlio Käyttävä Luokka +operaatio() +omatoiminto() +operaatio() +omatoiminto() +operaatio() 12:22

(ei-laajan kurssin kalvo: luento 10 sivu 11) Decorator class Point(object): def init (self, x, y): self.x = x self.y = y def get_point(self): return (self.x, self.y) class ScalablePoint(object): def init (self, point_object, n): self.point_object = point_object self.scale = n def get_point(self): x, y = self.point_object.get_point() return (x * self.scale, y * self.scale) 12:22

(ei-laajan kurssin kalvo: luento 10 sivu 12) Proxy Proxy toimii jonkin toisen olion sijaisena ja säätelee olioon kohdistuvaa käyttöä. Kun jotain proxy-olion metodia kutsutaan, se yleensä kutsuu todellisen olion metodia Tyypillisesti sekä proxy-olio että oikea olio toteuttavat samaa rajapintaa, joten käyttävä luokka ei huomaa eroa Käyttötapoja : Proxyn kauttaa voidaan käyttää olioita jotka sijaitsevat aivan muualla (levyllä, verkossa jne.) (remote proxy) Lazy initialization: Proxyn suojaama olio voidaan alustaa vasta tarvittaessa. (virtual proxy) Proxyn avulla saman luokan eri olioille voidaan antaa 12:22 erilaiset näkyvyydet. (protection proxy)

(ei-laajan kurssin kalvo: luento 10 sivu 14) Adapter Ongelma : Jokin osa olemassaolevaa koodia toimii tietyn rajapinnan täyttävien olioiden kanssa. Tarjolla olevien olioiden luokka ei kuitenkaan täytä tätä rajapintaa. Alkuperäistä luokkaa ei kuitenkaan haluta muuttaa. Ratkaisu : Adapter sovittaa jonkin olemassaolevan luokan rajapinnan muotoon, jota jokin toinen osa ohjelmasta odottaa. Tästä suunnittelumallista on kaksi versiota : olioadapteri luokka-adapteri 12:22

(ei-laajan kurssin kalvo: luento 10 sivu 15) Adapter - olioadapteri Toteutus : Käyttävä luokka tekee kaiken toimintansa adapteri-olioiden kanssa, jotka täyttävät vaaditun rajapinnan. Adapterioliosta on viittaus varsinaiseen olioon Rajapinnan mukaiset metodikutsut delegoidaan viittauksen kautta eteenpäin oikealle oliolle Käyttävä Luokka Tuttu Rajapinta Adapteri Käytettävä Luokka 12:22

(ei-laajan kurssin kalvo: luento 10 sivu 16) Adapter - luokka-adapteri Adapteri voi myös periä luokan (jos mahdollista), jonka rajapintaa se muuttaa. Tällöin adapteri täyttää rajapinnan vaatimat metodit, joiden tehtävä on kutsua yliluokan metodeja. Käyttävä Luokka Tuttu Rajapinta Adapteri Käytettävä Luokka 12:22

Sisältö 1 Suunnittelumalleja: Decorator, Proxy ja Adapter 2 Suunnittelumalleja: Composite ja Double-dispatch 3 Suunnittelumalleja: Command, Strategy ja Template Method 4 Suorituskyky ja prolointi 5 Muuta ohjelmien laadusta

(ei-laajan kurssin kalvo: luento 10 sivu 19) Composite Joissakin tietorakenteissa (esim. puu) rakenteen osaset koostuvat pienemmistä osasista (lapset), jotka taas koostuvat pienemmistä osasista jne. Composite-mallissa koko rakenteelle voi suorittaa operaation tekemällä sen vain yhdelle osaselle Toteutuksessa suurempaa rakennetta ja sen osasia käsitellään samalla tavalla. Kaikki osaset täyttävät saman rajapinnan. Isomman rakenteen operaatio tehdään myös sen lapsille 12:22

(ei-laajan kurssin kalvo: luento 10 sivu 20) Composite Esimerkki Tekstinkäsittelyohjelma, jossa kappaleet koostuvat alikappaleista ja tekstistä, jotka molemmat täyttävät rajapinnan TekstiRakenne TekstiRakenne-luokassa on metodi oikolue() Kappale-luokan oikolue kutsuu metodia oikolue() sisältämilleen Kappale-olioille ja sisältämälleen Teksti-oliolle Teksti-olio suorittaa oikoluvun normaalisti. Etuja: Koko tekstin tai osan siitä voi oikolukea kutsumalla metodia oikolue vain kerran. Muun osan koodia ei tarvitse toimia eri tavalla riippuen siitä, millaista tekstirakennetta käsitellään, koska toiminta on ulospäin samanlaista. 12:22

(ei-laajan kurssin kalvo: luento 10 sivu 21) Composite UML-kaavio Huomaa että toteutuksessa erilaisia Komponentti-rajapinnan täyttäviä rakenteita voi olla paljon erilaisia, tai jopa vain yksi Käyttävä Luokka <<interface>> Komponentti +operaatio( ) lapset Alkio +operaatio() Komposiitti +operaatio() Suorittaa kaikille lapsille metodin operaatio() 12:22

Double-dispatch ongelma: halutaan valita kutsuttava metodi useamman kuin yhden olion luokan perusteella esimerkki: piirto-ohjelmassa on kolme muotoa (Triangle, Rectangle, Circle) ja kaksi tulostuslaitetta (Window, Printer) oletetaan että kaikki 3 2 = 6 metodia ovat erilaisia jos koodissa on muotoa kuvaava olio m sekä tulostuslaitetta kuvaava olio t, miten metodikutsu tehdään? ei-olioratkaisu: isinstance:a käyttävä ifelse-ketju, joka valitsee oikean metodin m:n ja t:n luokan perusteella ratkaisu double-dispatch-suunnittelumallilla: jompaan kumpaan luokkahierarkiaan välimetodi, joka ottaa toisen argumentiksi esim. Window- ja Printer-luokkiin metodi display(a: Shape), joka kutsuu joko a.displayonwindow-metodia tai a.displayonprinter:iä mm. Common Lispissä on myös suora tuki monen olion avulla tehtävään metodinvalintaan (tavallisissa oliokielissähän metodi otetaan self-argumentin luokasta)

Sisältö 1 Suunnittelumalleja: Decorator, Proxy ja Adapter 2 Suunnittelumalleja: Composite ja Double-dispatch 3 Suunnittelumalleja: Command, Strategy ja Template Method 4 Suorituskyky ja prolointi 5 Muuta ohjelmien laadusta

(ei-laajan kurssin kalvo: luento 10 sivu 26) Command Joskus halutaan suorittaa jokin toiminto tietämättä ennalta mitään kutsuttavasta metodista tai oliosta jonka metodia kutsutaan. Command-mallin idea on kapsuloida metodikutsu olion sisään. Komento-olioita vaihtamalla voidaan vaihdella toiminnallisuutta Oliot voivat Command-olioiden kautta kutsua metodeja, jotka voidaan toteuttaa niistä täysin irrallisina. Komentoa Käyttävä Luokka Kohde +operaatio() komennonkohde <<interface>> Komento +suorita() TodellinenKomento +suorita() komennonkohde.operaatio() 12:22

(ei-laajan kurssin kalvo: luento 10 sivu 27) Command Command-olioita voidaan puskuroida, tallentaa jne. Voidaan tehdä makroja, tai suorittaa vasta kun mahdollista Komennoista voidaan joissain tilanteissa tehdä peruutettavia. Suorita()-metodi tallentaa tällöin olennaiset tiedot jotta peruutuksen voi tehdä. Lisätään rajapintaan metodi peruuta() Laitetaan Komento-oliot talteen niiden suorituksen jälkeen PoistuKomento Ohjelma Komentoa Käyttävä Luokka <<interface>> Komento +suorita() +suorita() KopiointiKomento +suorita() +lopeta() Leikepöytä +kopioivalinta() 12:22

(ei-laajan kurssin kalvo: luento 10 sivu 22) Strategy Oletetaan että on olemassa joukko erilaisia tapoja ratkaista jokin laskennallinen ongelma Strategy-mallissa kirjoitetaan ensin ratkaisulle yleinen toteutus jossa vaihtoehtoiset kohdat on ulkoistettu muiden luokkien tehtäväksi Vaihtoehtoisille kohdille on kirjoitetaan rajapinta jonka kautta yleinen toteutus käyttää ulkoistettuja osia. voidaan toteuttaa erilaisia ratkaisutapoja jotka toteuttavat k.o. rajapinnan kautta jonkin osan ratkaisua, mutta ei tarvitse kirjoittaa koko koodia Nyt ratkaisutapaa voidaan haluttaessa helposti muuttaa esim. tekstin jakaminen riveihin vaihtelee kielen mukaan esim. alkioiden vertailu keskenään järjestettäessä 12:22

(ei-laajan kurssin kalvo: luento 10 sivu 24) Template Method Template method toimii muuten kuin Strategy, mutta puuttuvat osat algoritmia on kirjoitettu abstrakteiksi metodeiksi Metodit toteutetaan aliluokassa jonka jälkeen algoritmi on käyttökelpoinen 12:22

Nämä mallit funktioargumenteilla nämä suunnittelumallit muistuttavat funktioargumenttien käyttöä tehty kieliin, joissa ei ole ensimmäisen luokan funktioita Command on käytännössä vain funktio paitsi peruutuksen kanssa se kytkee yhteen kaksi funktiota Strategy on yksi tai useampi (nimetty) funktio idean voi toki yleistää esim. moduuleihin: useita vaihtoehtoisia moduuleita, joissa on sama rajapinta Template Methodin vastine voisi olla funktio, joka ottaa muita funktioita argumentiksi (vrt. SICP:n sqrt-iter) monia muitakin suunnittelumalleja voi ainakin periaatteessa yksinkertaistaa dynaamisten kielten ominaisuuksilla funktioiden lisäksi mm. sillä että luokat ovat olioita (esim: luokkaolio joskus tehdasolio) lisää ks. http://www.norvig.com/design-patterns/

Sisältö 1 Suunnittelumalleja: Decorator, Proxy ja Adapter 2 Suunnittelumalleja: Composite ja Double-dispatch 3 Suunnittelumalleja: Command, Strategy ja Template Method 4 Suorituskyky ja prolointi 5 Muuta ohjelmien laadusta

(ei-laajan kurssin kalvo: luento 11 sivu 3) Suorituskyky Millainen on tehokas tai nopea ohjelma? Ei yksikäsitteistä vastausta. Nopeus Muistinkäyttö Vasteaika (nopea reagointi käyttäjän toimiin) Kuinka näitä voidaan mitata? Profilointi Koodin ja algoritmin analyysi Ο, Θ, Ω Kuinka niihin voi vaikuttaa? Hyvät algoritmit ja tietorakenteet Koodin optimointi 11:08

Lisää suorituskyvyn mittauksesta ohjelman käyttämää aikaa voi mitata monella tavalla: suoritusaika tai nopeus: tietty toiminto suoritetaan ajassa x vasteaika (response time, latency): syötteeseen vastataan (viimeistään) ajan d kuluttua läpäisy (throughput): järjestelmä pystyy jatkuvasti suorittamaan esim. m tapahtumaa sekunnissa (yhtäaikaisesti tai peräkkäin) joskus yhden näistä optimointi hidastaa toista reaaliajan lisäksi voidaan mitata resurssien kulutusta: toimintoon kuluu esim. x CPU-sekuntia laskenta-aikaa (tai: m tapahtumaa sekunnissa vie y% CPU:sta) ohjelma vie maksimissaan/keskimäärin n tavua muistia tai muita resursseja (levytilaa, energiaa, avoimia tiedostoja, tietokantakyselyitä, toisen järjestelmän käyttöä, jne.) mittaus kannattaa toistaa monta kertaa ja katsoa, muuttuuko se tulokseen vaikuttavat mm. muut käynnissä olevat ohjelmat, välimuisti ja käyttöjärjestelmän levypuskuri

Koodin prolointi proloija (proler) mittaa missä kohdissa ohjelma viettää aikaansa mittaa CPU-aikaa joko funktion tai koodirivin tarkkuudella mutta aina kaikki aika ei kulu ohjelmassa itsessään: esim. näytön päivitys voi hoitua toisten ohjelmien avulla toteutus yleensä: pysäytetään ohjelma säännöllisesti hetkeksi ja katsotaan missä se sillä hetkellä on myös käyttöjärjestelmä mittaa aina ohjelman suoritusaikaa sekä reaaliaikaa eli seinäkelloaikaa että laskenta- eli CPU-aikaa laskenta-aika on usein jaettu käyttäjän (user: ohjelman sisällä) ja järjestelmän (system: käyttöjärjestelmän sisällä) ajaksi loppuaika on yleensä muiden ohjelmien tai laitteiden odottelua näihin pääsee myös ohjelmasta (C getrusage, gettimeofday, Python resource- ja time-moduulit) työkaluja: Python: http://docs.python.org/library/profile.html C/C++: mm. gprof, perf Java: jprof

(ei-laajan kurssin kalvo: luento 11 sivu 7) Koodin profilointi import cprofile...... def main(): app = QtGui.QApplication(sys.argv) ex = MyWindow() ex.start() exit_value = app.exec_() sys.exit(exit_value) if name == ' main ': # main() cprofile.run('main()', 'results') 11:08

(ei-laajan kurssin kalvo: luento 11 sivu 5) Optimoi vasta lopuksi Optimointi monimutkaistaa koodia (ehkä) Luo uusia virheitä Vaikeuttaa ylläpidettävyyttä Vaikeuttaa jatkokehitystä / perintää Aina ei kannata optimoida Jos voitot ovat pieniä, ylläpidettävyys on tärkeämpää Mutta ensin ohjelma toimivaksi Eikä hitaus aina johdu omasta ohjelmasta Taustalla oleva tietokanta voi olla hitauden syynä Ennaltaehkäise: suunnittele hyvin 11:08

Sisältö 1 Suunnittelumalleja: Decorator, Proxy ja Adapter 2 Suunnittelumalleja: Composite ja Double-dispatch 3 Suunnittelumalleja: Command, Strategy ja Template Method 4 Suorituskyky ja prolointi 5 Muuta ohjelmien laadusta

(ei-laajan kurssin kalvo: luento 11 sivu 2) Laatukriteerit Code quality is the measure of individual components for compliance with standards and best practices in the context of a specific language --- Consortium for IT Software Quality, CISQ Suorituskyky Koodin vakaus Turvallisuus Ylläpidettävyys 11:08

(ei-laajan kurssin kalvo: luento 11 sivu 12) Ylläpidettävyys Suunnittele odottamattoman varalle Vähemmän koodia on parempi kuin enemmän Vähemmän ylläpidettävää Vältä etenkin toistoa Poista käyttämättömiksi jääneet muuttujat/metodit Ymmärrettävyys kuitenkin etusijalla Kapseloi Muutokset itsenäisissä osioissa aiheuttavat vähemmän muutostarvetta muualla Vältä ennakkoehtoja (esim.:) Metodit suoritettava tietyssä järjestyksessä Metodin saa suorittaa vain kerran 11:08

(ei-laajan kurssin kalvo: luento 11 sivu 13) Ylläpidettävyys Kirjoita koodillesi testit Mieti milloin kannattaa testata metodeja, milloin rajapintoja Esim. avaimen lisäys hajatustauluun / pakkaus ja pakkauksen purku Vältä pikapaikkauksia Ne kostautuvat aina jossain välissä Defensive programming 11:08

(ei-laajan kurssin kalvo: luento 11 sivu 14) Defensive Programming Mieti miten kirjoittamaasi metodia tai luokkaa voitaisiin käyttää väärin Todennäköisesti väärinkäyttö johtuu väärinymmärryksestä Koodin käyttäjä kutsuu metodeja A ja B väärässä järjestyksessä Käytetään vääräntyyppisiä parametreja jne...mutta omat ohjelmointivirheetkin saattavat hyvin kutsua metodeja laittomilla arvoilla... ja varaudu näihin tapauksiin Jos mahdollista, rakenna koodi niin että sitä ei voi väärinkäyttää tai tarkista metodien syötteet jne. Helpottaa virheiden löytämistä : Jos metodia kutsutaan väärillä arvoilla, niin virhe ei ilmaannu metodin sisällä -> osataan aloittaa kutsuvasta koodista 11:08

(ei-laajan kurssin kalvo: luento 11 sivu 15) Defensive Programming Työkalut if-lauseet ja poikkeukset Jos metodilla on rajoitteita sen suhteen millaisia parametreja se voi ottaa vastaan, kannattaa ne tarkistaa ja tarvittaessa heittää poikkeus tai palauttaa jokin metodin dokumentaatiossa sovittu arvo. assertiot Pythonissa on PyUnit:in assertxxx komentoja vastaava oma assert -käsky, joka toimii jotakuinkin vastaavalla tavalla. Paikkoihin, joissa muuttujien arvojen tulee ehdottomasti olla tietyissä rajoissa voi kirjoittaa assertioita, jotka katkaisevat ohjelman suorituksen virhetilanteessa. Nämä voi kytkeä pois käännettäessä testaus Kokeile käyttää luokkaasi väärin ja katso ettei se onnistu. 11:08

Ylläpidettävyys Kirjoita itsensä selittävää koodia Valitse muuttujien ym. nimet niin, että ne jo itsessään kertovat käyttötarkoituksen Nimien kierrätys Harkitse tarkkaan Älä kikkaile Usean asian tunkeminen mahdollisimman lyhyeen tilaan voi tuntua hienolta mutta... Kuinka kauan lukijalta menee sen ymmärtämiseen saati sitten muuttamiseen Älä kopioi koodia Sama koodinpätkä parissa paikassa tekemässä hieman eri asioita Yhteinen osuus omaan metodiin 11:08 (ei-laajan kurssin kalvo: luento 11 sivu 16)

(ei-laajan kurssin kalvo: luento 11 sivu 18) PEP 8 Pythonin tyyliohje antaa hyvän pohjan hyvänlaatuiselle koodille: http://www.python.org/dev/peps/pep-0008/ Tuloksena ymmärrettävää koodia Ja näin ollen myös ylläpito helpottuu 11:08