Objektorienterad Programkonstruktion, DD1346 FACIT. Tentamen , kl

Relevanta dokument
Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Objektorienterad Programkonstruktion, DD1346 FACIT. Tentamen , kl

Objektorienterad Programkonstruktion. Föreläsning jan 2016

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

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

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

Objektorienterad Programkonstruktion. Föreläsning 6 23 nov 2015

Lösningar till Fiktiv Tentamen på kursen. 2D4135 Objektorienterad programmering, design och analys med Java vt2004. Teoridel

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

Tentamen. DD2385 Programutvecklingsteknik vt Fredagen den 5 juni 2009 kl Inga hjälpmedel utom penna, sudd och linjal

Kopiering av objekt i Java

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

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

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

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

DAT043 Objektorienterad Programmering

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Tentamen. DD2385 Programutvecklingsteknik vt 2015 Fredagen den 5 juni 2015 kl Hjälpmedel: penna, suddgummi, linjal

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

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

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

Objektorienterad Programkonstruktion. Föreläsning 7 24 nov 2015

Generisk klass med typparameter Inre klass - ListIterator

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

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

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

Tentamen ID1004 Objektorienterad programmering October 29, 2013

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

Objektorienterad Programkonstruktion. Föreläsning dec 2015

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

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

DAT043 - Föreläsning 7

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

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

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

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

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

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

PROGRAMMERINGSTEKNIK TIN212

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

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

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

Tentamen. DD2385 Programutvecklingsteknik vt 2011 Tisdagen den 24 maj 2011 kl Hjälpmedel: penna, suddgummi, linjal

Vad är ett objekt? Tillstånd och beteende. Vad är ett objekt? Exempel

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

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

Tentamen Programmering fortsättningskurs DIT950

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

Lösningar till tentamen i EDAF25

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

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

Programmering B med Visual C

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

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

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

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

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

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

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

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

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

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

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

Konstruktion av klasser med klasser

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 14

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

Målen med OOSU. Objektorienterad programmering. Objektorienterad programmering. Karlstads Universitet, Johan Öfverberg 1

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

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

CHALMERS TENTAMEN. 2018/2019, lp 1 DAT050. Uno Holmer

Tentamen. DD2385 Programutvecklingsteknik vt Tisdag 7 juni 2016 kl

Lösningar till tentamen i EDAF25

LÖSNINGSFÖRSLAG TENTAMEN

UML. Översikt UML. Relationer mellan klasser. A är ett aggregerat av B:n. Kontor aggregat av Enheter. 12 olika diagramtyper, bl.a.

Lösningsförslag till tentamen

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

Föreläsningsmaterial (Arv) Skrivet av Andreas Lund

Classes och Interfaces, Objects och References, Initialization

a. Vilka av följande påståenden är riktiga? Observera att felaktigt valda påståenden ger poängavdrag. (4p)

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 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

Tentamen Nätverksprogrammering Lösningsförslag

TENTAMEN OOP

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

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

Objektorienterad programmering i Java

Laboration 3, uppgift En klass för en räknare

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

Klasshierarkier - repetition

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

Lösningsförslag till tentamen

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

Tentamen, EDAA10 Programmering i Java

Transkript:

Skolan för datavetenskap och kommunikation Objektorienterad Programkonstruktion, DD1346 FACIT Tentamen 20150314, kl. 10.00-13.00 Tillåtna hjälpmedel: Papper, penna och radergummi. Notera: Frågorna i del I ska besvaras på för ändamålet lämnad plats i tentamenslydelsen. Frågorna i del II besvaras på separat papper behandla högst en uppgift per sida. Kom ihåg att skriva namn och personnummer på alla inlämnade blad. Skriv tydligt! Betygsgränser: Betyg FX: 17p i del I Betyg E: 20p i del I Betyg D: 20p i del I och 5p i del II Betyg C: 20p i del I och 10p i del II Betyg B: 20p i del I och 15p i del II Betyg A: 20p i del I och 20p i del II Ansvarig: Christian Smith (ccs@kth.se) Lycka till! 1

Del I - ervalsfrågor 1. I denna uppgift nns 4 namn på designmönster, åtföljda av 3 UML-diagram vardera. Generiska namn används i stället för standardiserade namn. För varje mönster, ange det UML-diagram som bäst beskriver en implementation av det. Varje korrekt angivet UML-diagram ger 1 p. (4 p) a) Adapter Client VarA:ClassA ClassA VarB:ClassB +doa() ClassB +dob() varb.dob() bu bu bu bu bu bu bu bu bu bu bu bu bu bu bu <Interface> IntFac +somemethod() Client varb:intfac ImplementationA +somemethod() ImplementationB vara:implementationa +somemethod() VarA.someMethod() bu bu bu bu bu bu bu bu bu bu bu bu bu bu bu ImplementationA <Interface> IntFac Client varb:intfac +othermethod() +somemethod() ImplementationB Adapter +somemethod() othermethod() 2

b) Facade ClientA ClientB ClientC SomeClass AnotherClass ObscureClass PrettyClass vara:someclass varb:anotherclass varc:obscureclass vard:yetanotherclass +DoStuff() vara.somemethod() varb.dothings(vara) VarA.someOtherMethod() varc.docrazystuff(vara,varb) vard.donttrythisathome(varb) varb.add(vara,varc,vard) vard.goodmethod() vard.badmethod(varc) vard.uglymethod(vard) YetAnotherClass Facade bu bu bu bu bu bu bu bu bu bu bu bu bu bu ClientA ClientB ClientC bu <Interface> FacadInt SomeClass AnotherClass ObscureClass YetAnotherClass 3

ClientA ClientB ClientC SomeClass AnotherClass ObscureClass YetAnotherClass PrettyClass +vara:someclass +varb:anotherclass +varc:obscureclass +vard:yetanotherclass +geta() +getb() +getc() +getd() if vara = null vara = new SomeClass() end return vara <osv for getb, getc och getd> 4

c) Factory Client vara:aclass seta() AClass +create():aclass decisionfunction() if decisionfunction() return new SubA() else return new SubB() end vara = vara.create() SubA SubB Client bu bu bu bu bu bu bu bu bu bu bu bu bu bu bu AClass vara:intfac +create():intfac seta() <Interface> IntFac vara = AClass.create() +somemethod() ImplementationA ImplementationB ImplementationC +somemethod() +somemethod() +somemethod() Factory bu bu bu bu bu bu bu bu bu bu bu bu bu bu bu Client vara:otherclass varb:aclass AClass +create():otherclass seta() OtherClass vara = varb.create() 5

d) Observer ConcreteClass +dosomething() AClass vara:concreteclass varb:sometype +changeb() varb.change() vara.dosomething() bu bu bu bu bu bu bu bu bu bu bu bu bu bu bu <Interface> IntFac +dosomething() ConcreteClass AClass vara:list<intfac> varb:sometype +addtolist(intfac) +changeb() doforallinlist() varb.change() doforallinlist() Observer +dosomething() for all IntFac in vara dosomething() bu bu bu bu bu bu bu bu bu bu bu bu bu <Interface> IntFac ConcreteClass bu bu +dosomething() +dosomething() AClass vara:list<intfac> varb:sometype +addtolist(intfac) +changeb() doforallinlist() varb.change() doforallinlist() for all IntFac in vara dosomething() 6

2. I denna uppgift nns 4 namn på designmönster, åtföljda av 3 kodlistningar vardera. Generiska namn används i stället för standardiserade namn. För varje mönster, ange den kodlistning som bäst implementerar det. Varje korrekt angiven kodlistning ger 1 p. (4 p) a) Prototype public class Prototype1 implements Cloneable{ private static Prototype1 myprototype = null; private SomeTypeA mya; private SomeTypeB myb; private SomeTypeC myc; private Prototype1(){ mya = new SomeTypeA(); myb = new SomeTypeB(); myc = new SomeTypeC(); mya.doheavystuff(); myb.doheavierstuff(); myc.doreallyheavystuff(); public Prototype1 clone() throws CloneNotSupportedException{ Prototype1 output = (Prototype1)super.clone(); output.mya = mya.clone(); output.myb = myb.clone(); output.myc = myc.clone(); return output; public static Prototype1 getclone() throws CloneNotSupportedException{ if(myprototype == null){ myprototype = new Prototype1(); return myprototype.clone(); 7

public class Prototype2 implements Cloneable{ private static SomeTypeA mya = new SomeTypeA(); private static SomeTypeB myb = new SomeTypeB(); private static SomeTypeC myc = new SomeTypeC(); private Prototype2(){ mya.doheavystuff(); myb.doheavierstuff(); myc.doreallyheavystuff(); public Prototype2 clone() throws CloneNotSupportedException{ Prototype2 output = (Prototype2)super.clone(); return super.clone(); public static Prototype2 getclone(){ return this.clone(); 8

public class Prototype3 implements Cloneable{ private static Prototype3 myprototype = new Prototype3(); private SomeTypeA mya; private SomeTypeB myb; private SomeTypeC myc; private Prototype3(){ mya = new SomeTypeA(); myb = new SomeTypeB(); myc = new SomeTypeC(); mya.doheavystuff(); myb.doheavierstuff(); myc.doreallyheavystuff(); public static Prototype3 clone() throws CloneNotSupportedException{ return (Prototype3)super.clone(); 9

b) Singleton public class Singleton1{ private Singleton1 theinstance = new Singleton1(); private Singleton1(){ public Singleton1 getinstance(){ return theinstance; public class Singleton2{ private static Singleton2 theinstance = new Singleton2(); private Singleton2(){ public static Singleton2 getinstance(){ return theinstance; public class Singleton3{ private static Singleton3 theinstance = new Singleton3(); private Singleton3(){ public Singleton3 getinstance(){ return theinstance; 10

c) Lock public class Lock1{ private static Object mylock = new Object(); private int a = 0; public void incrementa(){ synchronized(mylock){ a++; public void decrementa(){ synchronized(mylock){ a--; public int geta(){ synchronized(mylock){ return a; public class Lock2{ private int a = 0; public synchronized void incrementa(){ a++; public synchronized void decrementa(){ a--; public synchronized int geta(){ return a; 11

public class Lock3{ private Object mylock = new Object(); private static int a = 0; public void incrementa(){ synchronized(mylock){ a++; public void decrementa(){ synchronized(mylock){ a--; public int geta(){ synchronized(mylock){ return a; 12

d) Flyweight public class Flyweight1{ private HeavyType myheavy; private Flyweight1(){ myheavy = new HeavyType(); public Flyweight1 getnewfly(){ Flyweight1 newfly = new Flyweight1(); newfly.myheavy = this.myheavy; return newfly; public class Flyweight2 implements Cloneable{ private HeavyType myheavy; private Flyweight2(){ myheavy = new HeavyType(); public Flyweight2 clone(){ Flyweight2 newfly = super.clone(); newfly.myheavy = this.myheavy; return newfly; public Flyweight2 getnewfly(){ return this.clone(); public class Flyweight3{ private static final HeavyType myheavy = new HeavyType(); public Flyweight3(){ 13

3. Medan många designmönster har som främsta ändamål att göra det lättare för programmeraren, genom att t.ex underlätta kodåteranvändning eller göra det lättare att förstå hur olika klasser ska användas, syftar andra mönster främst till att förbättra det färdiga programmets egenskaper, så att det kan köras eektivare och med färre exekveringsfel. För varje designmönster i den följande listan, ange om det främst syftar till att underlätta vid programmering (P) eller till att förbättra körningen (K). 5 korrekta svar ger 4p, 4 korrekta svar ger 2p, 3 korrekta svar ger 1p, 2 eller färre korrekta svar ger 0 p. (4 p) a) Facade P b) Lock K c) Builder K d) Observer P e) Flyweight K 4. För varje påstående om nyckelord i Java, ange om det är sant eller falskt. 5 korrekta svar ger 4p, 4 korrekta svar ger 2p, 3 korrekta svar ger 1p, 2 eller färre korrekta svar ger 0 p (4 p) a) Om ett fält deklareras med nyckelordet static så kan dess innehåll inte ändras efter initiering. Falskt b) En metod som deklareras som protected kan bara anropas från klassen självt. Falskt c) Om en klass deklareras med nyckelordet final så kan den inte ärvas av någon annan klass. Sant d) Fält kan deklareras med högst två nyckelord per fält. Falskt e) Metoder som deklareras med nyckelordet synchronized får inte samtidigt deklareras som private. Falskt 14

5. För varje påstående om klasser och instanser i Java, ange om det är sant eller falskt. 5 korrekta svar ger 4p, 4 korrekta svar ger 2p, 3 korrekta svar ger 1p, 2 eller färre korrekta svar ger 0 p (4 p) a) Det går att skapa klasser som inte går att instansiera. Sant b) Klassmetoder kan anropas utan att man explicit skapat någon instans av klassen. Sant c) En instansmetod får bara använda instansvariabler. Falskt d) En klassmetod får bara använda klassvariabler. Sant e) Man instansierar en klass genom att ärva från den. Falskt 15

6. Här följer 5 st kodlistningar i Java 1. För varje kodlistning, ange om den kommer att fungera, ge kompileringsfel eller ge fel när man kör den. Kod anses fungera omm den ger en deterministisk utskrift av ett tal vid körning. Anta att varje klass X nns i en l som heter 'X.java', och kompileras med kommandot 'javac X.java', och körs med 'java X'. Notera att metoden sleep() kan kasta en InterruptedException. (5 p) a) kompileringsfel public class ClassA{ public int a = 1; public static void main(string[] args){ System.out.println(a); b) fungerar public class ClassB{ private int a = 1; static ClassB myb = new ClassB(); public static void main(string[] args){ System.out.println(myB.a); 1 För tydlighets skull anses här Java 7, som nns i skolans datasalar 16

c) körfel ickedeterministisk utskrift public class ClassC extends Thread{ private static int a = 1; public static void main(string[] args){ for(int i = 0; i < 1000; i++){ ClassC myc = new ClassC(); myc.start(); printresult(); public void run(){ try { sleep(500); catch(interruptedexception e){ incrementa(); private synchronized void incrementa(){ a++; private static synchronized void printresult(){ try { sleep(500); catch(interruptedexception e){ System.out.println(a); d) fungerar ej private class ClassD{ static int a = 1; 17

private static void main(string[] args){ System.out.println(a); e) fungerar public class ClassE implements Runnable{ private int a = 1; private static ClassE myclasse = new ClassE(); public static void main(string[] args){ for(int i = 0; i< 1000; i++){ Thread mythread = new Thread(new ClassE()); mythread.start(); System.out.println(myClassE.a); public void run(){ try { Thread.sleep(500); catch(interruptedexception e){ a++; 18

Del II - fördjupningsfrågor Följande uppgifter besvaras på separat papper. 7. Vad menas med lazy initialisation? Ge exempel på hur det kan användas i två olika designmönster. (3 p) Lazy initialisation betyder att man inte initialiserar ett objekt förräns det explicit behövs. I Singleton kan detta betyda att man skapar det enda objektet första gången som det efterfrågas med getinstance(). I Prototype kan man vänta med att skapa prototypobjektet tills en kopia efterfrågas första gången, se fråga 2.a, Prototype1. Man kan också säga att Virtual Proxy är ett annat sätt att göra lazy initialisation. Innan mer avancerad funktionalitet behövs, skapar man ett lättviktigt ersättningsobjekt, och skapar det tunga riktiga objektet först när metodanrop som verkligen kräver dess existens körs. 8. Förklara designmönstret Iterator. Vad är dess syfte, hur implementerar man det, och vilka fördelar har det (eller nackdelar, om dessa är mer relevanta)? (2 p) Iterator är ett sätt att standardisera seriell åtkomst av objekt i en samling (Collection). Man har en metod som kan returnera ett Iterator-objekt. Detta objekt har sedan metoder för att se om det fortfarande nns er objekt kvar i samlingen, och för att returnera nästa objekt i samlingen, tills alla objekt har returnerats. Syftet med Iterator är att klientkod ska kunna skrivas oberoende av hur samlingen har implementerats, utan man ska ha ett standardiserat sätt att komma åt element i den. Då får man lösare koppling, och kan sedan lätt byta ut t.ex. en länkad lista mot en vektorlista eller ett sorterat träd, om man så skulle vilja. 9. Du har just fått ett spännande och utvecklande sommarjobb på Centrum för Autonoma System (CAS). CAS är ett forskningscenter på KTH som också ger kurser, bl. a i robotprogrammering. Din arbetsuppgift är att skapa en grundstruktur i Java som studenterna kan använda för att programmera robotar i en sådan kurs. Robotarna har två motordrivna hjul som de ska balansera på, accelerometrar, sonar och andra enkla sensorer. Datorn som styr varje robot är jämförbar med en modern laptop. Den kod som nns på robotarna i dagsläget består av ett antal programmoduler (troligtvis skrivna i C, men källkod saknas) som körs i bakgrunden och som kan kommunicera över UDP-sockets. Varje modul styr en bit hårdvara, t.ex en motor, eller en sensor. Modulerna lyssnar efter anslutningar på en egen port, och kan efter anslutning skicka eller ta emot enkla XML-meddelanden. Med dessa meddelanden kan man t. ex stänga av eller sätta på sensorer, be dem att skicka sitt senaste mätvärde, eller be en hjulmotor att rotera med en viss hastighet. Modulerna kan typiskt klara 19

av kommunikationshastigheter upp mot ett par tusen meddelanden i sekunden, vilket är tillräckligt för att köra avancerade reglersystem. Kursdeltagarna ska skriva enklare kod får att få robotarna att balansera, åka runt i labyrinter, och lösa olika enklare uppgifter. För att debugga sin kod måste de kunna logga all information som genereras i olika delar av programmet på ett bra sätt. De förväntar sig ett antal lättanvända Java-klasser som de kan använda till att skriva den kod som gör allt de vill kunna göra med robotarna, och ska inte behöva lägga tid på sånt som inte direkt har med koden för robotstyrning att göra. Beskriv hur du bygger upp Javastrukturen som studenterna ska programmera mot. Förklara vilka designmönster som används, i grova drag hur de implementeras (vilken information nns var, hur kommunicerar programmets olika delar med varandra, hur styrs olika programöden, osv). Motivera varför din lösning är bra! Du får använda UML eller (pseudo-)kod i ditt svar om du tycker att det förenklar presentationen, men det är inte ett krav. (8 p) Denna uppgift har förstås många möjliga lösningar. Ett exempel kan innehålla följande: Man paketerar alla anrop mot de olika hårdvarumodulerna i en Facade. Facadklassen upprättar en uppkoppling mot alla modulerna, och skriver och läser XMLmeddelanden. Den presenterar publika metoder som t.ex setrightmotorspeed(), getaccelerometerreading() som användaren kan använda i sin kod. Därmed blir det mycket lättare för programmeraren, som bara behöver veta vilken fart hen ska sätta på en motor, inte hur man gör det.. Själva läsningen från de moduler som skickar sensordata görs av en separat tråd per modul, denna tråd uppdaterar ett model-objekt, som alltså alltid innehåller de mest aktuella sensordata. Vi använder oss av mönstret Observer, så att de delar av programmet som är beroende av sensordata uppdateras så fort det nns nya data att hämta. Metoderna i modellen bör trådskyddas med ett Lock, så att vi inte korumperar data, och riskerar att ofullständiga/felaktiga värden används i reglerlooparna. Ett exempel på en programdel som kan lyssna på modellen, är en loggserver. I denna kan vi säga till vilka av alla data som vi vill skriva till logglen, och dessa skrivs då till disk. Även loggservern är en sorts Facade, där vi bara anropar metoder i stil med startlog(), stoplog(), och slipper fundera på hur det fungerar. Man kan då tänka sig en del inställningsmetoder som kan användas om man inte gillar de förinställda värdena, som t.ex. setlogfilename(string name), setlogfrequency(int f), mm. För att inte riskera att diskaccessen tar för mycket tid och sinkar ner sensoravläsningen, bör själva skrivandet till disk göras i en separat tråd, och inte direkt i lyssnarmetoden. För att ytterliggare hjälpa studenterna kan vi skapa skelett till reglerloopar. Vi kan låta reglerloopen vara en abstrakt klass som implementerar Runnable, och därmed kan köras i en egen tråd. Denna har redan kod som gör att vi kan ställa in frekvensen som dess huvudloop körs i, och kod som hanterar sensordata och motorkommandon, 20

och det enda som programmeraren behöver tilhandahålla är en metod som genererar motorsignaler givet sensorvärden. I facade-klassen nns det sedan en metod för att ladda upp en regulator, och en metod för att starta och stoppa den. 10. Ange tre olika designmönster som ger lös koppling, och förklara hur för vart och ett av dem. (6 p) Observer, ger lös koppling genom att skapa en möjlighet att låta en klass anropa metoder ien en eller era andra klasser utan att känna till dessa. Ett exempel är JButton-klassen i Swing, som kan anropa actionperformed() i alla klasser som lagts till dess lyssnarlista. Iterator, ger lös koppling genom att ge klientkoden en möjlighet att gå igenom alla element i en samling utan att behöva känna till hur samlingen är uppbyggd. Därmed kan man lätt byta typ av datalagring utan att resten av programmet påverkas alls. Factory, ger lös koppling genom att klientkoden inte behöver veta explicit vilken typ ett viss objekt ska ha. Man anropar bara en fabriksmetod, som i sin tur returnerar något objekt som uppfyller rätt gränssnitt eller basklass. Härmed är det t.ex möjligt att senare ändra på fabriksmetoden så att den returnerar helt andra klasser, utan att resten av programmet behöver påverkas. MVC, ger lös koppling genom att separera olika funktioner i programmet. Visualiseringen behöver t.ex inte känna till hur modellen är implementerad, och tvärtom. Därmed kan man byta ut eller ändra friskt i vilken som helst av dessa utan att den andra påverkas. 21

11. En av dina vänner har skrivit ett program för interaktiva bakgrundsbilder på smartphones. En användare A kan installera en bakgrundsbild på sin smartphone, som sedan en annan användare B kan ändra på, på sin telefon. T.ex kan bilden föreställa ett cafe, där B kan andra på inredningen, besökarna, belysning, vädret utanför, mm. A ser då alltid den senaste versionen av bilden som bakgrund på sin telefon. Innan din vän släpper denna app till försäljning vill hen ha din hjälp att lösa ett smärre problem. Det är nämligen så att det går väldigt långsamt att uppdatera bilden över nätverket. För A spelar det ingen roll, eftersom hen troligtvis inte sitter och tittar på bakgrundsbilden hela tiden, utan kan stå ut med att den uppdateras långsamt eller sporadiskt, men för B blir det direkt plågsamt att varje liten förändring eller justering tar en eller era sekunder att genomföra, för att inte tala om att det inte går alls om A tillfälligt saknar nätverkstäckning. Beskriv konkret hur din vän lämpligast löser sina problem, och namnge korrekt alla designmönster som används i lösningen. (3 p) Om programmet är uppbyggt enligt MVC, så ligger alltså Model på A:s telefon, och Control körs på B:s telefon, medan båda telefonerna har varsin View. Din vän måste göra så att programmet blir mindre beroende av kommunikationen mellan olika enheter. Ett sätt att göra detta på är att låta programmet i användare B:s telefon arbeta mot en Remote Proxy, så att B:s klient får en lokal Model. Eftersom proxy:n ligger lokalt på B:s telefon, borde responsen gå att göra mycket snabb. Proxy:n kommunicerar sedan med A:s telefon i en separat tråd, och uppdaterar modellen i A:s klient i mån av nätverkstillgänglighet. 12. Du behöver integrera ett tredjepartsbibliotek för grak i en bentlig javaapplikation som ditt företag utvecklar. Tidigare har ni använt ett egetutvecklat bibliotek, men för att få bättre prestanda vill ni byta till det nya tredjepartsbiblioteket. Ditt företag hyrde in en dyr konsult som skissade upp nedanstående lösning i UML. Vilket mönster är det som föreslås? Hur implementerar man konsultens förslag? Kommer det att fungera som tänkt, eller behövs det några ändringar? Förklara! (3 p) 22

OldGraphicalLibraryClass Attributes +Operation() +functioncall() NewGraphicalLibraryClass Attributes +Operation() +specialfunctioncall() void functioncall(){ specialfunctioncall(); NewClass Attributes +Operation() +functioncall() Troligtvis har hen tänkts sig att göra en Adapter. Det är dock problematiskt att lösningen föreslår multipelt arv. Ett bättre sätt att lösa det på är att låta NewClass ärva endast från det gamla biblioteket, så att den bentliga koden kan använda det nya biblioteket utan större ändringar, och låta NewClass känna till det nya biblioteket. I NewClass överskuggar man då metoderna i det gamla biblioteket, och låter de nya implementationerna anropa relevanta metoder i det nya. Se nedanstående förbättrade version. OldGraphicalLibraryClass Attributes +Operation() +functioncall() NewGraphicalLibraryClass Attributes +Operation() +specialfunctioncall() void functioncall(){ myvar.specialfunctioncall(); NewClass Attributes myvar:newgraphicallibraryclass +Operation() +functioncall() 23