• Ei tuloksia

Esimerkki: Esimerkki: PinoPino 1(3) 1(3)

N/A
N/A
Info
Lataa
Protected

Academic year: 2022

Jaa "Esimerkki: Esimerkki: PinoPino 1(3) 1(3)"

Copied!
3
0
0

Kokoteksti

(1)

Sopimuspohjainen olio-ohjelmointi

Sopimuspohjainen olio-ohjelmointi 2008-03-11 2008-03-11

(c) 2006-2008 Jouni Smed

(c) 2006-2008 Jouni Smed 1 1

Esimerkki:

Esimerkki: Pino Pino 1(3) 1(3)

/** Pino on alkiokokoelma, joka noudattaa /** Pino on alkiokokoelma, joka noudattaa * LIFO-käyttäytymistä.

* LIFO-käyttäytymistä.

*/

*/

public interface public interface PinoPino<T> {<T> { //-- Havainnointioperaatiot //-- Havainnointioperaatiot /** Palauttaa alkioiden määrän.

/** Palauttaa alkioiden määrän.

* @.pre true * @.pre true * @.post RESULT ==

* @.post RESULT ==

*

* (pinossa olevien alkioiden lukumäärä)(pinossa olevien alkioiden lukumäärä) */

*/

public int public int annaKoko();annaKoko();

/** Palauttaa pinon päällimmäisen alkion.

/** Palauttaa pinon päällimmäisen alkion.

* @.pre !onTyhjä() * @.pre !onTyhjä()

* @.post RESULT == (pinon päällimmäinen alkio) * @.post RESULT == (pinon päällimmäinen alkio) */

*/

publicpublic T päällimmäinen(); T päällimmäinen();

Esimerkki:

Esimerkki: Pino Pino 2(3) 2(3)

/** Palauttaa pinon alimmaiset alkiot./** Palauttaa pinon alimmaiset alkiot.

* @.pre !onTyhjä() * @.pre !onTyhjä()

* @.post RESULT == (pinon alimmaiset alkiot pinona) * @.post RESULT == (pinon alimmaiset alkiot pinona) */

*/

publicpublic PinoPino<T> alimmaiset();<T> alimmaiset();

/** Tarkistaa onko pino tyhjä.

/** Tarkistaa onko pino tyhjä.

* @.pre true * @.pre true

* @.post RESULT == (annaKoko() == 0) * @.post RESULT == (annaKoko() == 0) */

*/

public booleanpublic boolean onTyhjä(); onTyhjä();

/** Tarkistaa onko pino täysi.

/** Tarkistaa onko pino täysi.

* @.pre true * @.pre true

* @.post RESULT == (pinoon mahtuu vielä alkioita) * @.post RESULT == (pinoon mahtuu vielä alkioita) */

*/

public boolean public boolean onTäysi();onTäysi();

Esimerkki:

Esimerkki: Pino Pino 3(3) 3(3)

//-- Muutosoperaatiot //-- Muutosoperaatiot /** Lisää alkion pinon päälle.

/** Lisää alkion pinon päälle.

* @.pre !onTäysi() * @.pre !onTäysi()

* @.post OLD(this).equals(this.alimmaiset()) &

* @.post OLD(this).equals(this.alimmaiset()) &

*

* (päällimmäinen() == alkio)(päällimmäinen() == alkio) */

*/

public voidpublic void lisää(T alkio); lisää(T alkio);

/** Poistaa pinon päällimmäisen alkion.

/** Poistaa pinon päällimmäisen alkion.

* @.pre !onTyhjä() * @.pre !onTyhjä()

* @.post this.equals(OLD(this).alimmaiset()) * @.post this.equals(OLD(this).alimmaiset()) */

*/

public voidpublic void poista(); poista();

/** Tyhjentää pinon.

/** Tyhjentää pinon.

* @.pre true * @.pre true * @.post onTyhjä() * @.post onTyhjä() */

*/

public voidpublic void tyhjennä(); } tyhjennä(); }

Erikoistilanteiden hallinta Erikoistilanteiden hallinta

 Rutiini matemaattisena funktiona Rutiini matemaattisena funktiona

 määrittelyjoukko ( määrittelyjoukko (domain domain) ) D D

 arvojoukko ( arvojoukko (range range) ) R R

 Rutiini on kuvaus Rutiini on kuvaus f f : : D D → → R R

Esimerkkejä: Esimerkkejä:

itseisarvo: itseisarvo: D D = = R R, , R R = = R R

++

 kokonaislukujakolasku: kokonaislukujakolasku: D D = = Z Z × × Z Z, , R R = = Z Z

Rutiini matemaattisena Rutiini matemaattisena funktiona

funktiona

f f

-3

-3 44

-1

-1 22

1 1

3 3 -2

-2 00

-4 -4

-3

-3 44

-1

-1 22

1 1

3 3 -2

-2 00

-4

D

-4

D R R

Määrittelyjoukon jako eri Määrittelyjoukon jako eri osiin

osiin

Alkuehtotapaukset Alkuehtotapaukset

Erikoistapaukset Erikoistapaukset

Normaali tapaus

Normaali tapaus

(2)

Sopimuspohjainen olio-ohjelmointi

Sopimuspohjainen olio-ohjelmointi 2008-03-11 2008-03-11

(c) 2006-2008 Jouni Smed

(c) 2006-2008 Jouni Smed 2 2

Naiivi esimerkki: Itseisarvo Naiivi esimerkki: Itseisarvo

abs abs

-3

-3 44

-1

-1 22

1 1

3 3 -2

-2 00

-4 -4

-3

-3 44

-1

-1 22

1 1

3 3 -2

-2 00

-4 -4

Naiivi esimerkki: Neliöjuuri Naiivi esimerkki: Neliöjuuri

sqrt sqrt

-3

-3 44

-1

-1 22

1 1

3 3 -2

-2 00

-4 -4

-3

-3 44

-1

-1 22

1 1

3 3 -2

-2 00

-4 -4

Erikoistilanteesta Erikoistilanteesta tiedottaminen tiedottaminen

  Poikkeuksen nostaminen Poikkeuksen nostaminen

 tarkistettavat poikkeukset tarkistettavat poikkeukset

 tarkistamattomat poikkeukset tarkistamattomat poikkeukset

  Viittaustyyppisen parametrin kautta Viittaustyyppisen parametrin kautta

  Toimittajaluokan attribuutin kautta Toimittajaluokan attribuutin kautta

  Globaalia tietoa sisältävän olion Globaalia tietoa sisältävän olion kautta

kautta

 Palauttamalla tieto Palauttamalla tieto

normaalitapauksen tapaan normaalitapauksen tapaan

Totaalisen neliöjuurirutiinin Totaalisen neliöjuurirutiinin erikoistilanteesta tiedottaminen erikoistilanteesta tiedottaminen

sqrt sqrt

-3

-3 44

-1

-1 22

1 1

3 3 -2

-2 00

-4 -4

-3

-3 44

-1

-1 22

1 1

3 3 -2

-2 00

-4 -4

? ?

e e11

ee22 e e33

Nyrkkisääntö erikoistilanteiden Nyrkkisääntö erikoistilanteiden käsittelyyn

käsittelyyn

1.

1. Siirrä erikoistilanne alkuehtoon, Siirrä erikoistilanne alkuehtoon, mikäli se asiakkaan kannalta mikäli se asiakkaan kannalta selkeää ja ymmärrettävää.

selkeää ja ymmärrettävää.

2. 2. Mikäli sääntö 1 ei toimi, Mikäli sääntö 1 ei toimi, erikoistilanteet hoidetaan erikoistilanteet hoidetaan

käsiteltävillä poikkeuksilla, jolloin käsiteltävillä poikkeuksilla, jolloin asiakas pakotetaan ottamaan niihin asiakas pakotetaan ottamaan niihin kantaa.

kantaa.

3. 3. Mikäli säännöt 1 ja 2 eivät toimi, Mikäli säännöt 1 ja 2 eivät toimi, hoidetaan erikoistilanne muulla hoidetaan erikoistilanne muulla tavoin.

tavoin.

Javan poikkeushierarkia Javan poikkeushierarkia

Throwable Throwable Error

Error Exception Exception

RuntimeException RuntimeException

tarkistamattomat tarkistamattomat

poikkeukset poikkeukset

tarkistamattomat poikkeukset tarkistamattomat poikkeukset

tarkistettavat tarkistettavat poikkeukset poikkeukset

(3)

Sopimuspohjainen olio-ohjelmointi

Sopimuspohjainen olio-ohjelmointi 2008-03-11 2008-03-11

(c) 2006-2008 Jouni Smed

(c) 2006-2008 Jouni Smed 3 3

Tarkistamattomat poikkeus Tarkistamattomat poikkeus (unchecked exception ( unchecked exception) )

Ei tarvitse esitellä signatuurissa  Ei tarvitse esitellä signatuurissa

Ei yleensä napata kiinni  Ei yleensä napata kiinni

Error  Error: vakavat virheet : vakavat virheet

RuntimeException  RuntimeException: ajoaikainen : ajoaikainen virhe

virhe

Tarkistettava poikkeus Tarkistettava poikkeus (checked exception ( checked exception) )

 Esiteltävä signatuurissa Esiteltävä signatuurissa

 Otettava aina ekspliittisesti Otettava aina ekspliittisesti kantaa

kantaa

 nappaa kiinni nappaa kiinni

 päästä eteenpäin päästä eteenpäin

 Periytyvät Periytyvät Exception Exception-luokasta -luokasta

Esimerkki poikkeusten Esimerkki poikkeusten käytöstä

käytöstä

/** Palauttaa taulukon minimialkion.

/** Palauttaa taulukon minimialkion.

* @.pre true * @.pre true

* @.post FORALL(a : taulu; RESULT <= a) * @.post FORALL(a : taulu; RESULT <= a) * @throws NullPointerException * @throws NullPointerException *

* Nostetaan jos taulu == null.Nostetaan jos taulu == null.

* @throws TyhjäTaulukkoPoikkeus * @throws TyhjäTaulukkoPoikkeus *

* Nostetaan jos taulu.length == 0.Nostetaan jos taulu.length == 0.

*/

*/

public static int

public static int minimi(minimi(intint[] taulu)[] taulu)

throwsthrows NullPointerExceptionNullPointerException, , TyhjäTaulukkoPoikkeusTyhjäTaulukkoPoikkeus { {

trytry { {

intint pienin = taulu[0]; pienin = taulu[0];

forfor ( (intint i = 1; i < taulu.length; i++) i = 1; i < taulu.length; i++)

ifif (taulu[i] < pienin) pienin = taulu[i]; (taulu[i] < pienin) pienin = taulu[i];

returnreturn pienin; pienin;

}

} catchcatch ( (IndexOutOfBoundsExceptionIndexOutOfBoundsException e) { e) {

throw new throw new TyhjäTaulukkoPoikkeusTyhjäTaulukkoPoikkeus(("tyhjä taulu""tyhjä taulu"););

} } } }

Viittaukset

LIITTYVÄT TIEDOSTOT

*:llä merkityt tehtävät eivät ole kurssien keskeiseltä alueelta. Pisteeseen Q piirretty ympyrän tangentti leikkaa säteen OP jatkeen pisteessä R. Auringon säteet

että Suomen itsenäisyyspäivä (6.12.) on satunnaisesti eri viikonpäivinä. a) Kääntöpuolen taulukot esittelevät kevään 1976 ylioppilastutkinnon lyhyen matematiikan

Mikäli asumisessa ei ole häiriöitä, asumisneuvoja tekee realistisen maksusopi- muksen asiakkaan kanssa. Mikäli velasta on lähtenyt haastehakemus käräjäoi- keuteen,

3 Esimerkki 1 on mielenkiintoinen myös siksi, että verbi nousta esiintyy ensimmäisen kerran jo edeltäväs- sä virkkeessä: ’Opo nousi, laittoi silmälasit koteloon.’

Ainoa ero on, etta nasaalistu- minenja aspiraatio ovat yhteydessa artiku- laatiotapaan, edclliset taas artikulaatio- paikkaan.. Artikulatorisella fonetiikalla on tassa

Toista kvantiteettimaksiimia on syyta noudattaa juuri siksi, etta siten estetaan syntymasta tilanteita, joissa par- aikaa puhuva h enkilo keskeytetaan, kun kuulija

To this day, the EU’s strategic approach continues to build on the experiences of the first generation of CSDP interventions.40 In particular, grand executive missions to

However, the pros- pect of endless violence and civilian sufering with an inept and corrupt Kabul government prolonging the futile fight with external support could have been