Svar och lösningar till tentamen i Programutvecklingsteknik 100527
-
- Mediator. Interfacet Moderator i exemplet motsvarar interfacet
(eller abstrakta klassen) Mediator i en typisk mönsterbeskrivning.
Det som brukar kallas Colleague eller AbstractColleague i mönstret är
Member i uppgiften.
- Template Method är C, Observer är D och Proxy är A.
(De som blir över beskriver Facade (B) och Composite (E)).
- Mock Object = "fuskobjekt". Ett objekt som används istället för det
riktiga medan det riktiga utvecklas. Båda implementerar samma interface
och har alltså samma metoder. UML-diagra och längre förklaring finns
i samanfattningen av föreläsning 7.
- Sammanfattning av XP-reglerna:
- The planning game
- Small releases
- Metaphor
- Simple design
- Refactoring
- Pair programming
- Collective ownership
- Continuous integration
- On-site customer
- Coding standards
- Testing
- 40-hour week
Lite mer om XP samt agila metodiker finns i föreläsning 11.
- a. Rätt svar är alternativ B.
b. Rätt svar är alternativ E.
Typen Object får referera till alla objekt och är roten i
alla klasshierarkiträd.
-
Antag att listan har typen
ArrayList<A> . Då måste
klassen A implementera interfacet Comparable
vilket innebär
att klassen måste innehålla en metod som jämför aktuellt objekt med
ett annat objekt. Metoden har huvudet int compareTo(A other)
och returnerar -1, 0 eller 1 beroende på hur jämförelsen utfaller.
Alla detaljer om metoden krävs inte för att få full poäng på uppgiften.
- Metoden som uppdaterar stegantalet har anropats samtidigt (eller
överlappande) av Birgit och Cecilias trådar. Addition till en variabel
görs i flera steg och om en tråd inte hinner lägga tillbaka sitt
uträknade resultat innan den andra tråden läser av startvärdet
för beräkningen så blir det fel. Lösningen är att markera att metoden
ska vara
synchronized . Då kan tråd nummer två inte anropa
metoden förrän tråd nummer ett är klar.
- Flera olika lösningar ger full poäng på den här uppgiften,
t.ex. kan man definiera en metod som gör det kodavsnitt som alla
alternativen innehåller. Här är ett alternativ utan metod:
int dabs = Math.abs(d);
if (dabs==1 || dabs==2 && goahead) {
if (p!=q) {
int tmp = rad[q]; rad[q] = rad[p]; rad[p] = tmp;
move = true;
}
}
- Rätt svar är B, Refactoring.
del 2
-
a.
class Ruta {
int i, j;
Ruta (int i, int j) {
this.i = i; this.j = j;
}
public String toString() {
return "Ruta " + i + " " + j;
}
}
Full poäng ges naturligtvis också om man gjort instansvariablerna private
och tagit med get- och set-metoder för dem eller gjort andra snygga och
rimliga utvikningar.
b.
Det finns många bra sätt att lösa den här uppgiften. Lösningen som
presenteras här har ganska många instansvariabler, man kan klara sig
med färre. Den beräknar en "riktningsvektor" (di, dj) där både di och dj
har något av värdena -1, 0 och 1. Ingen lista över de rutor som ska
besökas läggs upp utan man iterar direkt över originalbrädet.
class Iterator implements II {
Ruta[][] bradMat;
Ruta sistaRuta;
int sluti, slutj;
int akti, aktj;
int di,dj;
boolean sista = false; // blir true när next()
// anropas för sista rutan
Iterator (Brade b, Ruta r1, Ruta r2) {
bradMat = b.rutor;
akti = r1.i; sluti = r2.i;
di = sign(sluti - akti); // riktning i i-led: -1,0 el. 1
aktj = r1.j; slutj = r2.j;
dj = sign(slutj - aktj); // riktning i j-led: -1,0 el. 1
}
int sign(int d) { // I klassen Math finns
if (d>0) // signum-metoder, men
return 1; // bara med flyttalstyperna
else if (d<0) // double, float som returtyp.
return -1; // Här vill vi ha int som svar.
else
return 0;
}
public Ruta next() {
if (sista) {
return sistaRuta;
}
if (akti==sluti && aktj == slutj){ // sista rutan
sistaRuta = bradMat[akti][aktj];
sista = true;
return sistaRuta;
}
int i = akti; int j = aktj;
akti += di; aktj += dj;
return bradMat[i][j];
}
public boolean hasNext() {
return !sista;
}
}
-
a. Lösningsförslag:
class Glosa {
String engOrd;
ArrayList<String> sveOrd;
... metoder och kanske fler variabler ...
}
class SveEngOrdlista {
HashMap<String,Glosa> listan;
.... metoder ....
}
b.
Det designmönster som ligger närmast till hands är Strategy men
andra besläktade mönster kan också ge poäng, t.ex. State.
UML-skiss:
c. Exempel på XML-lösning:
<Gloslista listid = "1729">
<EngOrd>grade
<SveOrd>betyg</SveOrd>
<SveOrd>klass</SveOrd>
<SveOrd>sluttning</SveOrd>
</EngOrd>
<EngOrd>mark
<SveOrd>betyg</SveOrd>
<SveOrd>poäng</SveOrd>
<SveOrd>märke</SveOrd>
</EngOrd>
</Gloslista>
Lösningen ovan följer inte DTD:n som givits på tentan.
Följande lösning följer DTD:n, förhoppningsvis.
<Gloslista listid = "1729">
<Glosa>
<EngOrd>grade</EngOrd>
<SveOrd>betyg</SveOrd>
<SveOrd>klass</SveOrd>
<SveOrd>sluttning</SveOrd>
</Glosa>
<Glosa>
<EngOrd>mark</EngOrd>
<SveOrd>betyg</SveOrd>
<SveOrd>poäng</SveOrd>
<SveOrd>märke</SveOrd>
</Glosa>
</Gloslista>
|