Svar och lösningar till tentamen 120602

1) A: Facade B: Strategy C: Proxy D: Mediator E: Iterator

2) Samma uppgift som förra årets ordinarie tenta (110524) fast fjärilsnamnen är utbytta mot liknande namn:

CSC

3a) I AbstractAnimalAnimator definieras den abstrakta metoden init(). init() anropas, trots att den är abstrakt, i en annan metod (konstruktormetoden) i samma klass. Den abstrakta metoden definieras konkret i en subklass (detta är mönstret Template Method).
I subklassen ButterflyAnimator definieras init() konkret. Varje subklass till AbstractAnimalAnimator måste definiera sin egen init() som gör aktuell initiering i konstruktorn, alltså den initiering som behövs i den aktuella subklassen.

3b) public void move();

4a) I vattenfallsmetoden sker testning i slutet av projektet, i agila metoder sker testning kontinuerligt (åtminstone väldigt ofta) av hela systemet. I vattenfallsmetoden är det svårt att ändra på redan utförda delar. Planering av projektet sker i början och planeringen följs. I agila tekniker är man ständigt beredd på ändrade krav som leder till ändringar i redan färdiga programdelar.

4b) T.ex. parprogrammering, kundrepresentation i projektet, utvecklingen sker i iterationer om 1-2 veckor, alla utvecklare har tillgång till all kod, refactoring (förbättring av koden utan att funktionen ändras) sker ofta. Fler karakteristika finns på föreläsningsanteckningarna.

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

5) Model = data och metoder (algoritmer) som representerar aktuellt problem. Det finns ingen grafik i Model.
View = En grafisk bild av modellen. View har en referens till Model så att aktuella data kan hämtas och rätt ögonblicksbild ritas.
Control = Interaktion med användaren, t.ex. genom knappar, menyer, slidebars ... Modellen uppdateras och View ritas om enligt direktiv som avkodas av Control-delen.

6a) Varje new RationNumber(..., ...) ger ett nytt objekt av RationNumber. Detta sker 11 gånger så rätt svar är B. Varje objekt läggs in i två listor men ingen kopiering sker, samma objekt finns i båda listorna.

6b) Parametern till Collections.sort(...) måste vara en lista med objekt som har typen Comparable eller Comparable<T>. Utvidga RationalNumber så att den implementerar Comparable<RationalNumber>. Då måste metoden public int compareTo(RationalNumber r) definieras. Metoden jämför två objekt av RationalNumber och talar om vilket som ska komma först vid sortering eller om objekten är lika.

class RationalNumber implements Comparable {

    public int compareTo(RationalNumber r) {
       ...
    }

    ....
}

7a) Exmplet visar hur en klassmetod anrops (via klassnamnet). Den createPerson() som definieras i klassen Person är en instansmetod. Instansmetoder anropas via referenser till objekt och existerar bara i samband med objekt (instanser). En fabriksmetod är alltid en klassmetod men här är man av misstag definierat en instansmetod och försöker använda den som klassmetod. Ett felmeddelande i stil med följande kommer att ges

... createPerson cannot be referenced from a static context ...

7b) Markera metoden createPerson med modifieraren static, alltså inled deklarationen med
public static Person createPerson

7c) Gör konstruktorn till Person private. Då kan konstruktorn bara anropas inuti Person.

7d) En abstrakt klass går inte att instantiera. Inled klassdefinitionen med
abstract class Classname

7e) Dynamisk bindning I superklassen 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 köras, det avgörs under programmets körning, dynamiskt.

7f) Klasser som inte ska instansieras används gärna som biblioteksmoduler. I en klass läggs hjälpmetoder som inte ska anropas knutna till några objekt. Typexempel i Javas bibliotek är Math. Där ligger metoder och konstanter, alla markerade static. Åtkomst sker via klassnamet, t.ex. så här: y = Math.sin(Math.E)/Math.cos(Math.sqrt(Math.PI));

 

8a) Metoderna largestFile() och addPrefix():
    File largestFile() {
        return this;
    }

    void addPrefix() {
        name = "F:" + name;
    }
8b)
class Directory extends FileElement {
    ArrayList<FileElement> theFiles;

    Directory (String n) {
        super(n);
        theFiles = new ArrayList<FileElement>();
    }

    public void add(FileElement fe) {
      theFiles.add(fe);
      fe.parent = this;
    }

    public void remove(FileElement fe) {  // Not required in exam!
      fe.parent = null;
      theFiles.remove(fe);
    }

    File largestFile() {
      int max = 0;
      File fm = null, f = null;
      for (FileElement fe : theFiles) {
          f = fe.largestFile();
          if (f != null) {
              int tmp = f.size;
              if (tmp > max) { 
                  max = tmp;
                  fm = f;
              }
          }
      }
      return fm;
    }

    void addPrefix() {
      name = "D:" + name;
      for (FileElement fe : theFiles)
          fe.addPrefix();
    }
}

8c) Flera objekt vill prenumerera på information från en filkatalog. Då är mönstret Observer det rätta. Låt varje filkatalog (Directory) utgöra Subject i en Observer-konstellation. Ett Subject har en lista av prenumeranter som kommer att underrättas när någon ändring sker. Objekten som vill ha information om ändringar är Observers i mönstret. De ska ha metoden update() som anropas automatiskt från SubjectSubject ändras. I update() skrivs den kod som ritar upp (för grafisk bild) och skriver (för icke-grafisk) information om aktuellt kataloginnehåll.