Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Expand
titleDel 2 - <tema> (xx%)

Denne delen handler om hvordan arv kan utnytte at Course og Meal har en del felles.

Code Block
... class MenuItem {
    ...
}
 
// inherits from MenuItem
... class Course ... {
 
    ...
}
 
// inherits from MenuItem
... class Meal ... {
 
    ...
}
 
// updated to use MenuItem
... class Menu ... {
 
    ...
}
 
// updated to use MenuItem
... class Bill ... {
 
    ...
}
Oppgave a)
MenuItem-klassen

Course- og Meal-klassene har en del felles egenskaper, som kan samles i en felles superklasse kalt MenuItem. Skriv koden til MenuItem. 

Expand
titleLF

 

Oppgave b)
Bruk av MenuItem

Introduksjonen av MenuItem-klassen gjør det nødvendig å endre de eksisterende klassene. Skriv ny kode for Course-, Meal-, Menu- og Bill-klassene, slik at de virker med og utnytter mulighetene som MenuItem-superklassen gir. Vurder spesielt om felt og metoder kan forenkles/slås sammen. Flett gjerne inn kommentarer til endringene og valg du gjør i koden. 

Expand
titleLF
 
Oppgave c)
Expand
titleDel 3 - Objektsamhandling

Denne delen handler om samhandling mellom Table-klassen og en ny Kitchen-klasse.

Code Block
public class Table {
 
    ...
 
    /**
     * Sets the Kitchen that should be notified when items are added.
     * Note that this method may be called several times with different Kitchen objects.
     * @param kitchen
     */
    public void setKitchen(Kitchen kitchen) {
        ... what should be done here? ...
    }
 
    ...
}
 
/**
 * Interface for classes that want to know when Courses have been produced by a Kitchen.
 */
public interface KitchenListener {
    public void courseReady(Table table, Course course);
}
 
/**
 * Manages a queue of courses to produce, based on what is requested by Tables.
 */
public class Kitchen {
 
    // for each Table that has requested Courses,
    // there is a Collection of the those that are yet to be made
    private Map<Table, Collection<Course>> courseQueue = new HashMap<Table, Collection<Course>>();
    
    /**
     * Enqueues a Course in the production queue, that is part of the provided Table.
     * @param table
     * @param course
     */
    private void produceCourse(Table table, Course course) {
        Collection<Course> courses = courseQueue.get(table);
        ... what should be done the first time a Table requests a Course? ...
        courses.add(course);
        courseQueue.put(table, courses);
    }
 
    /**
     * Internal methods that must be called when a Course of a Table has been produced.
     * Notifies registered listeners about the event.
     * @param table
     * @param course
     */
    private void courseProduced(Table table, Course course) {
        Collection<Course> courses = courseQueue.get(table);
        courses.remove(course);
        ... what should be done here, to support observers? ...
    }
 
    /**
     * Should be called when a MenuItem is added to a Table,
     * so the corresponding Courses can be produced.
     * @param table
     * @param item
     */
    public void menuItemAdded(Table table, MenuItem item) {
        ... handle cases when item is a Course or a Meal ...
    }
 
    //
    
    ... fields and methods for supporting observers ...
}
Oppgave a) Kobling fra Table til Kitchen

Bestilling av mat henger sammen med laging av mat, og nå skal det innføres en Kitchen-klasse (se utgitt kode), som har en dobbel kobling til Table-klassen. Denne deloppgaven handler om den første koblingen, nemlig at et Table-objekt skal kunne ha en kobling til ett Kitchen-objekt, som skal få beskjed når en ny rett (Course) eller et nytt måltid (Meal) legges til i lista over bestillinger. Tenk på det som en bestilling fra kelneren som betjener bordet til kjøkkenet om hvilke retter som skal lages.

Fullfør Table-klassen med det som trengs for å håndtere en kobling til Kitchen og gi beskjed til Kitchen-objektet om retter og måltider som bestilles.

 

Expand
titleLF
 
Oppgave d)

 

Expand
titleLF

 

Oppgave
e)
b) Kobling fra Kitchen til Table og andre klasser.

Table-objektene representerer bordene, og de må få beskjed når en rett er ferdiglaget av kjøkkenet. Derfor må Kitchen-klassen være kodet for å støtte en slik varsling. For å gjøre koden mer generell, så brukes observert-observatør-teknikken (se utgitt kode). Fullfør Kitchen-klassen, så den kan fungere som en observert og Table-klassen som observatør vha. KitchenListener-grensesnittet. 

Expand
titleLF
 
Oppgave
f
c)
Kitchen sin Course-kø

Kitchen-klassen (se utgitt kode) håndterer en kø av retter, organisert etter hvilket bord (Table) som har bestilt den. Logikken er bare delvis implementert, fullfør koden for metodene produceCourse, courseProduced og menuItemAdded så køen håndteres riktig, ved å fylle inn der det er angitt med ... 

Expand
titleLF
 
Expand
titleDel 3 - <tema> (xx%)4 - Diverse
Code Block
public class Meal {
    ...
    
    /**
     * Finds a Course satisfying the provided Predicate.
     * @param test
     * @return the first Course satisfying the provided Predicate.
     */
    public Course findCourse(Predicate<Course> test) {
        ... what should be done here? ...
    }
}

public interface Predicate<T> {
    /**
     * Evaluates this predicate on the given argument.
     * @param t the input argument
     * @return true if the input argument matches the predicate, otherwise false
     */
    boolean test(T t);
}

public class MealTest extends TestCase {

    private Course c1, c2;
    private Meal meal;

    @Override
    protected void setUp() throws Exception {
        ... what should be done here? ...
    }
    
    /**
     * Tests Meal's support for foreach loop (iteration)
     */
    public void testIteration() {
        ... test code ...
    }
    
    /**
     * Tests Meal's findCourse(Prediate) method
     */
    public void testFindCourse() {
        ... test code ...
    }
}
Oppgave a) Predicate-grensesnittet

Hva kalles et slikt grensesnitt som Predicate (se utgitt kode) og hvorfor?

Oppgave a)

 

Expand
titleLF

 

Oppgave b)
findCourse-metoden

Meal skal utvides med en metode for å finne Course-objekter som tilfredsstiller gitte betingelser. For å gjør koden generell så gis betingelsen inn som argument i form av et Predicate-objekt (se utgitt kode). Fullfør findCourse-metoden (se utgitt kode). 

Expand
titleLF
 
Oppgave c)

 

Expand
titleLF
 
Oppgave d)

 

Expand
titleLF
 
Oppgave e)

 

Expand
titleLF
 
Oppgave f)
Testing av Meal

Den utgitte koden inneholder en JUnit-test for testing av Meal-klassen. To typer funksjonalitet skal testes, 1) metoden(e) for å støtte iterasjon vha. foreach-løkker og 2) findCourse-metoden. Fullfør koden. Hvis du ikke får til å skrive riktig kode for JUnit-rammeverket, så forklar med tekst og kode hvordan du ville gjort det. 

Expand
titleLF
 

...