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
-4D R R
Määrittelyjoukon jako eri Määrittelyjoukon jako eri osiin
osiin
Alkuehtotapaukset Alkuehtotapaukset
Erikoistapaukset Erikoistapaukset
Normaali tapaus
Normaali tapaus
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
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"););
} } } }