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



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

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

Övning 4. I denna övning ska vi titta på icke-muterbarhet kontra muterbarhet, samt metoderna equals, hashcode och clone.

Concurrency Saker händer samtidigt. Process En instans av ett program

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

Tentamen Programmering fortsättningskurs DIT950

Övning vecka 4. Denna vecka ska vi titta på icke-muterbarhet kontra muterbarhet, samt metoderna equals, hashcode och clone.

/* * * Lösningsförslag tentamen DIT950 * Datum * */ /* * -1 - */ För samtliga gäller,se föreläsningsanteckningar.

1.1 Runnable och Thread

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

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

Repetition av OOP- och Javabegrepp

Repetition av OOP- och Javabegrepp

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

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

Tentamen LÖSNINGSFÖRSLAG. c) Tilldelningen C x = new D() ger kompileringsfel eftersom klassen D är abstrakt.

Lösningsförslag. Programmeringsmetodik, KV: Java och OOP. 17 januari 2004

Föreläsning 3. Stack

Föreläsning 3. Stack

Parallellism, återblick

Övning vecka 6. public void method2() { //code block C method3(); //code block D }//method2

Övning 5. TDA550 - Objektorienterad programvaruutveckling, fk

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

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Objektorienterad programvaruutveckling, fk, TDA550. Exempeltentamen

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

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

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

Objektorienterad Programmering (TDDC77)

Chapter 4: Writing Classes/ Att skriva egna klasser.

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Vad kännetecknar en god klass. Vad kännetecknar en god klass. F12 Nested & Inner Classes

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

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

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Detta dokument är ett exempel, cirka hälften av en tentamen för TDA545 Objektorienterad programvaruutveckling

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

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Javas Exceptions. DD2385 Programutvecklingsteknik Fler bilder till föreläsning 7 23/ Kort om Javas Exceptions Trådar i Java

Objektorienterad programutveckling, fk

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

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

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

SI-pass 4. Johan Brook och Jesper Persson. 25 september Diskutera och svara på om påståendena nedan är äkta sanningar eller listiga lögner.

Tentamen för TTIT71 Programmering kl Institutionen för datavetenskap Linköpings universitet. Uppgift 1. (2 p)

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

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

The Last Adventure. Innehåll. Objektorientering. Språket Java. Java - Paket. Java - synlighet. Den sista lektionen. Repetition.

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

JAVAUTVECKLING LEKTION 4

Svaret kan ges i Javakod (eller i UML-klassdiagram). public class A { B minb;... } public class B { <B:s många variabler och metoder> } Lösning:

Föreläsning 3: Booleans, if, switch

Lösningsförslag till tentamen i EDAF25 Objektorienterad modellering och design Helsingborg

1 Comparator & Comparable

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

Institutionen för TENTAMEN CTH VT-14 Datavetenskap TDA550 DAG: TID: 8:30 12:30

Lösningsförslag till tentamen i EDA011 Programmeringsteknik för F, E, I, π och N

Föreläsning 8: Exempel och problemlösning

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

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

E02 "The Review" Föreläsning 2, HT2013 Grunderna, repetition. Johan Leitet. Kurs: 1dv403 Webbteknik I

Lösningsförslag till tentamen FYTA11 Javaprogrammering

Fakulteten för ekonomi, kommunikation och IT. Corba. Datum: Mathias Andersson

TENTAMEN OOP

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista Läsanvisningar och uppgifter

Lösningsförslag till tentamen

Detta dokument är ett exempel, cirka andra hälften av en tentamen för TDA545 Objektorienterad programvaruutveckling

Institutionen för TENTAMEN CTH HT-17 Datavetenskap TDA550

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

Examination i. PROGRAMMERINGSTEKNIK F1/TM1 TIN212 (Dugga) Dag: Onsdag Datum: Tid: (OBS 3 tim) Rum: V

Tentamen Nätverksprogrammering Lösningsförslag

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

Recitation 4. 2-D arrays. Exceptions

Tung bakgrundsaktivitet t.ex. Aktiva objekt t.ex. Animering, simulering. DD2385 Programutvecklingsteknik Några bilder till föreläsning 9 6/5 2013

Institutionen för TENTAMEN CTH VT-15 Datavetenskap TDA550 DAG: TID: 8:30 12:30

Föreläsning 12: Exempel och problemlösning

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

F4. programmeringsteknik och Matlab

DAT043 Objektorienterad Programmering

Tentamen, EDAA20/EDA501 Programmering

OOP Objekt-orienterad programmering

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

Tentamen. Lösningsförslag

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Institutionen för TENTAMEN CTH VT-15 Datavetenskap TDA550 DAG: TID: 8:30 12:30

Modelsvar för Tentamen för Objektorienterad programvaruutveckling, TDA545

Lösningar till tentamen i EDAF25

Tentamen ID1004 Objektorienterad programmering May 29, 2012

Institutionen för TENTAMEN CTH HT-14 Datavetenskap TDA550 DAG: TID: 14:00 18:00

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Lösningsförslag till tentamen

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

Språkkonventioner och redigering av tal.

OOP Objekt-orienterad programmering

TDDC77 Objektorienterad Programmering

TENTAMEN OOP

Objektorienterad Programkonstruktion. Föreläsning 11 6 dec 2016

TENTAMEN: Objektorienterad programmering. Läs detta! Skriv din tentamenskod på varje blad (så att vi inte slarvar bort dem).

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

Transkript:

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 4 Pelle Evensen, Daniel Wetterbro 17 november 2009 Sammanfattning Denna vecka ska vi titta på designmönstren State och Decorator, mer om klassinvarianter samt trådar. Övningarna är graderade (något subjektivt) från lätt ( ) till svår ( ). Svårighetsgraden hos en övning har inte nödvändigtvis med lösningens storlek att göra. 1 State Den mycket kompetente hushållsassistenten Arnold har byggts och ska konfigureras till användning två dagar i veckan 1. För att lätt kunna ändra på konfigurationen ska designmönstret State användas; där olika sätt att utföra operationerna lätt kan bytas ut genom att sätta olika tillstånd (states). De olika tillstånden medför dessutom att varje beteende blir väldefinierat. Se klasserna Arnold, DefaultState samt SundayState, fig. 1 3. Man kör Arnold genom två metoder: setday() berättar för Arnold vilken veckodag det är. work() får Arnold att städa och laga mat, om han tycker att det är en bra dag för det... Det saknas två delar i implementation: Interfacet RobotState som beskriver ett tillstånd (implementeras av alla tillstånd). En klass som beskriver vad Arnold ska göra på onsdagar (alltså ytterligare ett tillstånd för Arnold). Skriv dessa! 1 Arnold kräver så pass mycket underhåll att kunder drar sig för mer frekvent användning. 1

* Arnold, a personal household assistant public class Arnold { private RobotState state = null; public enum Weekday { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY public Arnold() { this.state = new DefaultState(); public void setday(weekday day) { switch (day) { case WEDNESDAY: System.out.println("\nWednesday acknowledged!"); this.state = new WednesdayState(); break; case SUNDAY: System.out.println("\nSunday acknowledged!"); this.state = new SundayState(); break; default: System.out.println("\nAah.. I love lazy days!"); this.state = new DefaultState(); break; public void work() { clean(); cook(); private void clean() { System.out.println("\nI need to clean?"); state.clean(); private void cook() { System.out.println("\nI need to cook?"); state.cook(); public static void main(string[ ] args) { Arnold mypersonalarnold = new Arnold(); mypersonalarnold.setday(weekday.monday); mypersonalarnold.work(); mypersonalarnold.setday(weekday.wednesday); mypersonalarnold.work(); mypersonalarnold.setday(weekday.sunday); mypersonalarnold.work(); Figur 1: Klassen Arnold. 2

public class DefaultState implements RobotState { @Override public void clean() { System.out.println("\nHa! In a free country " + "a free day is a free day!\n" + "Ahil bi back!"); @Override public void cook() { System.out.println("\nHa! In a free country " + "a free day is a free day!\n" + "Ahil bi back!"); Figur 2: Klassen DefaultState. public class SundayState implements RobotState { @Override public void clean() { try { System.out.println("\nTerminating your trash!"); Thread.sleep(1000); System.out.println("Killing rats..."); Thread.sleep(1000); System.out.println("Using vacuum cleaner..."); Thread.sleep(1000); System.out.println("Wiping floor..."); catch (InterruptedException ie) { Thread.currentThread().interrupt(); @Override public void cook() { try { System.out.println("\nYou live to eat and eat to live!"); Thread.sleep(1000); System.out.println("Shooting bull..."); Thread.sleep(1000); System.out.println("Cutting meat..."); Thread.sleep(1000); System.out.println("Desinfecting hands..."); Thread.sleep(1000); System.out.println("Marinading meat..."); Thread.sleep(1000); System.out.println("Preparing salad..."); Thread.sleep(1000); System.out.println("Setting table..."); Thread.sleep(1000); System.out.println("Shouting..."); Thread.sleep(1000); System.out.println("Serving..."); catch (InterruptedException ie) { Thread.currentThread().interrupt(); Figur 3: Klassen SundayState. 3

2 Decorator Olika utbildningar kräver olika kvalifikationer. Många har dessutom samma typ av krav, men i olika kombinationer. För att dela upp behandlingen av de olika kriterierna skrivs de med fördel i olika klasser. Men om arv skulle användas för att kedja samman kriterier för olika bedömningar sker en explosion i antal klasser; om antal olika kriterier är n, blir antal olika bedömningar n i=1 i!. Istället kan designmönstret Decorator användas. Då kan en bedömning dynamiskt (under körning) dekoreras (utökas) med nya kriterier. I uppgiften ska Sven och Arne söka till två utbildningar, älgförsäljare respektive ett internship som ekonom med positionering i Frankfurt; båda kräver naturligtvis kunskaper i det tyska språket. Älgförsäljarjobbet kräver dessutom goda färdigheter i skytte medan ekonompositionen kräver ett visst resultat på högskoleprovet. Den ofullständiga implementationen finns i klasserna Application, CriterionDecorator, Mark och Criterion i fig. 4 7. Lägg till de tre kriterieklasserna: HpCriterion, ShootingCriterion och GermanCriterion. 4

* Application information public class Application { private String name; private double hppoints; private Mark germanmark; private Mark shootingmark; * @pre 0.0 <= hpp <= 2.0 * @param hpp Högskoleprov result * @param gm German language mark * @param sm Shooting skill mark public Application(String n, double hpp, Mark gm, Mark sm) { this.name = n; this.hppoints = hpp; this.germanmark = gm; this.shootingmark = sm; /*... Accessor methods omitted... * Test program * @param args ignored public static void main(string[ ] args) { // Create criteria Criterion mooseseller = new GermanCriterion(Mark.SUFFICIENT, new ShootingCriterion(Mark.EXCELLENT)); Criterion frankfurteconomist = new GermanCriterion(Mark.EXCELLENT, new HpCriterion(1.8)); // Create applications Application svenapp = new Application("Sven Svensson", 1.8, Mark.GOOD, Mark.EXCELLENT); Application arneapp = new Application("Arne Andersson", 1.7, Mark.EXCELLENT, Mark.SUFFICIENT); // Test applications against criteria System.out.println("Is Sven a possible moose seller?\n: " + mooseseller.evaluate(svenapp)); System.out.println("Is Arne a possible economist in Frankfurt?\n: " + frankfurteconomist.evaluate(arneapp)); Figur 4: Klassen Application. 5

* Decorator for criteria public abstract class CriterionDecorator implements Criterion { private Criterion nextcriterion; * @param c A possible next criterion, null for termination of chain. public CriterionDecorator(Criterion c) { nextcriterion = c; @Override public boolean evaluate(application a) { if (nextcriterion!= null) { return nextcriterion.evaluate(a); else { return true; Figur 5: Klassen CriterionDecorator. * Enumeration of mark levels public enum Mark { POOR, SUFFICIENT, GOOD, EXCELLENT Figur 6: Klassen Mark. * Criterion public interface Criterion { * @pre a is non-null * @param a Application to evaluate * @return true if the evaluation passed, false otherwise. public boolean evaluate(application a); Figur 7: Klassen Criterion. 6

3 Trådar 3.1 Runnable och Thread Skriv klart klasserna ShoutTest, ShoutRunnable och ShoutThread (fig. 8 10). Låt varje aktör vila en sekund mellan sina skrik. Vilka fördelar respektive nackdelar finns det med Thread kontra Runnable? public class ShoutTest { public static void main(string[ ] args) { Thread pelle = new ShoutThread("Pelle", "Daniel"); Runnable daniel = new ShoutRunnable("Daniel", "Pelle"); // Add your own code to make Pelle start shouting at // Daniel and vice versa. Figur 8: Klassen ShoutTest. public class ShoutRunnable implements Runnable { private final String from; private final String to; public ShoutThread(String from, String to) { this.from = from; this.to = to; private void shout() { System.out.println(from + " shouts: Done with " + " the exercises yet, " + to + "???"); public class ShoutThread extends Thread { private final ShoutRunnable g; public ShoutThread(String from, String to) { g = new ShoutRunnable(from, to); // Add necessary methods here. Figur 10: Klassen ShoutThread. // Add necessary methods here. Figur 9: Klassen ShoutRunnable. 3.2 Time of check/time of use (TOCTOU) Ett ganska vanligt fel då man handskas med data som kan förändras av andra trådar eller processer är att man utgår från att data fortfarande har samma värde då man använder dem som när man senast läste av dem. Detta fel är allmänt känt som Time of check/time of use. Problemet kan alltså uppstå då det finns en möjlig tidsavvikelse mellan check och use. Kan problemet uppstå för icke-muterbara klasser? 7

3.2.1 TOCTOU I Med texten ovan som ledning, förklara hur vi kan bryta mot klassinvarianten i Period (fig. 11). Denna klass såg vi i vecka två. De problem vi hade då löste vi med hjälp av defensiv in- och utkopiering. Klassen är efter denna åtgärd dock fortfarande inte trådsäker. Hur kan vi lösa problemet (garantera att klassinvarianten alltid håller)? * @invariant getstart() is before or at the same time as getend() public final class Period { private final Date start; private final Date end; * @param start the beginning of the period * @param end the end of the period; must not precede start * @pre start.compareto(end) <= 0 * @throws IllegalArgumentException if start is after end * @throws NullPointerException if start or end is null public Period(Date start, Date end) { if (start.compareto(end) > 0) { throw new IllegalArgumentException(start + " after " + end); this.start = new Date(start.getTime()); this.end = new Date(end.getTime()); public Date getstart() { return new Date(start.getTime()); public Date getend() { return new Date(end.getTime()); Figur 11: Klassen Period. 8

3.2.2 Ofullständig klassinvariant & race conditions Ett race condition är en defekt i ett program vilket gör att programmet bara fungerar korrekt när saker sker i en viss (oväntat välbestämd) ordning. Klassen LightColor (fig. 12) vill vi kunna använda för att garantera att vi bara kan få tag på ljusa Color-objekt. Kriteriet för ljus är att medelvärdet av intensitetsvärdena för röd, grön & blå är över 128. Följande deluppgifter visar på varför denna specifikation är otillräcklig; 1. Det saknas en klassinvariant om man vill kunna garantera att ascolor alltid returnerar ett giltigt Color-objekt. Fundera ut hur en lämplig komplettering av den befintliga invarianten skulle kunna se ut och lägg till eventuell kod i checkinvariant. Ledtråd: Fundera ut vad lämpligt pre för metoden ascolor skulle kunna vara. Bör metoden under några omständigheter kasta exception? 2. Vad bör pre och post vara för metoden setcolor? Använd följande notation: x är parametern x och after.x är instans-/klassvariabeln x:s tillstånd då metoden returnerar. 3. Visa varför man fortfarande inte är garanterad att ascolor returnerar en ljus färg, om än ett giltigt Color-objekt. Tänk på att flera trådar kan dela på samma LightColor-objekt. Det finns alltså ett race condition i koden. 4. Lägg till lämplig kod som gör att båda invarianterna håller samt garanterar att man alltid får tillbaka en ljus färg av ascolor. 9

* @invariant r + g + b > THRESHOLD * @invariant Think of one more reasonable invariant... public class LightColor { public static final THRESHOLD = 384; private int r, g, b; * @throws IllegalArgumentException if the colour specified by r, g, b is too dark. public LightColor(int r, int g, int b) { setcolor(r, g, b); * @pre What should the precondition(s) be? * @post What should the postcondition(s) be? * @throws IllegalArgumentException if the colour specified by r, g, b is too dark. public setcolor(int r, int g, int b) { if(checkinvariant(r, g, b)) { this.r = r; this.g = g; this.b = b; else { throw new IllegalArgumentException( "The sum of r, g, b must be greater than " + THRESHOLD); // See setcolor(int, int, int) public setcolor(color c) { setcolor(c.getred(), c.getgreen(), c.getblue()); * Returns a Color-view of this object. * @pre What should the precondition(s) be? * @throws Can this method throw? public Color ascolor() { return new Color(r, g, b); // Make sure that the the rgb triple will satisfy the invariant. private boolean checkinvariant(int r, int g, int b) { return r + g + b > THRESHOLD; Figur 12: Klassen LightColor. 10

3.3 Deadlock Betrakta klassen Person 2 (fig. 13). Här sitter Daniel och Pelle och tänker. Det är dock inte helt lyckat att de kan störa varandra när som helst. Gör så att en person inte får bli störd medans den tänker. Det vill säga, om en annan tråd anropar getaquestionfrom så får den andra tråden vänta tills den första tråden låtit personen tänka klart. Om man synkroniserar alla metoder, blir programmet trådsäkert? Antag t.ex. att man låter både getaquestion och getananswer vara synchronized. public class Person extends Thread { private String name; private Person whomtoask; public Person(String name) { this.name = name; public void setwhomtoask(person whomtoask) { this.whomtoask = whomtoask; public String tostring() { return name; private void getaquestionfrom(person p) { try { System.out.println(this + " says: I got a question from " + p); // Think a while before answering... Thread.sleep(50); p.getananswerfrom(this); catch (InterruptedException e) { Thread.currentThread().interrupt(); private void getananswerfrom(person p) { System.out.println(this + " says: I got an answer from " + p); public void run() { whomtoask.getaquestionfrom(this); public static void main(string[ ] args) { Person p1 = new Person("Pelle"); p1.setwhomtoask(p2); Person p2 = new Person("Daniel"); p2.setwhomtoask(p1); p1.start(); p2.start(); Figur 13: Klassen Person. 2 Lånad av Bror Bjerner från tentamen april 2009. 11

3.3.1 Om svårigheten att testa program. Om man har n personer, hur lång tid tar det ungefär innan eventuella fel ovan manifesterar sig (vi ser effekten av dem) givet antaganden nedan; Antag att man har många personer i systemet. Alla personer ställer en fråga var tionde sekund eller så till en slumpvis vald (annan) person. De ligger inte nödvändigtvis i fas med varandra även om de ställer frågorna med någorlunda regelbundenhet. Varje person tar 1 ms på sig att svara och ställa en motfråga. Antag att vi gör hela getaquestion() och getananswer() synchronized. Får man samma resultat (fast snabbare eller långsammare) om man ändrar ordningen så här; Antag att ordningen är strikt cyklisk så att varje person k först ställer sin fråga till person mod(k + 1, n), sedan väntar en stund, frågar person mod(k + 2, n), o.s.v. 3. Antag också att de vid från början (men kanske inte senare) är i fas med varandra. Som deluppgift betraktad så är denna väl svår (och kanske inte tillräckligt välspecificerad) för att man ska kunna utföra en bra beräkning. Tänkvärt är dock om sannolikheten att det blir trassel/lösningen inte fungerar som tänkt är noll eller inte. [Blo08] Referenser [Blo08] Joshua Bloch. Effective Java. Addison-Wesley, 2nd edition, 2008. 3 mod(a, b) är restdivision för a. Synonymt med a % b i Java. b 12