...ja pimeyteen kahlitsee. : ...ja pimeyteen kahlitsee. Enemmistö muutamasta asiaa kommentoineesta kannatti valojen poistamista.
Tänään (A-salissa) ja huomenna (M-salissa) valot hämärretään luennoinnin ajaksi.
Esitä jälleen mielipiteesi puolesta tai vastaan lapuilla.
Päätän pysyvän valopolitiikan A-saliin ensi viikoksi. Kaikki loput luennot ovat A-salissa.
Slide2 : Juha Sorva
etunimi.sukunimi@iki.fi Näillä muuttujilla ja lausekkeillahan voi näköjään tehdä kaikenlaista? Ohjelmoinnin perusteet
Luentomateriaali
Luku 7 eli Listoja, valintaa, logiikkaa, rooleja
Poimintoja 6. luennon palautteesta : Poimintoja 6. luennon palautteesta Miten saan koodinpätkän "suorittumaan uudestaan alusta"?
Toistokäskyllä (luvut 11 ja 12).
Poimintoja 6. luennon palautteesta (2) : Poimintoja 6. luennon palautteesta (2) Voiko ajaa Java-ohjelman "MS-DOSsin näköisessä" tekstipohjaisessa ympäristössä?
Voi. Siitä lisää huomenna. Neuvooko debuggeri miten ohjelman voi korjata?
Ei. Kone ei osaa päätellä sellaista. Voiko muuttujia/olioita olla rajattomia määriä?
Periaatteessa joo, mutta koneen muistiresurssit ovat rajana.
Poimintoja 6. luennon palautteesta (3) : Poimintoja 6. luennon palautteesta (3) Pitääkö this-sanaa aina käyttää viitatessa ilmentymämuuttujiin?
Ei, sen voi monissa yhteyksissä periaatteessa jättää poiskin, jolloin "Java olettaa sen olevan siinä". Tämän kurssin esimerkeissä kuitenkin this-sanaa käytetään aina. (Syitä: ks. tyyliopas kurssisivuilla.) Onko this muuttuja?
Niinkin voi ajatella, sillä sanaa this käytetään aivan muuttujan nimen tapaan ja this-viittaus on tallennettuna pinon kehyksiin muistissa aivan kuin paikalliset muuttujatkin.
this-"muuttujaa" ei kuitenkaan ohjelmoija itse määrittele, vaan this-sana viittaa aina automaattisesti siihen olioon, jonka metodia/konstruktoria parhaillaan suoritetaan. Tarvitseeko käytännön ohjelmoinnissa ajatella muistin jakautuvan pinoon, kekoon, yms.?
Yleensä ei. Kuitenkin näiden muistin osien hahmottaminen voi auttaa hahmottamaan ohjelmien toimintaa (ja luentopalautteen perusteella ilmeisesti osaa auttoikin).
Poimintoja 6. luennon palautteesta (4) : Poimintoja 6. luennon palautteesta (4) Voisiko kurssilla esiin tulleista termeistä saada kattavan käsitekartan/listan/hakemiston?
Luultavasti ei järjesty tähän hätään, sori. Voiko tämän kurssin pohjalta omatoimisesti luoda suht yksinkertaisen kokonaisen ohjelman, esim. pelin?
Joo. Riippuu tietysti pelistä. Grafiikkaa ei käsitellä paljon.
Kuitenkin oman ohjelman suunnittelusta paljon lisää jatkokurssilla, jossa jokainen suunnittelee ja koodaa oman projektin. Luentopalautepisteiden pyöristys?
Ei ole päätetty. Päätetään tentin aikoihin tai jälkeen. Saako jokaisesta palautelapusta aina pisteet?
Ei jos se on käytännössä tyhjä (joskin tällöinkin saa ensin "varoituksen") - ks. kurssisivut.
Aiheita : Aiheita
Tämä nähtiin: User-luokan käyttö : Tämä nähtiin: User-luokan käyttö User testUser = new User();
testUser.addWine(new Wine("Il Barco 2001", "ookoo", 6.69, 6));
testUser.addWine(new Wine("Tollo Rosso", "turhahko", 6.19, 4));
testUser.addWine(new Wine("Estola", "kiva", 7.31, 7));
Wine result = testUser.getFavorite();
System.out.println(result.getName());
Tämä nähtiin: olioiden väliset suhteet : public class User {
private Wine favorite;
// ...Jne...
} Tämä nähtiin: olioiden väliset suhteet
Tähän jäätiin: suhteet moneen olioon : Tähän jäätiin: suhteet moneen olioon Usein kuhunkin tietyntyyppiseen olioon liittyy useita keskenään samantyyppisiä olioita.
Esim. kullakin käyttäjällä on useita maistettuja viinejä
Esim. kullakin opiskelijalla on useita kursseja, joille on ilmoittautunut.
Näiden olioiden lukumäärä ei usein ole vakio eikä etukäteen tiedossa...
Siis ei näin: public class User {
private Wine favorite;
private Wine firstTasted;
private Wine secondTasted;
private Wine thirdTasted;
// ???!!!???
}
Luokka ArrayList : Luokka ArrayList Java-kielen valmis luokka ArrayList kuvaa listoja.
Lista sisältää viittauksia (nollaan tai useampaan) keskenään samantyyppiseen olioon.
Listan sisältämiä olioita kutsutaan listan alkioiksi (engl. element).
Luokka ArrayList on ns. parametrisoitu luokka.
Sitä käytettäessä ilmoitetaan kulmasuluissa, millaisia olioita kyseinen lista sisältää. Esimerkiksi ArrayList. import java.util.ArrayList;
public class User {
private Wine favorite;
private ArrayList tastedWines;
// ...Jne...
} import java.util.ArrayList;
public class Student {
private String name;
private ArrayList ownCourses;
// ...Jne...
}
Listojen käytön alkeita : Listojen käytön alkeita Jotta voimme käyttää ArrayList-luokkaa User-luokan toteutuksessa apuna, täytyy tietää listaluokasta hieman.
Listoille ei anneta varsinaisia konstruktoriparametreja.
Mutta: alkioiden tyyppi ns. tyyppiparametrina kulmasulkuihin!
Listoilla on paljon metodeita. Esimerkiksi:
add lisää parametrina annetun olion listaan.
size palauttaa listan koon eli alkioiden lukumäärän (tyyppiä int).
isEmpty kertoo, onko lista tyhjä (boolean). ArrayList tekstit = new ArrayList();
System.out.println(tekstit.size());
System.out.println(tekstit.isEmpty());
tekstit.add("eka enkeli");
tekstit.add("toka tonkeli");
tekstit.add("kolmas kovanokka");
System.out.println(tekstit.size());
System.out.println(tekstit.isEmpty());
tekstit.add("neljäs neppari");
System.out.println(tekstit.size()); 0
true
3
false
4
User-konstruktori : User-konstruktori package ope.butler;
import java.util.ArrayList;
public class User {
private Wine favorite;
private ArrayList tastedWines;
public User() {
this.tastedWines = new ArrayList();
}
Muista: Jos ilmentymämuuttujaa ei alusteta sijoituslauseella, sille jää oletusalkuarvo.
Esim. tässä ilmentymämuuttujan favorite arvoksi null (eli "ei oliota" tai "viittaus ei mihinkään") User testUser = new User();
Slide14 : Laaditaan aluksi hieman vajavainen versio User-luokan addWine-metodista.
Tämä luonnosversio ei vielä päivitä favorite-muuttujaa mitenkään eikä siis osaa huolehtia suosikkikirjanpidosta.
Miten kirjoittaisit seuraavan pseudokoodin oikeana Javana?
Jos haluat/ehdit, voit jo miettiä myös favorite-muuttujan arvon päivittämistä...
public class User {
private Wine favorite;
private ArrayList tastedWines;
public void addWine(Wine newWine) {
Käske omaa tastedWines-viinilistaasi lisäämään
itseensä parametrina annettu uusi viini (newWine).
}
// ...Jne... Seuraavaksi: esimerkki jatkuu
addWine-metodi: ensimmäinen versio : addWine-metodi: ensimmäinen versio public class User {
private Wine favorite;
private ArrayList tastedWines;
public void addWine(Wine newWine) {
this.tastedWines.add(newWine);
}
// ...Jne...
public class User {
private Wine favorite;
private ArrayList tastedWines;
public void addWine(Wine newWine) {
Käske omaa tastedWines-viinilistaasi lisäämään
itseensä parametrina annettu uusi viini (newWine).
}
// ...Jne...
Uusi rooli: säiliö : Uusi rooli: säiliö Käyttäjän viiniluettelo ei ole muuttumaton kiintoarvo (luku 5) eikä askeltajakaan (luku 6).
tastedWines-listaan lisätään alkioita sitä mukaa, kun päiväkirjaan lisätään merkintöjä.
Rooliltaan säiliöitä (engl. container) ovat muuttujat, joihin kootaan lukuisia alkioita.
Alkioita voi ainakin lisätä säiliöön ja usein poistaakin.
Säiliömuuttujan tietotyypiksi sopii mm. ArrayList-lista, johon voi koota useita alkioita.
Myös esim. joukko- ja taulukkomuuttujat (ks. luvut 11 ja 15) voivat toimia säiliöinä.
addWine-metodi: toinen versio : addWine-metodi: toinen versio Täydennetty pseudokoodiversio addWine-metodista: public class User {
private Wine favorite;
private ArrayList tastedWines;
public void addWine(Wine newWine) {
- Kysy parametrin osoittamalta uudelta viinioliolta, onko se parempi
kuin favorite-muuttujasi osoittama nykyinen suosikkiviini.
- Jos on, niin vaihda favorite-muuttujasi arvoksi viittaus kyseiseen
uuteen viiniin.
- Käske joka tapauksessa omaa tastedWines-viinilistaasi lisäämään
uusi viini itseensä.
}
// ...Jne... Millainen on favorite-muuttujan rooli ohjelmassa?
Kyseessä on eräs tyypillinen muuttujan käyttötapa: halutaan löytää eräässä mielessä "joukon paras yksilö".
So. se arvo, joka parhaiten täyttää tietyn kriteerin.
Esim. paras viini, pienin luku, suurin luku, nuorin opiskelija, heikoin urheilutulos, tms.
Uusi rooli: sopivimman säilyttäjä : Uusi rooli: sopivimman säilyttäjä Sopivimman säilyttäjä (engl. most-wanted holder) on muuttuja, joka pitää kirjaa toistaiseksi "parhaasta" arvosta.
Sen arvoa vaihdetaan, kun löytyy parempi.
Koodissa sopivimman säilyttäjälle on tyypillistä tämänkaltainen rakenne: Tarvitaan keino ehdolliseen käskyjen suorittamiseen: "jos... niin...".
"Jos uusi viini oli parempi kuin entinen suosikki...". jos uusi tarjokas on sopivampi kuin SS:n vanha arvo,
niin korvataan SS:n vanha arvo uudella tarjokkaalla
if-valintalause : if (mariahCareyTekeeHyvaaMusaa) {
System.out.println("Maailmanloppu on lähellä.");
} if-valintalause Valintalauseella if voidaan määrätä käsky ehdollisesti suoritettavaksi.
if-lauseen toimintatapa:
evaluoidaan ehtolauseke, jonka on oltava boolean-tyyppinen.
edetään ehdollisesti suoritettavaan osaan vain siinä tapauksessa, että ehtolausekkeen arvo oli true. if (ehtolauseke) {
ehdollisesti suoritettava osa
}
boolean-lausekkeista : boolean-lausekkeista if (age > 17) {
System.out.println("age-muuttujan arvo on yli 17.");
} if (lista.isEmpty()) {
System.out.println("Tyhjää täynnä!");
} if (true) {
System.out.println("Tämä tulostuu varmasti.");
} if (false) {
System.out.println("Tämä ei tulostu.");
} Myös muunlaiset boolean-lausekkeet kelpaavat ehtolausekkeiksi kuin muuttujannimet.
boolean-palautusarvoisen metodin kutsu (kutsutaan metodia, sitten katsotaan palauttiko se true):
Vertailujen tulokset:
Literaalit (tästä tosin on tuskin suurempaa hyötyä):
addWine-metodi: toinen versio Javalla : public class User {
private Wine favorite;
private ArrayList tastedWines;
public void addWine(Wine newWine) {
if (newWine.isBetterThan(this.favorite)) {
this.favorite = newWine;
}
this.tastedWines.add(newWine);
}
// ...Jne...
addWine-metodi: toinen versio Javalla Toteutetaan edellä pseudokoodina luonnosteltu algoritmi Javalla. public class User {
private Wine favorite;
private ArrayList tastedWines;
public void addWine(Wine newWine) {
- Kysy parametrin osoittamalta uudelta
viinioliolta, onko se parempi kuin favorite-
muuttujasi osoittama nykyinen suosikkiviini.
- Jos on, niin vaihda favorite-muuttujasi
arvoksi viittaus kyseiseen uuteen viiniin.
- Käske joka tapauksessa omaa tastedWines-
viinilistaasi lisäämään uusi viini itseensä.
}
// ...Jne... Mutta: jos tätä metoditoteutusta kokeilee ajaa, näytölle ilmestyy virheilmoitus NullPointerException... Miksi?
addWine-metodi: korjaus : Kun ensimmäinen viini lisätään, on favorite-ilmentymämuuttujan arvona vielä null.
Kun uuden viinin arvosanaa yritetään verrata edellisen suosikin arvosanaan, syntyy ohjelman kaatava ajonaikainen poikkeustilanne: moista edellistä suosikkia ei ole eikä sen arvosanaa siis voi tutkia.
Ohjelmassamme on siis toimintavirhe eli bugi.
Ohjelma on kieliopillisesti oikeaa Javaa. Virhe ilmenee vasta ohjelmaa ajettaessa.
Vrt. syntaksivirhe, joka estää ohjelman ajamisen kokonaan.
Muotoillaan pseudokoodimme huomioimaan tämä. public void addWine(Wine newWine) {
- Jos et ole aiemmin maistanut mitään viinejä tai jos
parametrin osoittama uusi viini on parempi kuin
nykyinen suosikkisi, niin vaihda favorite-muuttujasi
arvoksi viittaus kyseiseen uuteen viiniin.
- Käske joka tapauksessa omaa tastedWines-
viinilistaasi lisäämään uusi viini itseensä.
} addWine-metodi: korjaus
Slide23 : Seuraavaksi: loogiset operaattorit
Loogiset operaattorit : int luku = 12;
if (luku <= -10 || luku >= 10) {
System.out.println("Itseisarvo on ainakin kymmenen.");
} Loogiset operaattorit Java-kieli tarjoaa totuusarvojen yhdistelyyn neljä loogista operaattoria, joiden avulla voi rakentaa monimutkaisempia boolean-lausekkeita.
Loogisten operaattorien operandeina on totuusarvoisia lausekkeita ja ne myös tuottavat boolean-arvon.
&& ja (engl. and)
molemmat väitteet tosia
|| tai (engl. or)
ainakin toinen väite tosi
^ poissulkeva tai
(engl. exclusive or, xor)
tasan yksi väitteistä tosi
! negaatio (engl. negation)
vaihdetaan yhden väitteen
totuusarvo
Loogisten operaattorien yhdisteleminen : if ((luku > 0 && luku % 2 == 0) || luku < 20) {
System.out.println("Joko positiivinen ja parillinen, tai 20:ä pienempi.");
}
if (luku > 0 && (luku % 2 == 0 || luku < 20)) {
System.out.println("Positiivinen, ja joko parillinen tai 20:ä pienempi.");
} if (jakaja != 0 && jaettava / jakaja < 100) {
System.out.println("Lukujen suhde on alle 100.");
} Loogisten operaattorien yhdisteleminen &&- ja ||-operaattorit ovat ehdollisia.
Ensimmäinen operandi tutkitaan ensin. Mikäli se yksin riittää määräämään koko lausekkeen totuusarvon, ei toista operandilauseketta evaluoida lainkaan. if (jaettava / jakaja > 1000000 || jakaja == 0) {
System.out.println("Lukujen suhde on yli 1000000.");
} if (jakaja == 0 || jaettava / jakaja > 1000000) {
System.out.println("Lukujen suhde on yli 1000000.");
}
addWine-metodi: valmis versio : addWine-metodi: valmis versio public void addWine(Wine newWine) {
if (this.tastedWines.isEmpty() || newWine.isBetterThan(this.favorite)) {
this.favorite = newWine;
}
this.tastedWines.add(newWine);
} public void addWine(Wine newWine) {
if (this.favorite == null || newWine.isBetterThan(this.favorite)) {
this.favorite = newWine;
}
this.tastedWines.add(newWine);
} Tarinan opetus:
Edellä korjattu ohjelmavirhe on tyypillinen huolimattomuusvirhe, joka syntyy kun käytetään muuttujaa sopivimman säilyttäjänä.
On tärkeää muistaa ottaa huomioon sopivimman säilyttäjän alkuarvo.
Alkuarvo pitää joko asettaa sopivaksi tai oletusalkuarvo pitää huomioida arvoa päivitettäessä.
Luokkakirjastot : Luokkakirjastot Jotkin luokat ovat hyvin yleiskäyttöisiä.
Esim. String, ArrayList
Yleiskäyttöisiä luokkia sisältävät pakkaukset voivat toimia luokkakirjastoina (yleisemmin: ohjelmakirjastoina).
Kirjastoista löytyviä luokkia voi käyttää muiden ohjelmien osina.
Jos luokkakirjasto on riittävän yleiskäyttöinen, voi sen julkaista, jolloin muutkin ohjelmoijat voivat hyödyntää sitä.
Ilmeisin hyöty on, että vältytään kirjoittamasta samanlaista ohjelmakoodia useaan kertaan.
Ohjelmoidessa käytännössä aina käytetään apuna ainakin jotain muiden kirjoittamia luokkakirjastoja.
Monesti myös luodaan omia apukirjastoja.
Java-ohjelmissa käytetään apuna Javan peruskirjastoja, joissa on erinäisiä hyvin yleiskäyttöisiä luokkia.
Näkyy Eclipse-projektissa mainintana JRE System Library.
Java API : Java API Java-kielen yhteyteen on määritelty lukuisia valmiita pakkauksia. Ne sisältävät valmiita luokkia yleisiin ohjelmointitarpeisiin. Esimerkiksi:
Java-kielen keskeisin välineistö: java.lang
tiedostonkäsittely (ja muuta): java.io
verkkoliikenne: java.net
sekalaisia käteviä luokkia: java.util
Näihin pakkauksiin viitataan usein nimellä the (standard) Java API.
API = Application Programming Interface
Kurssin mittaan tutustutaan moniin Java API:n luokkiin.
Kirjastokokonaisuus on hyvin iso; läheskään kaikkeen ei ehditä eikä olisi mielekästäkään tutustua.
Erikoispakkaus java.lang : Erikoispakkaus java.lang String-luokka kuuluu Java-kieleen valmiiksi määriteltyyn pakkaukseen java.lang.
Pakkauksen java.lang sisältö katsotaan kiinteäksi osaksi Java-kieltä (lang eli language).
Tämän erikoispakkauksen luokkia ei tarvitse ilmoittaa käytettäviksi import-käskyllä.
Tiedoston alkuun voisi kyllä kirjoittaa import java.lang.String, mutta se ei ole tarpeen.
ArrayList-luokka taas on pakkauksessa java.util.
Sen joutuu erikseen ottamaan käyttöön import-määrittelyllä.
Account-projekti : Account-projekti Projekti Account kuvaa pankkitilien ja niitä omistavien pankkiasiakkaiden perustietoja.
Tarkastellaan luokkia ensin "ulkoa käsin" ennen kuin tutkitaan niiden sisäistä toteutusta.
Asiakkaita kuvaa luokka ope.account.Customer.
Asiakkaiden tietoja (asiakastunnus, nimi, onko arvoasiakas) voi kysyä tietyillä metodeilla; nimeä voi vaihtaa.
Tilejä kuvaa luokka ope.account.Account.
Tilin saldoa ja asiakasta voi kysyä tietyillä metodeilla; tilille voi panna rahaa; tililtä voi nostaa rahaa; tililtä voi tehdä tilisiirron toiselle tilille.
Account Kokeile olioiden luomista ja niiden metodeita Interactions Panessa.
Customer-luokka: 1. luonnos : public class Customer {
public Customer(int id, String name) {
}
public int getID() {
}
// ... public class Customer {
private int id;
public Customer(int id, String name) {
}
public int getID() {
}
// ... public class Customer {
private int id;
public Customer(int id, String name) {
this.id = id;
}
public int getID() {
}
// ... public class Customer {
private int id;
public Customer(int id, String name) {
this.id = id;
}
public int getID() {
return this.id;
}
// ... Customer-luokka: 1. luonnos
Customer-luokka: nimen tallentaminen : Customer-luokka: nimen tallentaminen Asiakkaan nimeä pitää voida muuttaa setName-metodilla.
Tämä on hyvin tyypillinen ohjelmissa esiintyvä vaatimus: jollekin olion ominaisuudelle pitää voida asettaa uusi arvo metodia kutsumalla.
Nimen tallentamiseen ei kelpaa pelkkä kiintoarvo.
Muuttujaan täytyy sijoittaa aina viimeisin nimi, joka asiakkalle on asetettu.
Aiemmat name-muuttujan arvot eivät jää mihinkään talteen ja lakkaavat vaikuttamasta muuttujaan kun ne on korvattu uudella.
Tämä muuttujan käyttötapa ei täysin vastaa mitään vielä opittua muuttujaroolia.
Tavallaan kyseessä on sopivimman säilyttäjä, jos ajatellaan että "sopivin" on aina viimeisin asetettu arvo.
Slide33 : Seuraavaksi: esimerkki jatkuu Miten toteuttaisit metodin setName? public class Customer {
private int id;
private String name;
public Customer(int id, String name) {
this.id = id;
this.name = name;
}
public int getID() {
return this.id;
}
public String getName() {
return this.name;
}
public void setName(String newName) {
// MITÄ TÄNNE?
} Millä nimellä kutsuisit muuttujan name roolia/käyttötapaa ohjelmassa?
Kiintoarvo? Askeltaja? Säiliö? Sopivimman säilyttäjä? Jotain muuta? public class Customer {
private int id;
private String name;
public Customer(int id, String name) {
this.id = id;
this.name = name;
}
public int getID() {
return this.id;
}
public String getName() {
return this.name;
}
public void setName(String newName) {
this.name = newName;
}
Uusi rooli: tuoreimman säilyttäjä : Uusi rooli: tuoreimman säilyttäjä Ilmentymämuuttuja name on rooliltaan tuoreimman säilyttäjä (engl. most-recent holder).
Se pitää kirjaa arvosekvenssin viimeisimmästä arvosta (viimeisin nimi, joka on asetettu asiakkaalle).
Sen arvo vaihtuu aina, kun arvosarjassa kohdataan uusi arvo (asiakkaalle asetetaan uusi nimi). Autoi
Tuoreimman säilyttäjä (2) : Tuoreimman säilyttäjä (2) Nyt kohdattu name-muuttuja on erittäin tyypillinen tapaus tuoreimman säilyttäjästä.
Monet tuoreimman säilyttäjä-ilmentymämuuttujat toimivat juuri näin: pidetään tallessa tietty olion ominaisuuden arvo, kunnes metodikutsulla asetetaan ominaisuudelle uusi arvo.
Muunlaisiakin käyttöjä tuoreimman säilyttäjälle nähdään jatkossa.
Sopivimman säilyttäjästä tuoreimman säilyttäjä eroaa siten, että siihen ei liity ehtoa, joka vertaa onko uusi arvo jotenkin sopivampi kuin aiempi.
Esim. ei verrata onko uusi nimi "parempi" kuin edellinen.
Account-luokka: pseudokoodia : Account-luokka: pseudokoodia public class Account {
private Customer owner;
private double balance;
public Account(Customer owner) {
this.owner = owner;
this.balance = 0;
}
public double getBalance() {
return this.balance;
}
public void deposit(double amount) {
- Laske "vanha saldo plus annettu määrä" ja
sijoita tulos saldon uudeksi arvoksi.
}
public void withdraw(double amount) {
- Laske "vanha saldo miinus annettu määrä" ja
sijoita tulos saldon uudeksi arvoksi.
}
// ...
Saldon päivitys Javalla : Saldon päivitys Javalla
public void deposit(double amount) {
- Laske "vanha saldo plus annettu määrä" ja
sijoita tulos saldon uudeksi arvoksi.
}
public void withdraw(double amount) {
- Laske "vanha saldo miinus annettu määrä" ja
sijoita tulos saldon uudeksi arvoksi.
}
public void deposit(double amount) {
this.balance = this.balance + amount;
}
public void withdraw(double amount) {
this.balance = this.balance - amount;
}
Uusi rooli: kokoaja : Uusi rooli: kokoaja Ilmentymämuuttuja balance on rooliltaan kokoaja (engl. gatherer).
Se kokoaa yhteen jonkin arvojen sekvenssin yhteisvaikutuksen.
Arvo koostetaan lukuisia data-arvoja jollain tapaa yhdistämällä.
Esim. tililtä otettujen ja sinne pantujen rahamäärien summa (eli tilin saldo). 42
Kokoaja (2) : Kokoaja (2) Nyt nähdyssä esimerkissä uuden arvon määräävä kaava on aritmeettinen.
Tämä on varsin tyypillistä, mutta muunlaisiakin kokoajia on. Esimerkiksi:
Sijainti, joka on liikkeiden sekvenssin seuraamus.
Merkkijono, joka on osiensa yhteenliittymä.
Kuten askeltajankin, myös kokoajan uusi arvo riippuu aina sen vanhasta arvosta.
Esim. saldomuuttujaan ei sijoiteta vain uutta muualla määritettyä saldon arvoa, vaan uusi arvo lasketaan vanhan arvon ja otto- tai panorahasumman perusteella.
Kuitenkaan kokoajan arvo ei seuraa ennalta määrättyä sekvenssiä vaan riippuu jostain ulkoisista tekijöistä (esim. annetuista syötteistä).
Askeltajan ja kokoajan välinen ero on häilyvä.
Epäselvissä tapauksissa ei ole välttämättä tärkeää "määrätä" kummasta on kyse.
Muuttujaroolien tarkoitus on auttaa hahmottamaan ja suunnittelemaan ohjelmia, ei tarjota dogmaattisia totuuksia.
Saman luokan metodien hyödyntäminen : Saman luokan metodien hyödyntäminen public void transferTo(Account anotherAccount, double amount) {
this.balance = this.balance - amount;
anotherAccount.balance = anotherAccount.balance + amount;
} public void transferTo(Account anotherAccount, double amount) {
this.withdraw(amount);
anotherAccount.deposit(amount);
} Kannattaa muistaa hyödyntää olion omia metodeita, kun mahdollista.
Näin vältytään keksimästä pyörää uudelleen joka metodissa ja voidaan tehdä koodista vähemmän toisteista ja helpommin muokattavaa.
Vertaa:
Slide41 : Ensi kerralla Seuraava luento huomenna 21.9. M-salissa.
Silloin muun muassa:
Puhutaan siitä mitä Eclipse tekee automaattisesti saadakseen ohjelman ajettua.
Muista Javatyökaluista (esim. kääntäjä, virtuaalikone).