Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Osa 8 pieniä korjauksia #67

Open
wants to merge 18 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion data/osa-8/1-oliot-ja-metodit.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ Useimmissa muissa ohjelmointikielissä on olioiden lisäksi ns. perustyyppisiä

## Oliot ja metodit

Olioiden tietosisältöä voidaaan havainnoida ja muuttaa _metodien_ avulla. Metodi on funktio, jonka toiminta kohdistuu annettuun olioon. Metodin erottaa muista funktioista tapa, jolla sitä kutsutaan: ensin kirjoitetaan kohdeolio ja sen perään kutsuttava metodi pisteellä erotettuna. Esimerkiksi sanakirja-olion kaikki arvot voidaan palauttaa metodin `values` avulla:
Olioiden tietosisältöä voidaan havainnoida ja muuttaa _metodien_ avulla. Metodi on funktio, jonka toiminta kohdistuu annettuun olioon. Metodin erottaa muista funktioista tapa, jolla sitä kutsutaan: ensin kirjoitetaan kohdeolio ja sen perään kutsuttava metodi pisteellä erotettuna. Esimerkiksi sanakirja-olion kaikki arvot voidaan palauttaa metodin `values` avulla:

```python
# muodostetaan sanakirjatyyppinen kirjaolio
Expand Down
6 changes: 3 additions & 3 deletions data/osa-8/2-luokat-ja-oliot.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ print(puolikas + kolmasosa)

</sample-output>

Esimerkistä huomataan, että konstuktorikutsut poikkeavat aiemmista metodikutsuista. Konstruktorikutsuja ei ole sidottu tiettyyn olioon (mikä on sikäli loogista, että olio muodostetaan kutsumalla konstruktoria). Lisäksi metodin nimi on kirjoitettu isolla alkukirjaimella: `puolikas = Fraction(1,2)`. Pureudutaan tarkemmin olion muodostamisen mekanismiin esittelemällä _luokan_ käsite.
Esimerkistä huomataan, että konstruktorikutsut poikkeavat aiemmista metodikutsuista. Konstruktorikutsuja ei ole sidottu tiettyyn olioon (mikä on sikäli loogista, että olio muodostetaan kutsumalla konstruktoria). Lisäksi metodin nimi on kirjoitettu isolla alkukirjaimella: `puolikas = Fraction(1,2)`. Pureudutaan tarkemmin olion muodostamisen mekanismiin esittelemällä _luokan_ käsite.

## Luokka on olion käsikirjoitus

Expand Down Expand Up @@ -264,7 +264,7 @@ Maito
Myös seuraava onnistuu:

```python
# kauppalistalla tuotteet on indeksöity ykkösestä alkaen
# kauppalistalla tuotteet on indeksoitu ykkösestä alkaen
for i in range(1, kauppalista.tuotteita()+1):
tuote = kauppalista.tuote(i)
maara = kauppalista.maara(i)
Expand Down Expand Up @@ -301,6 +301,6 @@ if __name__ == "__main__":

</sample-output>

**Huom** koska luokan `Kauppalista` koodi on tehtäväpohjassa valmiina, ei koodissa tarvitse käyttää `import`-lausetta kuten edellisissä esimerkeissä, tehtävissä, jotka käyttävät Pythonin valmiita luokkia `Fraction` ja `date`.
**Huom** koska luokan `Kauppalista` koodi on tehtäväpohjassa valmiina, ei koodissa tarvitse käyttää `import`-lausetta kuten edellisissä esimerkeissä ja tehtävissä, jotka käyttivät Pythonin valmiita luokkia `Fraction` ja `date`.

</programming-exercise>
2 changes: 1 addition & 1 deletion data/osa-8/3-omat-luokat.md
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@ def avaa_tili(nimi: str):
uusi_tili = Pankkitili(0, nimi)
return uusi_tili

# funktio asettaa parametrina saamansa rahasumman parametrina olevalle tilille
# funktio lisää parametrina saamansa rahasumman parametrina olevalle tilille
def laita_rahaa_tilille(tili: Pankkitili, summa: int):
tili.saldo += summa

Expand Down
4 changes: 2 additions & 2 deletions data/osa-8/4-metodit-omissa-luokissa.md
Original file line number Diff line number Diff line change
Expand Up @@ -378,11 +378,11 @@ class Bonuskortti:

Kirjoita luokka `Henkilo`, jolla on _ainoastaan yksi attribuutti_ `nimi`, joka asetetaan konstruktorissa.

Lisäksi luokalle tule kirjoitaa kaksi metodia:
Lisäksi luokalle tule kirjoittaa kaksi metodia:

Metodi `anna_etunimi` palauttaa henkilön etunimen ja metodi `anna_sukunimi` vastaavasti henkilön sukunimen.

Voit olettaa metodeissa, että konstruktroissa annetussa nimessä on etu- ja sukunimi välilyönnillä erotettuna eikä muita nimiä.
Voit olettaa metodeissa, että konstruktorissa annetussa nimessä on etu- ja sukunimi välilyönnillä erotettuna eikä muita nimiä.

Esimerkki luokan käytöstä:

Expand Down
2 changes: 1 addition & 1 deletion data/osa-8/5-lisaa-esimerkkeja.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ suorakulmio = Suorakulmio((1, 1), (4, 3))
print(suorakulmio)
```

Ohjelma tulostaa jotain seuraavankaltaista:
Ohjelma tulostaa jotain seuraavan kaltaista:

<sample-output>

Expand Down
6 changes: 3 additions & 3 deletions data/osa-9/1-oliot-ja-viitteet.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ Tämän osion jälkeen

</text-box>

Pythonissa kaikki arvot ovat olioita ja myös omista luokista luotuja olioita voi käsitellä kuin mitä tahansa muitakin olioita. Esimerkiksi olioita voidaan tallentaa listaan:
Pythonissa kaikki arvot ovat olioita, ja myös omista luokista luotuja olioita voi käsitellä kuin mitä tahansa muitakin olioita. Esimerkiksi olioita voidaan tallentaa listaan:

```python
from datetime import date
Expand Down Expand Up @@ -620,7 +620,7 @@ Punnituksia tehty 6

<programming-exercise name='Maksukortti ja kassapääte' tmcname='osa09-04_maksukortti_ja_kassapaate'>

Teimme edellisessä osan [tehtävässä](/osa-8/5-lisaa-esimerkkeja#programming-exercise-maksukortti) luokan `Maksukortti`. Kortilla oli metodit edullisesti ja maukkaasti syömistä sekä rahan lataamista varten.
Teimme edellisen osan [tehtävässä](/osa-8/5-lisaa-esimerkkeja#programming-exercise-maksukortti) luokan `Maksukortti`. Kortilla oli metodit edullisesti ja maukkaasti syömistä sekä rahan lataamista varten.

Edellisen osan tyylillä tehdyssä `Maksukortti`-luokassa oli kuitenkin ongelma. Kortti tiesi lounaiden hinnan ja osasi sen ansiosta vähentää saldoa oikean määrän. Entä kun hinnat nousevat? Tai jos myyntivalikoimaan tulee uusia tuotteita? Hintojen muuttaminen tarkoittaisi, että kaikki jo käytössä olevat kortit pitäisi korvata uudet hinnat tuntevilla korteilla.

Expand Down Expand Up @@ -934,7 +934,7 @@ class Henkilo:

<programming-exercise name='Asuntovertailu' tmcname='osa09-05_asuntovertailu'>

Asuntovälitystoimiston tietojärjestelmässä kuvataan myynnissä olevaa asuntoa seuraavasta luokasta tehdyillä olioilla:
Asuntovälitystoimiston tietojärjestelmässä kuvataan myynnissä olevia asuntoja seuraavasta luokasta tehdyillä olioilla:

```python
class Asunto:
Expand Down
4 changes: 2 additions & 2 deletions data/osa-9/2-oliot-attribuuttina.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ Edellisessä tehtävässä oletettiin, että luokat on määritelty omissa tiedo
_Esitellään aluksi luokka Kurssi, joka on määritelty tiedostossa kurssi.py_
ja importin tarve siis johtuu tästä.

Jos kaikki koodi sijoitetaan samaan tiedostoon, kuten kaikissa kurssin ohjelmointitehtävissä ohjeistetaan, **et tarvitse** `import`:ia luomiesi luokkien käytöön.
Jos kaikki koodi sijoitetaan samaan tiedostoon, kuten kaikissa kurssin ohjelmointitehtävissä ohjeistetaan, **et tarvitse** `import`:ia luomiesi luokkien käyttöön.

Jos siis päädyt kirjottamaan kurssilla seuraavanlaista koodia

Expand Down Expand Up @@ -156,7 +156,7 @@ Leevi, kaverina Hulda, joka on sekarotuinen koira

Äskeisissä esimerkeissä oliolla oli attribuuttina yksittäinen toisen luokan olio, esim. henkilöllä attribuuttina lemmikki ja opintosuorituksella attribuuttina kurssi.

Olio-ohjelmoinnissa törmätään kutenkin usein tilanteeseen, jossa oliolla on attribuuttina _joukko_ toisen luokan olioita. Eräs tälläinen tilanne kuvaa joukkueen ja sen pelaajien välistä yhteyttä:
Olio-ohjelmoinnissa törmätään kutenkin usein tilanteeseen, jossa oliolla on attribuuttina _joukko_ toisen luokan olioita. Eräs tällainen tilanne kuvaa joukkueen ja sen pelaajien välistä yhteyttä:

```python
class Pelaaja:
Expand Down
8 changes: 4 additions & 4 deletions data/osa-9/3-kapselointi.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ class Pankkikortti:
self.nimi = nimi
```

Piilotettu attribuutti ei näy asiakkaalle, vaan siihen viittaaminen aiheutta virheilmoituksen. Niinpä nimen voi tulostaa ja sitä voi muuttaa:
Piilotettu attribuutti ei näy asiakkaalle, vaan siihen viittaaminen aiheuttaa virheilmoituksen. Niinpä nimen voi tulostaa ja sitä voi muuttaa:

```python
kortti = Pankkikortti("123456","Reijo Rahakas")
Expand Down Expand Up @@ -155,7 +155,7 @@ Saldoa ei voi suoraan muuttaa, koska attribuutti on piilotettu, mutta sitä voi

<programming-exercise name='Auto' tmcname='osa09-09_auto'>

Toteuta luokka `Auto`, jossa on _kapseloituina attribuutteina_ tieto bensatankin sisällöstä (0-60 litraa) sekä ajetuista kilometreista. Auto kuluttaa litran bensaa kilometrillä.
Toteuta luokka `Auto`, jossa on _kapseloituina attribuutteina_ tieto bensatankin sisällöstä (0-60 litraa) sekä ajetuista kilometreistä. Auto kuluttaa litran bensaa kilometrillä.

Luokalla on seuraavat metodit:

Expand Down Expand Up @@ -419,8 +419,8 @@ Yhteensä 3 merkintää

Kirjoita luokka `Havaintoasema`, johon voidaan tallentaa säähavaintoja. Luokalla on seuraavat julkiset piirteet:

* konstruktori, joka saa parametriksen aseman nimen
* metodi `lisaa_havainto(havainto: str)`, joka lisää havainnon listan peräään
* konstruktori, joka saa parametrikseen aseman nimen
* metodi `lisaa_havainto(havainto: str)`, joka lisää havainnon listan perään
* metodi `viimeisin_havainto()`, joka palauttaa viimeksi lisätyn havainnon. Jos havaintoja ei ole tehty, metodi palauttaa _tyhjän merkkijonon_.
* metodi `havaintojen_maara()`, joka palauttaa havaintojen yhteismäärän
* metodi `__str__`, joka palauttaa aseman nimen ja havaintojen yhteismäärän alla olevan esimerkin mukaisessa muodossa.
Expand Down
6 changes: 3 additions & 3 deletions data/osa-9/5-staattiset-piirteet.md
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ Muuta toiminnallisuutta ei tarvitse toteuttaa.

Luokkametodi eli staattinen metodi on luokassa oleva metodi, jota ei ole sidottu mihinkään luokasta muodostettuun olioon. Niinpä luokkametodia voi kutsua ilman, että luokasta muodostetaan oliota.

Luokkametodit ovat yleensä työkalumetodeja, jotka liittyvät jotenkin luokkaan mutta joita on tarkoituksenmukaista kutsua ilman olion muodostamista. Luokkametodit ovat yleensä julkisia, jolloin niitä voidaan kutsua sekä luokan ulkopuolelta että luokan ja siitä muodostettujen olioiden sisältä.
Luokkametodit ovat yleensä työkalumetodeja, jotka liittyvät jotenkin luokkaan, mutta joita on tarkoituksenmukaista kutsua ilman olion muodostamista. Luokkametodit ovat yleensä julkisia, jolloin niitä voidaan kutsua sekä luokan ulkopuolelta että luokan ja siitä muodostettujen olioiden sisältä.

Luokkametodi merkitään annotaatiolla `@classmethod` ja sen ensimmäinen parametri on aina `cls`. Tunnistetta `cls` käytetään samaan tapaan kuin tunnistetta `self`, mutta erotuksena on, että `cls` viittaa luokkaan ja `self` viittaa olioon. Kummallekaan parametrille ei anneta kutsuessa arvoa, vaan Python tekee sen automaattisesti.

Expand Down Expand Up @@ -305,14 +305,14 @@ Tämä on validi tunnus!

</sample-output>

Rekisteriotteen oikeellisuuden voi tarkistaa kutsumalla metodia (esimerkiksi `Rekisteriote.rekisteritunnus_kelpaa("xyz-789"))`) ilman, että muodostaa luokasta oliota. Samaa metodia kutsutaan myös uutta oliota muodostaessa luokan konstruktorista. Huomaa kuitenkin, että myös tässä kutsussa viitataan metodiin luokan nimen avulla eikä `self`-tunnisteella!
Rekisteriotteen oikeellisuuden voi tarkistaa kutsumalla metodia (esimerkiksi `Rekisteriote.rekisteritunnus_kelpaa("xyz-789"))`) ilman, että muodostaa luokasta oliota. Samaa metodia kutsutaan myös luokan konstruktorista muodostettaessa uutta oliota. Huomaa kuitenkin, että myös tässä kutsussa viitataan metodiin luokan nimen avulla eikä `self`-tunnisteella!

<programming-exercise name='Lista-apuri' tmcname='osa09-14_lista_apuri'>

Kirjoita luokka `ListaApuri`, jossa on seuraavat kaksi luokkametodia:

* Metodi `suurin_frekvenssi(lista: list)` palauttaa alkion, jota esiintyy annetussa listassa eniten
* Metodi `tuplia(lista: list)` palauttaa sellaisten alkioden lukumäärän, jotka esiintyvät listassa vähintään kahdesti
* Metodi `tuplia(lista: list)` palauttaa sellaisten alkioiden lukumäärän, jotka esiintyvät listassa vähintään kahdesti

Metodeja tulee voida käyttää ilman, että luokasta luodaan oliota. Esimerkki luokan käytöstä:

Expand Down
4 changes: 2 additions & 2 deletions data/osa-9/6-lisaa-esimerkkeja.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,9 +105,9 @@ Pythonissa mille tahansa parametrille voidaan asettaa oletusarvo. Oletusarvoja v

Jos parametrille on annettu oletusarvo, sille ei ole pakko antaa arvoa kutsuttaessa. Jos arvo annetaan, se syrjäyttää oletusarvon, ja jos arvoa ei anneta, käytetään oletusarvoa.

Oletusarvot ovat usein hyödyllisiä konstruktoreissa: jos on oletettavaa, ettei tiettyä tietoa ole aina olemassa oliota luodessa, on parempi antaa sille vakioarvo konstruktorissa kuin antaa tämä asiakkaan huoleksi. Tämä on asiakkaalle helpompaa ja myös ylläpitää olion sisäistä eheyttä, kun voidaan esimerkiksi olla varmoja, että "tyhjä" arvo on aina samanlainen (muuten se voisi olla esimerkiksi merkkijono `""`, arvo `None` tai merkkijono `"ei asetettu"`).
Oletusarvot ovat usein hyödyllisiä konstruktoreissa: jos on oletettavaa, ettei tiettyä tietoa ole aina olemassa oliota luodessa, on parempi antaa sille vakioarvo konstruktorissa kuin jättää tämä asiakkaan huoleksi. Tämä on asiakkaalle helpompaa ja myös ylläpitää olion sisäistä eheyttä, kun voidaan esimerkiksi olla varmoja, että "tyhjä" arvo on aina samanlainen (muuten se voisi olla esimerkiksi merkkijono `""`, arvo `None` tai merkkijono `"ei asetettu"`).

Tarkastellaan esimerkkinä luokkaa, joka mallintaa opiskelijaa. Pakollisia kenttiä luodessa ovat opiskelijanumero ja nimi ja näistä opiskelijanumeroa ei pysty myöhemmin muuttamaan. Opintopisteet ja muistiinpanot voi halutessaan antaa oliota luodessa, mutta niille on myös asetettu oletusarvot. Luokan toiminta on kommentoitu suoraan ohjelmakoodin yhteyteen.
Tarkastellaan esimerkkinä luokkaa, joka mallintaa opiskelijaa. Pakollisia kenttiä uutta opiskelijaa luodessa ovat opiskelijanumero ja nimi, ja näistä opiskelijanumeroa ei pysty myöhemmin muuttamaan. Opintopisteet ja muistiinpanot voi halutessaan antaa oliota luodessa, mutta niille on myös asetettu oletusarvot. Luokan toiminta on kommentoitu suoraan ohjelmakoodin yhteyteen.

```python
class Opiskelija:
Expand Down
2 changes: 1 addition & 1 deletion src/locales/common/fi.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"endReached":"",
"continueToNext":"Seuraava osa:",
"continueToNext":"Seuraava osio:",
"rememberToCheckPoints":"",
"footer-src":"Materiaalin lähdekoodi",
"footer-edit-page":"Muokkaa sivua",
Expand Down