Objektorienterad programmering

Relevanta dokument
Metoder och top-down design

Programmering = modellering

Föreläsning 4. Föreläsning 4. Top-Down Design Metoder Parameteröverföring. Metoder Parameteröverföring. Programmering = modellering

Föreläsning 4. Föreläsning 4

Föreläsning 4. Top-Down Design Metoder Parameteröverföring. Metoder Parameteröverföring

Föreläsning 6. Top-Down Design Parameteröverföring

Laboration 2. returnerar true om det är omöjligt för roboten att göra move() utan att. exekveringsfel erhålls, annars returnera false.

Mer om metoder och abstraktioner

Top-Down Design Parameteröverföring

Objektorienterad programmering

Laboration 2. Objektorienterad programmering. Syfte

Föreläsning 3. Iteration while-satsen

Föreläsning 3. Iteration. while-satsen for-satsen do-satsen

Objektorienterad programmering

Föreläsning 3-4 Innehåll

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Iteration. Föreläsning 3. TDA540 - Objektorienterad Programmering

Föreläsning 5-6 Innehåll

Iteration while-satsen

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Föreläsning 3. Föreläsning 3. Iteration. while-satsen for-satsen do-satsen. while-satsen. do-satsen. Datatypen double

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Föreläsnings 9 - Exceptions, I/O

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

JAVAUTVECKLING LEKTION 11

Enkla variabler kontra referensvariabel

Föreläsning 4. Klasser och objekt

Mer om klasser och objekt

Testning av program. Verklig modell för programutveckling

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Kort om klasser och objekt En introduktion till GUI-programmering i Java

Föreläsning 3. Föreläsning 3

Föreläsning 3. Föreläsning 3

OOP Objekt-orienterad programmering

Föreläsning 5. Föreläsning 5

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Om att lära sig programmera. Föreläsning 1-2 Innehåll.

Lösningsförslag: Instuderingsfrågor, del A

Tentamen ID1004 Objektorienterad programmering May 29, 2012

Föreläsning 7. for-satsen Fält

Lösningsförslag: Instuderingsfrågor, del D

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Ett objekt... Exempel: Om ni tittar er runt i föreläsningssalen ser in många olika fysiska föremål:

Föreläsning 6. Använd beskrivande namn

Separation of Concern. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016 Johannes Åman Pohjola, 2017

Separation of Concern. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

Föreläsning 2. Täcker material från lektion 1, 2, 3 och 4:

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

Java, klasser, objekt (Skansholm: Kapitel 2)

Föreläsning 2, vecka 8: Repetition

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

Metoder (funktioner) Murach s: kap Winstrand Development

Testning och felhantering

Överlagring, static, testning, formella metoder och undantag! Förelasning 13!! TDA540 Objektorienterad Programmering!

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Objektorienterad programmering

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

Att skriva till och läsa från terminalfönstret

Objektorienterad programmering D2

Föreläsning 5&6 LOGISKA VARIABLER; IMPLEMENTERA KLASSER; MER ALGORITMER

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

Föreläsning 6: Metoder och fält (arrays)

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

for-satsen Fält for-satsen Föreläsning 8 (OH-bilder 7) for-satsen for-sats är en styrsats för iterationer. for-sats har följande generella utseende:

Typkonvertering. Java versus C

1 Egna klasser. 1.1 En punkt-klass

Föreläsning REPETITION & EXTENTA

Parameteröverföring. Exempel. Exempel. Metodkropp

Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder

Tentamen OOP

Exempel på användning av arv: Geometriska figurer

Programmering A. Johan Eliasson

Klasshierarkier - repetition

Lösningsförslag till tentamen

Tentamen ID1004 Objektorienterad programmering April 7, 2015

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Samlingar, Gränssitt och Programkonstruktion! Förelasning 11!! TDA540 Objektorienterad Programmering!

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

TDDE10 TDDE11, 725G90/1. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

Objektorienterad Programmering (TDDC77)

Malmö högskola 2008/2009 CTS

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Föreläsning 5. Föreläsning 5. Klasser och objekt. Klasser och objekt. Klasser och objekt

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

JAVAUTVECKLING LEKTION 4

Transkript:

Objektorienterad programmering Föreläsning 4: metoder och top-down design Dr. Alex Gerdes Dr. Carlo A. Furia Hösttermin 2016 Chalmers University of Technology

Några meddelande Bara några dagar kvar till deadlinen för laboration 1 Läs textboken, läsanvisningar finns på hemsidan Kom ihåg flödet: läsa, föreläsning, öva/lab, och reflektera! Finns extra instuderingsfrågor på hemsidan Jätte bra med frågorna, keep-em-coming! CTRL-C -> CTRL-D

Sammanfattning föreläsning 3 double: akta begränsad storlek och avrundningsfel Iteration: while-, do- och for-sats Variablers räckvidd (scope) Upprepad programkörning printf

Abstraktion

Programmering = modellering Ett datorprogram är en modell av en verklig eller tänkt värld; ofta är det komplexa system som skall modelleras I objektorienterad programmering består denna värld av ett antal objekt som tillsammans löser den givna uppgiften - De enskilda objekten har specifika ansvarsområden - Objekten samarbetar genom att kommunicera med varandra via meddelanden - Ett meddelande till ett objekt är en begäran från ett annat objekt att få något utfört Att göra en bra modell av verkligheten, och därmed möjliggöra en bra design av programmet, är en utmaning.

Abstraktion För att lyckas utveckla ett större program måste man arbeta efter en metodik En mycket viktig princip vid all problemlösning är att använda sig av abstraktioner En abstraktion innebär att man bortser från vissa omständigheter och detaljer i det vi betraktar, för att bättre kunna uppmärksamma andra för tillfället mer väsentliga aspekter Abstraktion är det viktigaste verktyget vi har för att hantera komplexitet och för att finna gemensamma drag hos problem och hitta generella lösningar Betraktas alla detaljer ser man inte skogen för alla träden och två problem kan synas helt olika, medan de på en hög abstraktionsnivå är identiska Viktigaste slide av hela kursen!

Top-down design

Top-down design En problemlösningsmetodik som bygger på användning av abstraktioner är top-down design Top-down design innebär att vi betraktar det ursprungliga problemet på en hög abstraktionsnivå och bryter ner det ursprungliga problemet i ett antal delproblem Varje delproblem betraktas sedan som ett separat problem, varvid fler aspekter på problemet beaktas, dvs vi arbetar med problemet på en lägre abstraktionsnivå än vi gjorde med det ursprungliga problemet Om nödvändigt bryts delproblemen ner i mindre och mer detaljerade delproblem; denna process upprepas till man har delproblem som är enkla att överblicka och lösa Top-down-design bygger på principen divide-and-conquer

Top-down design ursprungligt problem problem som bryts ner i delproblem problem som är tillräckligt enkla för att lösa med inom en metod

Top-down design Allteftersom ett problem bryts ner i mindre delproblem, betraktar man allt fler detaljer. Vi går således från en abstrakt nivå mot allt mer detaljerade nivåer. Denna process brukar kallas för stegvis förfining. Exempel: att ordna en tre-rätters middag enligt "top-down design" Middag Förrätt Huvudrätt Dessert Dryck Dryck Dryck M a t M a t M a t

Bottom-up design Relaterad till top-down design är bottom-up design Bottom-up design innebär att man startar med att utveckla små och generellt användbara programenheter och sedan bygger ihop dessa till allt större och kraftfullare enheter En viktig aspekt av objektorienterad programmering, som ligger i linje med bottom-up design, är återanvändning Återanvändning innebär en strävan att skapa klasser som är så generella att de kan användas i många program I Java finns ett standardbibliotek som innehåller ett stort antal sådana generella klasser; standardbiblioteket kan således ses som en "komponentlåda" ur vilken man kan plocka komponenter till det programsystem man vill bygga Vid utveckling av Javaprogram kombinerar man vanligtvis top-down design och bottom-up design

Modulär design Vid utveckling av Javaprogram är klasser och metoder (tillsammans med paket) de abstraktionsmekanismer som används för att dölja detaljer och därmed öka överblickbarhet och förståelse Att utveckla ett Javaprogram med hjälp av top-down design innebär således att dela in programmet i lämpliga klasser och metoder, vilka i sin tur delas upp i nya klasser och metoder Man skall eftersträva en modulär design där varje delproblem (= klass eller metod) handhar en väl avgränsad uppgift och att varje delproblem är så oberoende av de andra delproblemen som möjligt

Modulär design En välgjord modulär design innebär att programsystemet är uppdelat i tydligt identifierbara abstraktioner. Fördelarna med ett sådant system är: - det går lätt att utvidga - komponenterna går att återanvända - komponenterna har en tydlig uppdelning av ansvar - komplexiteten reduceras - komponenterna går att byta ut - underlättar testning Designa programsystemet runt stabila abstraktioner och utbytbara komponenter för att möjliggöra små och stegvisa förändringar. - tillåter parallell utveckling

Exempel Problem: skriv ett program som läser in radien och höjden av en cylinder, samt beräknar och skriver ut cylinderns area och volym. Arean A och volymen V av en cylinder fås av följande formler: A =2 rh +2 r 2 V = r 2 h där r är radien och h är höjden av cylindern Algoritm: 1. Läs cylinderns radie r 2. Läs cylinderns höjd h 3. Beräkna cylinderns area A mha formeln 4. Beräkna cylinderns volym V mha formeln 5. Skriv ut cylinderns area A och volym V A =2 rh +2 r 2 V = r 2 h

Lösning 1 Var och ett stegen i vår lösningsskiss är mer eller mindre triviala varför programmet kan skrivas som ett enda huvudprogram: import javax.swing.*; import java.util.*; public class CalcCylinder { public static void main(string[] args) { String input = JOptionPane.showInputDialog("Ange radie och höjd:"); if (input!= null) { Scanner sc = new Scanner(input); double radius = sc.nextdouble(); double height = sc.nextdouble(); double area = 2 * Math.PI * radius * height + 2 * Math.PI * Math.pow(radius, 2); double volume = Math.PI * Math.pow(radius, 2) * height; JOptionPane.showMessageDialog(null, "Arean av cylindern är "+ area + "\nvolymen av cylindern är " + volume);

Lösning 2 I lösningsskissen utgör beräkningen av arean respektive beräkningen av volymen var sitt delproblem och kan därmed implementeras som var sin metod! import javax.swing.*; import java.util.*; public class CalcCylinderV2 { public static void main(string[] args) { String input = JOptionPane.showInputDialog("Ange radie och höjd:"); if (input!= null) { Scanner sc = new Scanner(input); double radius = sc.nextdouble(); double height = sc.nextdouble(); Anropa metoder för att utföra beräkningarna double area = computearea(radius, height); double volume = computevolume(radius, height); JOptionPane.showMessageDialog(null, "Arean av cylindern är "+ area + "\nvolymen av cylindern är " + volume);

Lösning 2, fortsättning private static double computearea(double radius, double height) { return 2 * Math.PI * radius * height + 2 * Math.PI * Math.pow(radius, 2); private static double computevolume(double radius, double height) { return Math.PI * Math.pow(radius, 2) * height; // Slut av klassen CalcCylinderV2 Kommentar: vi har deklarerat metoderna computearea och computevolume som private för de är hjälpmetoder för att huvudprogrammet skall kunna göra sin uppgift

Lösning 3 Arean av en cylinder beräknas med hjälp av cylinderns mantelyta samt cylinderns cirkelyta, och även volymen beräknas med hjälp av cirkelytan Därför kan vi bryta ner problemen att beräkna cylinderns area och volym i ytterligare delproblem private static double computearea(double radius, double height) { return computesidearea(radius, height) + 2 * computecirclearea(radius); private static double computevolume(double radius, double height) { return computecirclearea(radius) * height; private static double computesidearea(double radius, double height) { return 2 * Math.PI * radius * height; private static double computecirclearea(double radius) { return Math.PI * Math.pow(radius, 2);

Lösning 4 I föregående lösning har vi en klass som innehåller både ett huvudprogram och de privata klassmetoderna computearea, computevolume, computesidearea och computecirclearea Det är även möjligt (och lämpligt) att lägga dessa metoder i en annan klass och än huvudprogrammet, externa metoderna måste då göras publika public class Cylinder { public static double computearea(double radius, double height) { return computesidearea(radius, height) + 2 * computecirclearea(radius); public static double computevolume(double radius, double height) { return computecirclearea(radius) * height; private static double computesidearea(double radius, double height) { return 2 * Math.PI * radius * height; private static double computecirclearea(double radius) { return Math.PI * Math.pow(radius, 2); Vad är fördelarna med denna design?

Lösning 4, fortsättning import javax.swing.*; import java.util.*; public class CalcCylinderV4 { public static void main(string[] args) { String input = JOptionPane.showInputDialog("Ange radie och höjd:"); if (input!= null) { Scanner sc = new Scanner(input); double radius = sc.nextdouble(); double height = sc.nextdouble(); double area = Cylinder.computeArea(radius, height); double volume = Cylinder.computeVolume(radius, height); JOptionPane.showMessageDialog(null, "Arean av cylindern är + area + "\nvolymen av cylindern är " + volume); Anm: för att programmet skall fungera måste klassen Cylinder ligger i samma mapp som klassen CalcCylinderV4

Observera! När ni kopiera/klistra kod borde ett larm gå Chans att abstrahera!

Paus (15 min)

Metodanrop

Uppbyggnaden av en metod // Utseende på metoder som lämnar returvärde modifierare typ namn(parameterlista) { dataattribut och satser return uttryck; // Utseende på metoder som inte lämnar returvärde modifierare void namn(parameterlista) { dataattribut och satser Metoder kan antingen vara klassmetoder eller instansmetoder Metoder kan antingen lämna ett returvärde eller inte lämna ett returvärde Metoder kan bl.a. vara private eller public

Metodens gränssnitt Satsen return uttryck; terminerar metoden och värdet uttryck blir resultatet som erhålls från metoden En metod som inte lämnar något värde (en void-metod) har ingen return-sats eller har return-satser som saknar uttryck modifierare typ på returvärde metodens namn parametrar public static int maxvalue(int a, int b) { int result; if (a > b) result = a; else result = b; returvärde return result;

Uppbyggnaden av en metod För att kunna använda en metod måste man känna till och kunna använda metodens gränssnitt på ett korrekt sätt En metods gränssnitt bestäms av - metodens namn - metodens returtyp - metodens parameterlista avseende antal parametrar samt parametrarnas typer och ordning - huruvida metoden är en klassmetod eller instansmetod Ett metodanrop kan ses som att en avsändare skickar ett meddelande till en mottagare Parameterlistan beskriver vilken typ av data avsändaren kan skicka i meddelandet och resultattypen beskriver vilken typ av svar avsändaren får i respons från mottagaren

Formella och aktuella parametrar import javax.swing.*; import java.util.*; public class Exempel { public static void main(string[] args) { String input = JOptionPane.showInputDialog("Ge tre heltal"); Scanner sc = new Scanner(input); int value1 = sc.nextint(); int value2 = sc.nextint(); int value3 = sc.nextint(); int big = maxvalue(value1, value2); aktuella parametrar big = maxvalue(big, value3); JOptionPane.showMessageDialog(null, "Det största av talen " + value1 + ", " + value2 + " och " + value3 + " är " + big); public static int maxvalue(int a, int b) { int result; if (a > b) result = a; formella parametrar else result = b; return result;

Metodanrop Vid anrop av en metod sker följande: - värdet av de aktuella parametrarna kopieras till motsvarande formell parameter - exekveringen fortsätter med den första satsen i den anropade metoden - när exekveringen av den anropade metoden är klar återupptas exekveringen i den metod där anropet gjordes exekveringsordning... int big = maxvalue(value1, value2);... big = maxvalue(big, value3);... public static int maxvalue(int a, int b) { int result; if (a > b) result = a; else result = b; return result;

Parameteröverföring Alla primitiva datatyper och alla existerande klasser kan ges i parameterlistan och/eller som resultattyp Parameterlistan kan innehålla ett godtyckligt antal parametrar I Java sker alltid parameteröverföring via värdeanrop, vilket betyder att värdet av den aktuella parametern kopieras över till den formella parametern: - När den aktuella parametern är en primitiv typ kommer därför den aktuella parametern och den formella parametern att ha access till fysiskt åtskilda objekt - När parametern är ett objekt (dvs en instans av en klass) är parametern en referensvariabel, varför den aktuella parametern och den formella parametern kommer att ha access till samma fysiska objekt

Parameteröverföring Värdet av den aktuella parametern tal kopieras till den formella parametern x tal och x är åtskilda fysiska objekt En förändring av värdet i variabeln x påverkar inte värdet i variabeln tal Anropande metod Aktuella parametrar int tal 5 Anropad metod Formella parametrar int x 5 Värdet av den aktuella parametern p kopieras till den formella parametern y p och y kommer att referera till samma fysiska objekt En förändring i objektet som refereras av variabeln y påverkar därför objektet som refereras av variabeln p, eftersom det är samma objekt SomeClass p 123456 SomeClass y 123456

Laboration 2

Laboration 2 I laboration 2 skall ni programmera en robot som modelleras av den givna klassen Robot Syftet med laborationen är att ni bryta ner de uppgifter som roboten skall utföra i delproblem och utveckla kraftfullare abstraktioner än de operationer som roboten tillhandahåller; dessa abstraktioner implementeras som små meningsfulla och återanvända metoder med hjälpa av de operationer som roboten erbjuder En robot vistas i en enkel värld, och kan utföra några enkla operationer (samt några till): Metod void move() boolean frontisclear() void turnleft() void makelight() boolean ondark() int getdirection() Användning förflyttar sig ett steg framåt, om roboten hamnar utanför världen eller i en mur fås ett exekveringsfel returnerar true om det är möjligt för roboten att göra move() utan att ett exekveringsfel erhålls, annars returnera false vrider sig 90 åt vänster färgar rutan den står på till ljus, om rutan redan är ljus fås ett exekveringsfel returnerar true om roboten står på en mörk ruta, annars returneras false returnerar robotens riktning

Laboration 2 Roboten har ingen operation för att vrida sig runt, utan det måste görs med två på varandra följande anrop av den tillgängliga operationen turnleft Antag att vi har en situation som i scenariot i bilden; mm vårt problem är att flytta roboten till den mörka rutan är turnaround en meningsfull abstraktion I laborationen är roboten en instansvariabel med namnet robot, varför abstraktionen turnaround skall implementeras som en instansmetod: // before: none // after: the robot is facing the opposite direction public void turnaround() { robot.turnleft(); robot.turnleft();

Förvillkor och eftervillkor Antag att vi har en situation som i scenariot i bilden till vänster. Vårt uppgift är att flytta roboten till den ljusa rutan som befinner framför roboten göra denna mörk. Detta kan vi göra med abstraktionen moveanddarken. Implementationen får följande utseende: public void moveanddarken() { robot.move(); if (!robot.ondark()) robot.makedark();

Förvillkor och eftervillkor Metoden (abstraktionen) fungera utmärkt för det scenario vi utgick ifrån: Före Efter Men det finns flera scenarior där metoden inte fungerar, varav några framgår av bilderna nedan:

Förvillkor och eftervillkor När vi använder en metod måste vi veta vilka antaganden som görs i implementationen av metoden, d.v.s. vad som måste gälla för att metoden skall fungera på avsett sätt. Dessa antaganden kallas för förvillkor och måste specificeras. Det är också viktigt att veta om metoden har några biverkningar (sidoeffekter) då den utförs. Syften med metoden moveanddarken är att flytta roboten till rutan ovanför och göra denna ruta mörk. Men vilken riktning har roboten när metoden utförts? Detta är en sidoeffekt som behöver specificeras i ett eftervillkor. Förvillkoren till en metod måste vara kontrollerbara för den som anropar metoden. I detta fall kan förvillkoret kontrolleras med metoden frontisclear(). // before: the robot is not facing a wall or at the // edge of the world // after: the cell in front is dark, and the robot moved to that // cell and has not changed direction public void makenorthdark() { robot.move(); if (!robot.ondark()) robot.makedark();

Förvillkor och eftervillkor En cylinder kan inte ha en radie som är negativ och inte en höjd som är negativ En cirkel kan inte ha en radie som är negativ public class Cylinder { // before: radius >= 0 && height >= 0 // after: the area of a cylinder with assigned radius and height public static double computearea(double radius, double height) { return computesidearea(radius, height) + 2 * computecirclearea(radius); // before: radius >= 0 && height >= 0 // after: the volume of a cylinder with assigned radius and height public static double computevolume(double radius, double height) { return computecirclearea(radius) * height; // before: radius >= 0 && height >= 0 // after: the side area of a cylinder with assigned radius and height private static double computesidearea(double radius, double height) { return 2 * Math.PI * radius * height; // before: radius >= 0 // after: the area of a circle with assigned radius private static double computecirclearea(double radius) { return Math.PI * Math.pow(radius, 2);

Förvillkor och eftervillkor För att en programmerare skall kunna använda sig av en metod på ett korrekt sätt måste han/hon känna till specifikationen för en metoden: - metodens namn - metodens parameterlista - metodens returtyp - vad metoden gör vilka förvillkor som måste gälla vilka eftervillkor (sidoeffekter) metoden har För att kunna använda en metod behöver man däremot inte känna till hur metoden är implementerad. Det intressanta är vad metoden gör inte hur den gör det! Specifikationen är alltså viktig att dokumentera!

javadoc @return är en fördefinierad annotation @before är en egendefinierad annotation Kommandot javadoc -tag before:a:"before:" Formulas.java skapar en dokumentation av klassen Cylinder i form av en uppsättning htmlfiler. Exempel på andra fördefinerade annotationer: - @author public class Cylinder { /** @before radius >= 0 && height >= 0 @return the area of a cylinder with assigned radius and height */ public static double computearea(double radius, double height) { return computesidearea(radius, height) + 2 * computecirclearea(radius); /** @before radius >= 0 && height >= 0 @return the volume of a cylinder with assigned radius and height */ public static double computevolume(double radius, double height) { return computecirclearea(radius) * height; /** @before radius >= 0 && height >= 0 @return the side area of a cylinder with assigned radius and height */ private static double computesidearea(double radius, double height) { return 2 * Math.PI * radius * height; /** @before radius >= 0 @return the area of a circle with assigned radius */ private static double computecirclearea(double radius) { return Math.PI * Math.pow(radius, 2); - @before - @version - @exception - @param

Live coding: laboration 2