Svar och lösningar till tentamen 110524

1) A: Proxy B: Facade C: Singleton D: Observer E: Iterator

2) CSC

3) Template Method

4) Ramverk = Ett bibliotek/paket med många klasser som kan användas tillsammans för någon kategori av tillämpningar. Exempel på Java-ramverk är awt och swing för grafik och Collection för objektsamlingar. Komponent = Grafiskt objekt som kan visas i ett fönster, en byggsten som kan användas i olika sammanhang och som har en egen funktion. Exempel på komponenter finns i grafikbiblioteken, t.ex. knappar och textrutor.

5) Se föreläsning 12!

6a: For–satsen är helt onödig och gör bara programavsnittet svårt att förstå. Metoderna a, b, c och d exekveras alltid i följande sekvens.

a(); b(); c(); d(); d();
6b: Svar: B

7a: Svar: B    7b: Svar: C

8 Objekten i objektsamlingen a måste vara av en klass (typ) som implements Comparable. Comparable är ett interface i Java– biblioteket som innehåller en enda metod, compareTo(). Metoden jämför två objekt av klassen och talar om vilket vilket som kommer först i en sorteringsordning eller om de har samma värde.

9a: sin och cos är static    9b: en lyssnarmetod är inte static.

9c: fintTal är en instansvariabel. Varje objekt av klassen Fel har sin egen fintTal och fintTal existerar bara som en del av objekt av klassen Fel. Om metoden main ska kunna använda fintTal på det angivna sättet så måste fintTal vara static. Nu kommer koden att ge ett kompileringsfelmeddelande:

Fel.java:5: non-static variable fintTal cannot be referenced from a static context
System.out.println("Fina talet = " + fintTal);
                                     ^
1 error
Naturligtvis behöver inte felmeddelandet återges i svaret!

10

CSC

Lös koppling innebär att en klass inte beror direkt av en annan klass utan att den första klassen beror av ett interface (eller abstrakt klass) som den andra klassen implementerar (ärver från). Interfacet innehåller exakt de metoder som den första klassen behöver anropa. Detta är de enda publika metoderna i den implementerande klassen. Enligt uppgiftslydelsen så använder Speltestare fyra metoder ur Damspelsmodell. Detta symboliseras i UML-diagrammet av två publika metoder. Övriga metoder i Damspelsmodell är privata.

Det övre diagrammet överensstämmer med den givna kodsnutten. Det undre diagrammet visar lös koppling mellan Speltestare2 och Damspelsmodell2.

11a

    String path() {
        String tmp = name;
        Directory d = parent;
        while (d != null) {
             tmp = d.name + "/" + tmp;
             d = d.parent;
        }
        return tmp;
    }
11b printXML() för följande Directory-klass ger en utskrift utan indentering (indrag) som speglar träddjupet.
class Directory extends FileElement {
    ArrayList 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) {
        theFiles.remove(fe);
    }

    void printXML() {
        System.out.println("<DIRECTORY>"+name);
        for (FileElement fe : theFiles)
            fe.printXML();
        System.out.println("</DIRECTORY>");
    }
}
Om man vill ha indrag vid utskriften så kan man anvauml;nda en String-parameter till printXML(). Parametern innhåller blanktecken som skrivs ut före raden om filen eller katalogen. Lite snyggare auml;r det att låta printXML() vara parameterlös och anropa en hjauml;lpmetod med String-parametern.
    void printXML(String off) {
        System.out.println(off + "<DIRECTORY>"+name);
        for (FileElement fe : theFiles)
            fe.printXML(off + "  ");
        System.out.println(off + "</DIRECTORY>");
    }
printXML() i FileElement och i File måste också ges samma parameter.

Strukturen på uppgift 11b liknar mycket labb 4 där man ska summera över en Composite-struktur. Här är det en slags summering där alla fil/katalog-namn som uppfyller ett sökvillkor läggs ihop i en lista.

I klassen FileElement: (Annat alternativ är att lägga motsvarande metod i File och en abstrakt eller tom metod i FileElement)

    ArrayList<String> findFiles(String t) {
        ArrayList<String>thelist = new ArrayList<String>();
	if (t.equals(name))
	    thelist.add(path());
	return thelist;
    }
I klassen Directory:
    ArrayList<String> findFiles(String target) {
        ArrayList<String> res = super.findFiles(target);
        for (FileElement fe : theFiles) {
            ArrayList<String> l = fe.findFiles(target);
	    res.addAll(l);
	}
	return res;
    }

Litet fel i tentan:
Upptäckte ett fel i exemplen till uppgift 11. Det står att sökning efter "elevp" på katalogen "grupdat" ska ge listan [grupdat/knepigt/elevp], det borde varit [hem/kurser/grupdat/knepigt/elevp]. Att konstruera vägar enligt första alternativet är ett lite svårare problem och det går inte att använda metoden path från 11a rakt av vilket egentligen var avsikten. Ingen upptäckte felet under tentan (inte jag själv heller). Den som ev. har löst den svårare uppgiften kommer att få extra poäng!

11c. Låt findFiles ha en parameter som är ett objekt som innehåller en jämförelsemetod. Objektet implementerar ett specifikt gränssnitt, t.ex.

interface Searchcondition {
    boolean satisfiescondition(String t);
}
Metoden satisfiescondition returnerar true om t på uppfyller något sökkriterium, t.ex. börjar på "H". Detta villkor (t.startswith("H")) är då hårdkodat i den implementerande klassen. Naturligtvis kan man tänka sig att klara av alla "börjar med"-situationer genom att låta metoden ha två parametrar.

Vid sökning så anropas findFiles antingen med ett objekt av Searchcondition som man har skapat i förväg eller med ett objekt som skapas direkt vid anropet:

    findFiles(new SearchCondition(){
        public boolean satisfiescondition(String targ){
            return targ.startsWith("H");
        }
      }));
Metoden findFiles måste ändras så att den tar ett objekt av SearchCondition som parameter istället för String. Jämförelsen av fil/katalog-namnet i findFiles byts ut mot anrop av metoden satisfiescondition.

// I FileElement:
    ArrayList<String> findFiles(Searchcondition s) {
        ArrayList<String>thelist = new ArrayList<String>();
        if (s.satisfiescondition(this.name))
            thelist.add(path());
	return thelist;
    }

// I Directory:
    ArrayList<String> findFiles(Searchcondition s) {
        ArrayList<String> res = super.findFiles(s);
        for (FileElement fe : theFiles) {
	    ArrayList<String> l = fe.findFiles(s);
	    res.addAll(l);
	}
	return res;
    }

Mönsternamn: Strategy. OBS! Ett så här långt och detaljerat svar behövs inte för att få 3p.