CSC

 

Svar och lösningar till tentamen i Programutvecklingsteknik 100527

  1. CSC

  2. 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.

  3. Template Method är C, Observer är D och Proxy är A. (De som blir över beskriver Facade (B) och Composite (E)).

  4. 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.

  5. 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.

  6. 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.

  7. 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.

  8. 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.

  9. 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;
        }
    }
    

  10. Rätt svar är B, Refactoring.
    del 2

  11. 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;
        } 
    }
    

  12. 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:

    CSC

    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>
    

Sidoansvarig: <ann "at"nada.kth.se>
Last update: july 9th 2010
Tekniskt stöd: <webmaster@nada.kth.se>