Svar och lösningar till tentamen 130522

1) A: Facade    B: Template Method     C: Proxy    D: Iterator     E: Strategy
 
2) CSC
3a) Mönstret är Composite.

3b) super(s) betyder att superklassens (som i det här fallet är Currer) konstruktor anropas.

4a) A: server     B: port     C: tråd     D: socket     E: ström

5a) Testning sker "kontinuerligt", dvs man testar koden ofta, varje dag.
5b) För varje ny programdel, skriv alla tester (testfall) innan kod skrivs. Man använder ett ramverk som möjliggör automatisk testning. Testen av den nya programdelen läggs till i testen av hela systemet.

6) Man ändrar i programkoden (förbättrar den förstås) utan att den yttre funktionen ändras.

7) En prototyp är ett program där all funktionalitet "syns" men inte fungerar fullt ut. I Rapid Prototyping vill man snabbt visa en icke-teknisk kund vad som går att göra. Från prototypen väljs en funktion (funktionalitet i programmet, ej kodmässig funktion) i taget och utvecklas i en interativ process.

8a) A: FALSKT     B: SANT     C: SANT     D: FALSKT

8b) En fabriksmetod är en metod som returnerar ett objekt, antingen ett nyskapat eller ett som redan fanns. Fabriksmetoder används när man inte vill att användaren ska få bestämma vilka objekt som skapas med new och/eller eller vilka subtyper objekten har. Klassen där fabriksmetoden finns har denna kontroll. Fabriksmetoder finns t.ex. i Singleton-klasser och motsvarande med fler än ett enda objekt och i flera klasser i API:n, t.ex. de som har med lokala egenskaper som språk och tid att göra. Ytterligare ett exempel på när fabriksmetoder används är när man vill ha flera konstruktorer med samma signatur.

9) I mönstret Observer finns ett subjekt (eller Observable) som andra objekt är beroende av. När subjektet uppdateras så ska andra objekt också uppdateras. De beroende objekten (Observers) registreras hos subjektet, som känner till sina Observers. När en ändring sker i subjektet underrättas alla Observers. Exempel 1: Ett grafiskt objekt som andra objekt lyssnar på är subjekt, de lyssnande objekten är Observers och underrättas när en händelse sker. Exempel 2: En modell kan ha flera vyer samtidigt. När modellen uppdateras ska alla vyerna också uppdateras. Modellen är subjekt och vyerna Observers och underrättas när en händelse sker.

10a) Fel 1: Konstruktorn måste vara privat. Som klassen är skriven nu är det fritt fram att skapa hur många objekt man vill. När konstruktorn gjorts private kan objekt endast skapas inifrån klassen och klassen har kontroll över skapandet.

Fel 2: Metoden som returnerar Singleton-objektet måste vara static, dvs en klassmetod. Som det står nu är getTreasure() en instansmetod, dvs man måste ha tillgång till ett Treausure–objekt för att kunna anropa metoden som ska ge tillgång till det enda Treausure–objektet.

10b) En klass enligt mönstret Singleton görs bäst i Java som en enum–klass. Med enum anges genom uppräkning när klassen deklareras exakt vilka objekt (t.ex. endast ett) man vill ha av klassen. Det går inte att att skapa fler objekt eller ärva från klassen men den kan ha attribut och metoder som en vanlig klass.

11) Rätt svar är alternativ C.

12) Dynamisk bindning: I en superklass A, definieras en abstrakt metod m(). Definiera subklasser till A, definiera om metoden m() i varje subklass. Via referenser av typ A kan metoden m() anropas även för objekt av alla subklasser. Det är då subklassens typ som bestämmer vilken metod m() som exekveras, alla subklasserna har ju olika varianter.
När anropet a.m(); kompileras går det inte att avgöra vilken metod som ska exekveras, det avgörs under programmets körning, dynamiskt.

Polymorfism: Ojbekt av alla subklasser till A "är A" och alla har metoden m(). Men objekten är olika och beter sig olika (subklasserna har olika implementationer av m()). A är mångformig, polymorf.

 

13a) CSC

13b)

import java.util.*;
abstract class Decorator implements IQueue<String> {

    IQueue<String> myq;

    Decorator(IQueue<String> q) {
        myq = q;
    }

    public boolean isEmpty() {
        return myq.isEmpty();
    }

    public void put(String s) {
        myq.put(s);
    }

    public String get() {
        return myq.get();
    }
}

13c)

import java.util.*;
class SeqDeco extends Decorator {

    SeqDeco(IQueue<String> q) {
        super(q);
    }

    public void putSequence(List<String> list) {
        for (String s:list)
            super.put(s);
    }

    public List<String> getSequence(int n) {
	List<String> reslist = new LinkedList<String>();
	for (int i=0; i<n; i++) {
	    if (this.isEmpty())
	       break;
	    reslist.add(this.get());
	}
	return reslist;
    }
}

13d)

class TimeDeco extends Decorator {

    long timeForLastEvent = -1;

    TimeDeco(IQueue<String> q) {
        super(q);
    }

    public void put(String s) {
        super.put(s);
        timeupdate();
    }

    public String get() {
        timeupdate();
        return super.get();
    }

    void timeupdate() {
        long newtime = System.currentTimeMillis();
        if (timeForLastEvent > 0) {
	    System.out.println(newtime-timeForLastEvent);
	}
	else
	    System.out.println(0);
        timeForLastEvent = newtime;
    }

    int interval() { // in milliseconds
        if (timeForLastEvent < 0)
            return -1;
        return (int)(System.currentTimeMillis() - timeForLastEvent);
    }
}