Övning 5. TDA550 - Objektorienterad programvaruutveckling, fk

Relevanta dokument
Lösningsförslag: Övning 5.

Övning vecka 5. Denna vecka ska vi titta pa samlingar, generics och designmönstren Decorator, Singleton och Iterator.

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

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

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

1 Comparator & Comparable

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

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:

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

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

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

Enkla variabler kontra referensvariabel

Lösningsförslag övning 2.

Tentamen LÖSNINGSFÖRSLAG

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

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

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

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

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

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

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

Tentamen i EDAF25. 1 juni Skrivtid: Skriv inte med färgpenna enda tillåtna färg är svart/blyerts.

TENTAMEN OOP

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

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

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

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

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

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

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

Objektorienterad programvaruutveckling, fk, TDA550. Exempeltentamen

Enkla variabler kontra referensvariabel

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

TENTAMEN: Objektorienterad programutveckling, fk. Läs detta! Uppgifterna är inte ordnade efter svårighetsgrad.

Programmering för språkteknologer II, HT2011. Rum

Föreläsning 6. Mer om klasser och objekt. Enkla variabler kontra referensvariabel. Omslagsklassen Integer. Referensvariabler

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

Repetition av OOP- och Javabegrepp

Lösningar till tentamen i EDAF25

public interface Skrivbar { void skriv(); } public class Punkt implements Skrivbar { public double x; public double y;

Del A (obligatorisk för alla)

Repetition av OOP- och Javabegrepp

Lycka till! TENTAMEN: Objektorienterade applikationer. Läs detta! 1 (6) Tentamen

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

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

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

DAT043 - Föreläsning 7

Tentamen. DD2385 Programutvecklingsteknik vt 2014 Måndagen den 2 juni 2014 kl Hjälpmedel: penna, suddgummi, linjal

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

Tentamen Programmering fortsättningskurs DIT950

TDA550 - Objektorienterad programvaruutveckling, fk

F6 Objektorienterad design. ID1004 Objektorienterad programmering Fredrik Kilander

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

Sammanfattning och repetition utgående från typiska tentamensuppgifter

Tentamen i Objektorienterad programmering

TENTAMEN OOP

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

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

Tentamen. DD2385 Programutvecklingsteknik vt Tisdag 7 juni 2016 kl

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

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

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

Institutionen för TENTAMEN CTH HT-13 Datavetenskap TDA550 DAG: TID: 8:30 12:30

Generiska konstruktioner. Kursbokens kapitel 13

Tentamen. DD2385 Programutvecklingsteknik vt 2013 Onsdagen den 22 maj 2013 kl Hjälpmedel: penna, suddgummi, linjal

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

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

Algoritmer. Två gränssnitt

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.

Objektorienterad Programkonstruktion. Föreläsning jan 2016

Del A (obligatorisk för alla)

DIAGNOSTISKT PROV. Tid. Hjälpmedel. Antaganden. Rättning. Övrigt. Diagnostiskt Prov. Klockan Inga

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

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

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

HT1 2013, FÖRELÄSNING 14 (INFÖR TENTAN)

OOP Objekt-orienterad programmering

F4 Klasser och Metoder. ID1004 Objektorienterad programmering Fredrik Kilander

DD2385 Programutvecklingsteknik Några bilder till föreläsning 1 24/ Kursöversikt Javarepetition/Javaintroduktion

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

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

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

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

Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

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

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

Variabler som hör till enskilda objekt. Deklareras på översta nivån i klassen och i regel som private.

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 3: Booleans, if, switch

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

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

Föreläsning 1, vecka 6: Abstraktion genom objektorientering

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Lycka till! TENTAMEN: Objektorienterade applikationer. Läs detta! 7 (7) Tentamen

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

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

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

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

Tentamen i Objektorienterad modellering och diskreta strukturer

Objektorienterad programutveckling, fk

Transkript:

TDA550 - Objektorienterad programvaruutveckling, fk Övning 5. Denna vecka ska vi titta på designmönstren Singleton, State, Observer, Composite och Decorator, samt gränssnittet Comparator. Uppgift 1 Syftet med designmönstret Singleton är att kunna garantera att endast en instans av en viss klass existerar. Oftast skall också denna instans kommas åt utifrån klassen. Nedan ges en klass med enbart klassmetoder. Är denna klass en singleton? Om inte, hur ska vi förändra klassen så att den blir en singleton? Spelar det någon roll om klassen är en singelton eller inte? public class GameTile { // code not show here public class GameUtils { public static GameTile[][] newboard(final int width, final int height, final GameTile basetile) { GameTile[][] board = new GameTile[width][height]; fillboard(board, basetile); return board; public static void fillboard(final GameTile[][] board, final GameTile basetile) { for (GameTile[] row : board) { for (int j = 0; j < row.length; j++) { row[j] = basetile; Uppgift 2 Betrakta nedanstående klass: public class Counter { private int value; private boolean countingup; public Counter() { value = 0; countingup = true; public void set(int value) { this.value = value; public int get() { return value; public void step() { if (countingup) value = value +1; else value = value - 1; public void setcountingup() { countingup = true; public void setcountingdown() { countingup = false; Gör om designen genom att använda designmönstret State. Övning 5 1 TDA550 HT-18

Uppgift 3 Designmönstret Strategy är en lämplig teknik att ta till då bara delar av en implementation varierar. Gränssnittet Comparator är ett exempel inom Javas standard-api på en strategi. I en typisk sorteringsalgoritm är det lämpligt att bryta ut själva jämförelsen av elementen från resten av algoritmen, därigenom blir jämförelsekriteriet enkelt utbytbart. Betrakta klassen Integrator nedan: public class Integrator { public enum Function { FUNCTION1, FUNCTION2, FUNCTION3 public static double integrate(function f, double a, double b, int steps) { double sum = 0.0; double previous = fun(f, a); double delta = (b - a) / steps; for (int i = 1; i <= steps; i++) { double x = a + (b - a) * i / steps; double current = fun(f, x); // Compute the integral through Simpson's 3/8 rule. sum += delta / 8 * (previous + current + 3 * (fun(f, (2 * (x - delta) + x) / 3.0) + fun(f, (3 * x - delta) / 3.0))); previous = current; return sum; private static double fun(function f, double x) { switch (f) { case FUNCTION1: { return Math.log(Math.log(x)); case FUNCTION2: {return Math.pow(x, x); case FUNCTION3:{ return Math.sin(Math.sin(x)); default: throw new IllegalArgumentException("Illegal function!"); Metoden integrate gör en numerisk skattning av integralen f x dx där fk(x) är någon av funktionerna f1(x) = log(log(x)), f2(x) = x x, f3(x) = sin(sin(x)). Ett allvarligt problem med klassen Integrator är den inte stödjer Open-Closed principen. Vi måste förändra klassen varje gång vi vill integrera en ny funktion, trots att metoden för själva integrationen inte förändras. Vi kan därmed inte skapa nya funktioner under körning. Skriv om klassen Integrator så att den istället för fasta funktioner tar en strategi som parameter till metoden integrate. Du behöver bara skapa en korrekt strategi samt förändra metoden integrate på lämpligt vis. Tips: Enum-typen Function ska inte finnas med i lösningen. Övning 5 2 TDA550 HT-18

Uppgift 4 Betrakta klasserna Bee och Flower nedan public class Bee { private final String name; public Bee(String name) { this.name = name; public String getname() { return name; //... public class Flower { private final String name; public Flower(String name) { this.name = name; public void visit(bee b) { System.out.println(name + " is beeing visited by " + b.getname()); public void bloom() { System.out.println(name + " is blooming!"); //... Komplettera dessa klasser så att designmönstret Observer realiseras. När en blomma blommar meddelar den detta till alla bin som är observatörer, och när ett bi som får reda på att en blomma blommar besöker biet blomman. Nedanstående huvudprogram illustrerar hur det hela är tänkt att fungera: public static void main(string[] args) { Flower f = new Flower("Blossom"); Bee b1 = new Bee("Bob"); Bee b2 = new Bee("Fred"); f.addobserver(b1); f.addobserver(b2); f.bloom(); Utskriften blir: Blossom is blooming! Blossom is beeing visited by Bob Blossom is beeing visited by Fred Java stöder designmönstret Observer genom att tillhandahålla interfacet Observer och klassen Observable, samt interfacet PropertyChangeListener och klassen PropertyChangeSupport. Du skall dock här göra en egen (!) implementation av designmönstret Observer. Följande, något förenklade, gränssnitt är givna: public interface Observable { void addobserver(observer o); void removeobserver(observer o); void notifyobservers(); public interface Observer { void update(observable obs); Övning 5 3 TDA550 HT-18

Uppgift 5 I många ordbehandlingsprogram finns möjlighet att automatiskt producera en innehållsförteckning över alla sektioner i ett dokument. Alla rubriker på olika nivåer i dokumentet kommer med i innehållsförteckningen. Varje rad börjar med rubrikens sektionsnummer följt av själva rubriktexten. Sektioner kan vara hierarkiskt uppbyggda med undersektioner, som i sin tur kan innehålla undersektioner o.s.v. Sektionshierarkin i en innehållsförteckning kan representeras med designmönstret Composite enligt nedanstående UML-diagram: Implementera klassen Section. Följande exempel visar hur utskriften skall se ut. Tips: För att enkelt kunna hantera sektionsnumreringen rekommenderas att definiera en privat hjälpmetod, print(string), som anropas av print() på lämpligt sätt. Övning 5 4 TDA550 HT-18

Uppgift 6 I ett programsystem för att hantera tärningsspel finns gränssnittet public interface Die { void roll(); // rolls the die int getvalue(); // returns the face value samt klassen public class StandardDie implements Die { //code not shown here som implementerar en vanlig sexsidig tärning. Nu behöver man ha tillgång till tärningar som aldrig upprepar föregående utfall vid nästföljande kast. En sådan tärning ger t.ex. aldrig två sexor i följd. Din uppgift är att implementera klassen public class NoRepeatDie implements Die genom att använda designmönstert Decorator. Klassen NoRepeateDie har, förutom metoderna som specificeras av gränssnittet Die, även metoden public void norepeatroll() som skiljer sig från metoden roll genom att den aldrig ger samma värde två gånger i följd. Uppgift 7 Betrakta klassen Car nedan: public final class Car { private final String manufacturer; private final String modelname; private final int modelyear; private final String serialnumber; public Car(String manufacturer, String modelname, int modelyear, String serialnumber) { this.manufacturer = manufacturer; this.modelname = modelname; this.modelyear = modelyear; this.serialnumber = serialnumber; public String getmanufacturer() { return manufacturer; public String getmodelname() { return modelname; public int getmodelyear() { return modelyear; public String getserialnumber() { return serialnumber; public String tostring() { return " manufacturer: " + this.manufacturer + ", modelname: " + this.modelname + ", modelyear: " + this.modelyear + ", serialnumber: " + this.serialnumber; Övning 5 5 TDA550 HT-18

a) Vi vill att objekt av klassen Car skall kunna sorteras i stigande ordning med avseende på följande variabler: 1. modelyear 2. manufacturer 3. modelname Om två bilar är av samma årsmodell jämför man också tillverkare, om tillverkare också är lika, jämförs även modellnamn. Skriv om klassen Car så att den implementerar gränssnittet Comparable. Metoden compareto i Car skall ge ordningen enligt ovan. The Java Language Specification rekommenderar att metoden compareto() är konsistent med metoden equals(), d.v.s. för två objekt a och b där a.compareto(b) == 0 skall gälla att a.equals(b) == true. Om detta inte uppfylls kan det t.ex. inträffa underligheter när objekten lagras i samlingar. Implementera därför även metoden equals i klassen Car. b) I de fall då vi vill tillhandahålla mer än en ordning för en klass använder vi oss av gränssnittet Comparator (detta kan vi så klart också använda för att ordna objekt av en klass som inte redan implementerar Comparable). Skriv en klass public class CarComparator implements Comparator<Car> som kan användas för att sortera objekten i klassen Car i stigande ordning med avseende på: 1. manufacturer 2. modelyear 3. modelname Om två bilar har samma tillverkare jämför man också årsmodell, om årsmodellen också är lika, jämförs även modellnamn. c) Objekten i Car kan dock sorteras efter många andra ordningar än den som implementeras av CarComparator ovan. Eftersom Car har 4 instansvariabler kan dessa ordnas på 4! = 24 olika sätt. Dessutom kan varje instansvariabel sorteras efter både stigande och fallande ordning. Det totala antalet ordningar som objekten i Car kan sorteras på blir därför 2 4 * 4! = 16 * 24 = 384 olika sätt. Det behövs således 384 olika implementationer av gränssnittet Comparator för att få alla totala ordningar för objekten i klassen Car. Ett betydligt flexiblare sätt är att nyttja designmönstren Decorator och Template Method, genom att skapa en jämförare för varje instansvariabel och seriekoppla dessa efter behov. Implementera denna idé för klassen Car. Övning 5 6 TDA550 HT-18