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

Relevanta dokument
Föreläsning 4. Föreläsning 4

Metoder och top-down design

Objektorienterad programmering

Programmering = modellering

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

Objektorienterad programmering

Mer om metoder och abstraktioner

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

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

Laboration 2. Objektorienterad programmering. Syfte

Top-Down Design Parameteröverföring

Föreläsning 3. Iteration while-satsen

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

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

Föreläsning 5-6 Innehåll

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

Iteration while-satsen

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

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

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

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

Objektorienterad programmering

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

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

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2

Lösningsförslag till tentamen

JAVAUTVECKLING LEKTION 11

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

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

Föreläsning 4. Klasser och objekt

Föreläsning 2, vecka 8: Repetition

Testning av program. Verklig modell för programutveckling

Enkla variabler kontra referensvariabel

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

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

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

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

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

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

Mer om klasser och objekt

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

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

Exempel på användning av arv: Geometriska figurer

OOP Objekt-orienterad programmering

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.

Typkonvertering. Java versus C

Lösningsförslag till tentamen

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

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

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

Objektorienterad programmering E. Telefonboken, än en gång. Gränssnitt. Telefonboken med gränssnitt specificerat, del 1.

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

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

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.

Testning och felhantering

Tentamen ID1004 Objektorienterad programmering May 29, 2012

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

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

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

Parameteröverföring. Exempel. Exempel. Metodkropp

Lösningsförslag till tentamen

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

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

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

TDDE10 TDDE11, 725G90/1. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, 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

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

1 Egna klasser. 1.1 En punkt-klass

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

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

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

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

Föreläsning 10. ADT:er och datastrukturer

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

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

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

Java, klasser, objekt (Skansholm: Kapitel 2)

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

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

(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

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

Tentamen ID1004 Objektorienterad programmering October 29, 2013

Tentamen, EDAA20/EDA501 Programmering

DAT043 Objektorienterad Programmering

Tentamen i Objektorienterad programmering

Objektorienterad programmering

OOP Objekt-orienterad programmering

F6 Objektorienterad design. ID1004 Objektorienterad programmering Fredrik Kilander

Programmering A. Johan Eliasson

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

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

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

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

Objektorienterad Programkonstruktion. Föreläsning jan 2016

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

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 omtentamen för TDA540 Objektorienterad Programmering

Objektorienterad Programkonstruktion. Föreläsning 3 7 nov 2016

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

Transkript:

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. Föreläsning 4 - 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. Top-Down Design Metoder Parameteröverföring Föreläsning 4 Att göra en bra modell av verkligheten, och därmed möjliggöra en bra design av programmet, är en utmaning. Top-Down Design Metoder Parameteröverföring Abstraktion 2 Top-Down Design För att lyckas utveckla ett större program måste man arbeta efter en metodik. metodik En problemlösningsmetodik som bygger på användning av abstraktioner är top-down design. design En mycket viktig princip vid all problemlösning är att använda sig av abstraktioner. abstraktioner 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. 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. 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. 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. 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-andconquer. conquer 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. A person can only keep 7 plus or minus 2 items in mind at one time. (George Miller) 3 4

Top-Down Design 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. förfining ursprungligt problem problem som bryts ner i delproblem Exempel: Att ordna en trerätters middag enligt "top-down design" Middag problem som är tillräckligt enkla för att lösa med inom en metod För rätt Mat Huvud rätt Dryck Mat Dryck Dessert Mat Dryck Med top-down design blir det möjligt att lösa det ursprungliga problemet steg för steg istället för att direkt göra en fullständig lösning. 5 6 Modulär design Modulär Design En välgjord modulär design innebär att programsystemet är uppdelat i tydligt Designa programsystemet runt stabila identifierbara abstraktioner. Fördelarna med ett sådant system är: 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. abstraktioner och utbytbara det går lätt att utvidga komponenter för att möjliggöra små komponenterna går att återanvända och stegvisa förändringar. komponenterna har en tydlig uppdelning av ansvar komplexiteten reduceras 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. komponenterna går att byta ut underlättar testning tillåter parallell utveckling. 7 Designa programsystemet runt stabila abstraktioner och utbytbara komponenter för att möjliggöra små och stegvisa förändringar. 8

Black box - tänkande x year a b sqrt leapyear average Exempel: 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 r h + 2 r2 och V = r2 h, där r är radien och h är höjden av cylindern. x ture eller false Medelvärdet av a och b Utkast till lösning: Är ett sätt att uttrycka vissa steg i ett program på en högre abstraktionsnivå. 1. Läs cylinderns radie r. På en hög abstraktionsnivå är det vad som görs som är det intressanta, inte hur det görs. 2. Läs cylinders höjd h. Ger direkt stöd för stegvis förfining. Varje abstraktion (black box) skall endast göra en sak och göra denna bra. 3. Beräkna cylinderns area A mha formeln A = 2 r h + 2 r2. 4. Beräkna cylinderns volym A mha formeln V = r2 h. Vad en abstraktion gör och hur abstraktionen används definerar abstraktionens gränsitt (interface). 5. Skriv ut cylinderns area A och volym V. 9 Lösning 1: 10 Lösning 2: Var och ett av stegen i vår lösningsskiss är mer eller mindre triviala varför programmet kan skrivas som ett enda huvudprogram: I lösningsskissen utgör beräkningen av arean respektive beräkningen av volymen var sitt delproblem och kan betraktas som var sin black -box : Nackdel: import javax.swing.*; import java.util.*; Måste beakta alla detaljer samtidigt! public class Cylinder { public static void main (String[] arg) { boolean done = false; while (!done) { String input = JOptionPane.showInputDialog("Ange cylinderns radie och höjd:"); if (input == null) done = true; else { 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); //main //Cylinder radius height computearea radius height computevolume arean av cylindern volymen av cylindern Vi implementera dessa som var sin metod. //return: The area of a cylinder with assigned raduis and height. public static double computearea(double radius, double height) { //return: The volume of a cylinder with assigned raduis and height. public static double computevolume(double radius, double height) { 11 12

Lösning 2: fortsättning Lösning 2: fortsättning //return: The area of a cylinder with assigned raduis and height. private static double computearea(double radius, double height) { return 2*Math.PI*radius*height + 2*Math.PI*Math.pow(radius, 2); //computearea import javax.swing.*; import java.util.*; public class Cylinder2 { public static void main (String[] arg) { boolean done = false; while (!done) { String input = JOptionPane.showInputDialog("Ange cylinderns radie och höjd:"); if (input == null) done = true; else { Anropa Anropa metoder metoder Scanner sc = new Scanner(input); för att utföra double radius = sc.nextdouble(); beräkningarna beräkningarna double height = sc.nextdouble(); double area = computearea(radius, height); double volume = computevolume(radius, height); JOptionPane.showMessageDialog(null, "Arean av cylindern är "+ area + "\nvolymen av cylindern är " + volume); //main //return: The volume of a cylinder with assigned raduis and height. private static double computevolume(double radius, double height) { return Math.PI * Math.pow(radius, 2) * height; //computevolume //Cylinder2 Kommentar: Vi har deklarerat metoderna computearea och ComputeVolume private eftersom de är hjälpmetoder för att huvudprogrammet skall kunna göra sin uppgift. 13 14 Lösning 3: Lösning 4: 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. 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. Metoderna måste då göras publika. private static double computearea(double radius, double height) { return computesidearea(radius, height) + 2*computeCircleArea(radius); //computearea public class Utils { public static double computearea(double radius, double height) { return computesidearea(radius, height) + 2*computeCircleArea(radius); //computearea Vad är fördelarna med denna design? private static double computevolume(double radius, double height) { return computecirclearea(radius) * height; //computevolume public static double computevolume(double radius, double height) { return computecirclearea(radius) * height; //computevolume private static double computesidearea(double radius, double height) { return 2*Math.PI*radius*height; //computesidearea public static double computesidearea(double radius, double height) { return 2*Math.PI*radius*height; //computesidearea private static double computecirclearea(double radius) { return Math.PI*Math.pow(radius, 2); //computecirclearea public static double computecirclearea(double radius) { return Math.PI*Math.pow(radius, 2); Vad är fördelarna //computecirclearea med denna design? //Utils 15 16

Lösning 4: fortsättning Förvillkor och eftervillkor Vårt huvudprogram får då följande utseende: För att kunna använda sig av en metod måste man känna till gränssnitt för metoden. Av gränsnittet skall framgå: import javax.swing.*; import java.util.*; public class Cylinder4 { public static void main (String[] arg) { boolean done = false; while (!done) { String input = JOptionPane.showInputDialog("Ange cylinderns radie och höjd:"); if (input == null) done = true; else { Scanner sc = new Scanner(input); double radius = sc.nextdouble(); double height = sc.nextdouble(); double area = Utils.computeArea(radius, height); double volume = Utils.computeVolume(radius, height); JOptionPane.showMessageDialog(null, "Arean av cylindern är "+ area + "\nvolymen av cylindern är " + volume); //main //Cylinder4 metodens namn metodens parameterlista metodens returtyp vad metoden gör vilka förutsättningar som måste gälla för att metoden skall fungera på ett korrekt sätt Vad metoden gör beskrivs som eftervillkor (postconditions postconditions). Eftervillkoren anger dels vilket resultat metoden returnerar, dels vilka sidoeffekter metoden har. Vilka förutsättningar som måste gälla för att metoden skall fungera på avsett sätt beskrivs som förvillkor (preconditions preconditions). Om klienten uppfyller förvillkoren lovar metoden uppfylla eftervillkoren. Anm: För att programmet skall fungera måste klassen Utils ligger i samma mapp som klassen Cylinder4. 17 18 javadoc Förvillkor och eftervillkor public class Utils { //return: The area of a cylinder with assigned raduis and height. public static double computearea(double radius, double height) { return computesidearea(radius, height) + 2*computeCircleArea(radius); //computearea //return: The volume of a cylinder with assigned raduis and height. public static double computevolume(double radius, double height) { return computecirclearea(radius) * height; //computevolume 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. //return: The side area of a cylinder with assigned raduis and height. public static double computesidearea(double radius, double height) { return 2*Math.PI*radius*height; //computesidearea public class Utils { /** @before radius >= 0 && height >= 0 @return The area of a cylinder with assigned raduis and height. */ public static double computearea(double radius, double height) { return computesidearea(radius, height) + 2*computeCircleArea(radius); //computearea /** @before radius >= 0 && height >= 0 @return The volume of a cylinder with assigned raduis and height. */ public static double computevolume(double radius, double height) { return computecirclearea(radius) * height; //computevolume @return är en fördefinierad annotation @before är en egendefinierad annotation Kommandot javadoc -tag before:a:"before:" Utils.java skapar en dokumentation av klassen Utils i form av en uppsättning html-filer. /** @before radius >= 0 && height >= 0 @return The side area of a cylinder with assigned raduis and height. */ public static double computesidearea(double radius, double height) { return 2*Math.PI*radius*height; //computesidearea //before: radius >= 0 //return: The area of a circle with assigned raduis. public static double computecirclearea(double radius) { return Math.PI*Math.pow(radius, 2); //computecirclearea //Utils /** @before radius >= 0 @return The area of a circle with assigned raduis. 19 */ public static double computecirclearea(double radius) { return Math.PI*Math.pow(radius, 2); //computecirclearea //Utils Exempel på andra fördefinerade annotationer: @author @version @exception @param 20

Bottom-Up Design Uppbyggnaden av en metod Ett alternativ till top-down design är bottom-up design. design //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) { 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 ned bottom-up design, är återanv ändning dning. Återanvändning innebär en strävan att återanvän skapa klasser som är så generella att de kan användas i många program. dataattribut och satser 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. Metoder kan antingen vara klassmetoder eller instansmetoder. Metoder kan antingen lämna ett returvärde eller inte lämna ett returvärde. //Utseende på metoder som inte lämnar returvärde Metoder kan bl.a. vara private eller public. modifierare void namn(parameterlista) { dataattribut och satser Vid utveckling av Javaprogram kombinerar man vanligtvis top-down design och bottom-up design. 21 Uppbyggnaden av en metod 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 gränssnitt typ på returvärde modifierare metodens namn parametrar public static int maxvalue(int a, int b) { if (a > b) return a; else returvärde return b; // maxvalue; 22 metodens namn metodens returtyp metodens parameterlista avseende antal parametrar samt parametrarnas typer och ordning huruvida metoden är en klassmetod eller instansmetod Satsen return uttryck; terminerar metoden och värdet uttryck blir resultatet som erhålls från metoden. 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. En metod som inte lämnar något värde (en void-metod void-metod) har ingen return-sats eller har returnsatser som saknar uttryck. 23 24

Formella och aktuella parametrar Metodanrop import javax.swing.*; import java.util.*; public class Exemple { public static int maxvalue(int a, int b) { if (a > b) return a; formella parametrar else return b; //maxvalue 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); // main //Exemple 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) { if (a > b) return a; else return b; //maxvalue... 25 26 Parameteröverföring Parameteröverföring Alla primitiva datatyper och alla existerande klasser kan ges i parameterlistan och/eller som resultattyp. Anropande metod Anropad metod Aktuella parametrar Formella parametrar Värdet av den aktuella parametern tal kopieras till den formella parametern x. tal och x är åtskilda fysiska objekt. Parameterlistan kan innehålla ett godtyckligt antal parametrar. I Java sker alltid parameteröverföring via värdeanrop, 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. int tal int x 5 5 SomeClass p 123456 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. SomeClass y 123456 En förändring av värdet i variabeln x påverkar inte värdet i variabeln tal. 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 27 28

Problem Laboration 2 I laboration 2 skall ni programmera en robot som modelleras av den givna klassen Robot. En robot vistas i en enkel värld, och kan utföra några enkla operationer: I världen som skapas av klassen Swapper befinner sig roboten i ett scenario enligt den vänstra av de två figurerna bredvid. Roboten är placerad i början av en korridor och är riktad mot korridoren. Följande operationer finns (samt några till): void move() förflyttar sig ett steg framåt. Om roboten hamnar utanför världen eller i en mur fås ett exekveringsfel. boolean frontisclear() returnerar true om det är möjligt för roboten att göra move() utan att ett exekveringsfel erhålls, annars returnera false void turnleft() Vår uppgift är att implementer en metod swapall som byter plats på färgerna på cellerna som finns på ömse sidor om korridoren (se högra bilden bredvid). Efter slutförd uppgift skall roboten återvända till sig ursprungliga startposition. vrider sig 90 åt vänster void makelight() färgar rutan den står på till ljus. Om rutan redan är ljus fås ett exekveringsfel. Vi skall bryta ner uppgiften i delproblem och utveckla kraftfullare abstraktioner (metoder) än de operationer som roboten tillhandahåller. boolean ondark() returnerar true om roboten står på en mörk ruta, annars returneras false int getdirection() returnerar robotens riktning. Roboten kan ha fyra riktningar: Robot.North, Robot.WEST, Robot.SOUTH och Robot.EAST. Före Efter 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. 29 Problem Klassen Swapper Roboten skall kunna utföra sin arbetsuppgift i en godtycklig värld med samma principiella uppbyggnad som världen i figurerna ovan. public class Swapper { private Robot robot; public static void main(string[] args) { Swapper swapper = new Swapper(); swapper.createenviroment(); swapper.swapall(); //main När vi definierar en metod (abstraktion) är det viktigt att dokumentera vad metoden gör och vilka för- respektive eftervillkor som gäller (t.ex. vilken riktning roboten måste ha innan metoden anropas, och vilken riktning roboten får efter anropet). Det är också viktigt att välja lämpliga och beskrivande namn på metoderna. Skapar världen som definieras i filen swap.txt public void createenviroment() { RobotWorld world = RobotWorld.load("swap.txt"); robot = new Robot(world.getNumRows() - 2, 2, Robot.NORTH, world); robot.setdelay(100); //createenviroment public void swapall() { //swapall //Swapper 30 Sätter robotens rörelsehastighet När man löser ett problem är det sällan man finner den optimala lösningen direkt. När man väl har en lösning måste man reflektera över om det finns andra bättre lösningar. I det problem som vi har här, kan antalet operationer som roboten behöver utföra vara ett mått på hur bra lösningen är. Ju färre operationer desto bättre. Skapar roboten och Placerar den I värden på en viss position och med en riktning 31 32

Lös problemet Lös problemet Handfallen? Rådvill? Kommer inte igång? Skall vi byta färgerna på alla par av motstående celler i korridoren, måste vi kunna byta färgerna på ett par av motstående celler. Gör en analys av uppgiftsformuleringen. Fokusera på vad som skall göras, inte på hur det skall göras! Finn abstraktioner! Förenkla problemet! Titta på en mindre instans av problemet! Vi inför en sådan abstraktion som vi kallar swapacrosscells. Vi börjar med att specificera gränssnittet för metoden swapall: //Swapping colours of two across cells. private void swapacrosscells() { //swapacrosscells Vad skall metoden göra? Vilka förvillkor gäller? Vilka eftervillkor skall gälla? //Swapping colors on all across cells in the corridor. //before: The robot is located at the beginning of the corridor, facing the corridor. //after: The robot has the same location and facing the same direction. public void swapall() { //swapall 33 Simulera ett enklet exempel: 1) 2) 3) Simulera ett enklet exempel: 4) 34 5) 6) 6) Ser du något mönster? När roboten står på en position i korridoren byter den först färgen på motstående celler i korridoren, sedan går den fram en position om den inte står i slutet av korridoren. Vi behöver en abstraktion isatendofcorridor för att avgöra om roboten är i slutet av korridoren: //returns true if the robot is at the end of the corridor, otherwise false public boolean isatendofcorridor() { //isatendofcorridor 35 36

Simulera ett enklet exempel: 6) Metoden swapall boolean finished = false; while (!finished) { if (!atendofcorridor()) else finished = true; Nu återstår att roboten skall återvända till sin ursprungliga startposition i början av korridoren. Vi behöver en abstraktion returntostartposition: Metoden swapall får följande implementation: //Swapping colors on all across cells in the corridor. //before: The robot is located at the beginning of the corridor, facing the corridor. //after: The robot has the same location and facing the same direction. public void swapall() { boolean finished = false; while (!finished) { if (!isatendofcorridor()) else finished = true; returntostartposition(); //swapall 7) //before: The robot is at the end of the corridor, facing the wall. //after: The robot is at the beginning of the corridor, facing the corridor. private void returntostartposition() { //returntostartposition 37 Metoden swapacrosscells 38 Metoden swapacrosscells Färgerna på de motstående celler i korridoren behöver bytas om När behöver färgerna på cellerna bytas? När cellerna har olika färg! isleftcelldark()!= isrightcelldark() För att byta färgerna på cellerna inför vi en abstraktion changecolorsofacrosscells: Vi inför en abstraktion isleftcelldark för att ta reda på om färgen på den vänstra cellen är mörk, och en abstraktion isrightcelldark för att ta reda på om färgen på den högra cellen är mörk. //Change color of the cell on left side and of the cell on right side. private void changecolorsofacrosscells() { //changecolorsofacrosscells //return: true if the cell on left side of the robot is dark, otherwise false. private boolean isleftcelldark() { //isleftcelldark Metoden swapacrosscells får då följande implementation: //Swapping colors of two across cells. private void swapacrosscells() { if (isleftcelldark()!= isrightcelldark()) changecolorsofacrosscells(); //swapacrosscells //return: true if the cell on right side of the robot is dark, otherwise false. private boolean isrightcelldark() { //isrightcelldark 39 40

Metoden isleftcelldark Metoden isrightcelldark För att ta reda på om cellen till vänster är mörk måste roboten gå in i cellen, kontrollera cellens färg och gå tillbaks till sin ursprungliga position. Vi inför abstraktion turnaround som vrider roboten 180 grader: För att svänga roboten till höger inför abstraktion turnrigth som vrider roboten 90 grader åt höger: //before: None. //after: The robot has turned 90 degree to right. public void turnright() { //turnright //before: None. //after: The robot is facing the opposite direction. private void turnaround() { //turnaround Metoden isrightcelldark får då följande implementation: Metoden isleftcelldark får då följande implementation: //Returns true if the cell on right side of the robot is dark, otherwise false. private boolean isrightcelldark() { turnright(); boolean isdark = robot.ondark(); turnright(); return isdark; //isrightcelldark //Returns true if the cell on left side of the robot is dark, otherwise false. private boolean isleftcelldark() { boolean isdark = robot.ondark(); return isdark; // isleftcelldark 41 Metoden turnaround och turnright 42 Metoden changecolors Att ändra färgerna på motstående celler innebär att den vänstra cellen skall byta färg och att den högra cellen skall byta färg. Vi inför abstraktionerna changecolorofleftcell och changecolorofrightcell: Metoden turnaround innebär att roboten skall svänga två gånger åt väster: //before: None. //after: The robot is facing the opposite direction. private void turnaround() { //turnaround //Change color of the cell on left side of the robot. private void changecolorofleftcell() { //changecolorofleftcell Metoden turnright innebär att roboten skall svänga tre gånger åt väster. Vi nytjar metoden turnaround i implementationen: //Change color of the cell on right side of the robot. private void changecolorofrightcell() { //changecolorofrightcell //before: None. //after: The robot has turned 90 degree to right. public void turnright() { //turnright 43 44

Metoden changecolorsofacrosscells Metoderna changecolorofleftcell och changecolorofrightcell Implementationen av metoden changecolorsofacrosscells får följande utseende: För att byta färgen på en cell inför vi abstraktionen switchcolor: //Switch color of the cell. //before: None. //after: If the cell, the robot is located at, was dark it has become light, // and if the cell was light it has become dark. private void switchcolor() { //switchcolor //Change colors of the cells on left side and on right side of the robot. private void changecolorsofacrosscells() { changecolorofleftcell(); changecolorofrightcell(); //changecolorsofacrosscells 45 46 Metoden switchcolor Metoderna changecolorofleftcell och changecolorofrightcell Implementationerna av changecolorofleftcell och changecolorofrightcell får följande utseende: Implementationen av switchcolor får följande utseende: //Change color of the cell on left side of the robot. private void changecolorofleftcell() { //Change color of the cell on right side of the robot. switchcolor(); private void changecolorofrightcell() { turnright(); //changecolorofleftcell switchcolor(); turnright(); //changecolorofrightcell 47 //Switch color of the cell. //before: None. //after: If the cell, the robot is located at, was dark it has become light, // and if the cell was light it has become dark. private void switchcolor() { if (robot.ondark()) robot.makelight(); else robot.makedark(); //switchcolor 48

Metoden returntostartposition Metoden is atandofcorridor och gotoofcorridor För att återvända till sin startposition måste roboten vända sig om, gå till andra ändan av korridoren och vända sig om igen. Vi inför abstraktionen gotoendofcorridor för att förflytta roboten från en given position till slutet av korridoren: Roboten är i slutet av korridoren om den är riktad mot en vägg (eller nått slutet av världen). Implementationen av metoden isatendofcorridor får följande utseende: //returns true if the robot is at the end of the corridor, otherwise false public boolean isatendofcorridor() { return!robot.frontisclear(); //isatendofcorridor //before: The robot is in the corridor, facing the cooridor. //after: The robot is at the end of the corridor, facing the wall. private void gotoendofcorridor() { //gotoendofcorridor Att gå till slutet av korridoren innebär att förflytta sig längs korridoren tills slutet av korridoren har nåtts. Implementationen av gotoendofcorridor får följande utseende: Implementationen av returntostartposition får då följande utseende: //before: The robot is at end of the corridor, facing the wall. //before: The robot is in the corridor, facing the cooridor. //after: The robot is at the end of the corridor, facing the wall. private void gotoendofcorridor() { while (!isatendofcorridor()) { //gotoendofcorridor //after: The robot is at beginning of the corridor, facing the corridor. private void returntostartposition() { gotoendofcorridor(); //returntostartposition 49 50