Kontraktsprogrammering
Programmera med kontrakt Samma som i vardagen Två parter (minst), bägge följer sin del 2
Bilköp Kund Krav Betala varje månad Förtjänst Få en bil Försäljare Ge kunden en bil och serva den en viss tid Få pengar varje månad 3
Boka biljett Resenär Resebyrå Krav Betala biljetten och vara på flygplasten i tid Flyga resenären till Hawaii Förtjänst Få åka till Hawaii Få pengar 4
Två sidor av kontraktet Från insidan Vad kräver jag vid anrop av mig Vad ger jag tillbaka till anroparen Från utsidan Vad krävs för att anropa modulen Vad får jag tillbaka 5
Division Krav Förtjänst Matematiker Nämnaren får ej vara noll Får kvoten mellan täljare och nämnare Funktion för att dividera Dividera täljare med nämnare och returnera kvoten Slipper kontrollera om täljaren är noll 6
Förvillkor och Eftervillkor Förvillkor vad som ska gälla när funktionen anropas, om det inte är uppfyllt är resultatet odefinierat Eftervillkor vad som ska gälla när funktionen är klar, under förutsättning att förvillkoret var uppfyllt 7
Funktion för division //pre: nämnare!= 0 //post: kvoten mellan taljare och //namnare har returnerats public static double dividera(double taljare, double namnare) { } return taljare/namnare; 8
Bank-program Saldo en variabel, hur mycket pengar vi har sattinpengar en funktion som sätter in pengar (dvs ökar saldo) tautpengar en funktion som tar ut pengar (dvs minskar saldo) 9
sattinpengar & tautpengar public void sattinpengar(double in) { mysaldo = mysaldo + in; } public void tautpengar(double ut) { mysaldo = mysaldo - ut; } 10
Variant av tautpengar public void tautpengar(double ut) { if(ut <= mysaldo) mysaldo = MySaldo ut; } else? 11
Variant av tautpengar public boolean tautpengar(double ut) { if(ut <= saldo) { mysaldo = mysaldo ut; return true; } } else return false; 12
Returvärde Användaren måste kolla returvärdet: boolean togut; togut = tautpengar(200); if(togut == false){ } System.out.println( Du har inte tillräckligt med pengar! ); 13
Kontrakt för tautpengar Förvillkor på tautpengar: man får inte ta ut mer än man har pre: ut <= saldo Eftervillkoret på tautpengar: man har tagit ut pengar post: saldo har minskats med ut kronor 14
Kontrakt för tautpengar //pre: ut <= mysaldo //post: mysaldo = mysaldo ut public void tautpengar(double ut) { mysaldo = mysaldo - ut; } Kollar före anrop till funktionen tautpengar if( mysaldo >= 200) tautpengar(200); 15
Kontrakt för sattinpengar Förvillkor på sattinpengar: man får inte sätta in en negativ summa pre: in >= 0 Eftervillkoret på sattinpengar: man har satt in pengar post: saldo har ökats med in kronor 16
Kontrakt för sattinpengar //pre: in >= 0 //post: mysaldo = mysaldo + in public void sattinpengar(double in) { mysaldo = mysaldo + in; } Användaren kollar innan han anropar funktionen if( in >= 0) sattinpengar(200); 17
Grad av pålitlighet Butik litar inte på folk, gör kreditupplysning Vi litar inte på slutanvändare låg pålitlighet Egna programdelar hög pålitlighet Andras programdelar medel pålitlighet Pålitlighet Låg Hög Typ av användare: Användare av programmet Användare av din modul Åtgärd: Maska bort fel Kräv uppfyllda förvillkor 18
Varför använda kontrakt Mer logisk kod Klarare ansvarsfördelning Lättare att debugga Kortare kod Mindre redundans (upprepning av samma sak) Färre fel i färdig produkt 19