Versions Compared

Key

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

...

I et spill som dette vil hovedprogrammet hovedsaklig bestå av en løkke som utvider sekvensen med tall og deretter ber brukeren om å gjenta hele sekvensen. For hvert tall brukeren gir inn, må det sjekkes om tallet stemmer med neste tall i sekvensen. Vi kan tenke oss dialogen som følger (system-output i kursiv og bruker-input i fet skrift):

Element nr. 1 er 3
Gjenta element nr. 1 av 1
3
Element nr. 2 er 4
Gjenta element nr. 1 av 2
3
Gjenta element nr. 2 av 2
4
Element nr. 3 er 7
Gjenta element nr. 1 av 3
3
Gjenta element nr. 2 av 3
4
Gjenta element nr. 3 av 3
5
Feil! Den lengste sekvensen du klarte var på 2 elementer.
Vil du prøve på nytt (ja/nei)?
ja
Element nr. 1 er 8
...

Det som ikke kommer frem av dialogen er hvordan MemoryProgram-objektet samspiller med Memory-objektet, dvs. hvilke kall MemoryProgram utfører på Memory og hvilke verdier som flyter frem (argumentverdier) og tilbake (returverdier). Dette er den vanskeligste delen av programmering: å bestemme når og hvordan objektene samhandler, altså å fordele oppgaver mellom objektene og konkretisere oppgavene som metoder med argumenter og returverdier. En måte å komme litt videre på er å legge inn kommentarer i dialogen over, som illustrerer hvordan MemoryProgram bruker Memory underveis. Merk at dette ikke er så ulikt et sekvensdiagram, men det er litt tidlig å bruke en så formell notasjon, siden vi ennå ikke har satt navn på metoder og gitt dem argument- og returtyper.

// Memory genererer nytt tall i sekvensen => 3
Element nr. 1 er 3
Gjenta element nr. 1 av 1
3
// Memory sjekker om 3 er riktig neste tall => ok og ferdig
// Memory genererer nytt tall i sekvensen => 4
Element nr. 2 er 4
Gjenta element nr. 1 av 2
3
// Memory sjekker om 3 er riktig neste tall => ok, men ikke ferdig
Gjenta element nr. 2 av 2
4
// Memory sjekker om 4 er riktig neste tall => ok og ferdig
// Memory genererer nytt tall i sekvensen => 7
...

Vi ser at Memory hovedsaklig tilbyr to tjenester: å generere nye tall i sekvensen og å ta imot et nytt tall (fra brukeren) og sjekke det mot fasiten. Det er dessuten underforstått at Memory må huske både tall-sekvensen og hvor langt brukeren har kommet i å gjenta den. Vi kan nå oppdatere diagrammet vårt med denne innsikten:

...

Vi har valgt å representere tallsekvensen(expectedItems) som en liste (List) av heltallsobjekter (Integer). Vi bruker en liste og ikke en Java-tabell (int[]), siden sekvensen skal utvides, og vi bruker heltallsobjekter, siden lister bare kan spesialiseres til objekt-typer og ikke verdi-typer som int. Vi har latt metoden nextItem legge det nye tallet til sekvensen og returnere det tallet, siden vi ser fra dialogen med brukeren at det skal vises frem og at MemoryProgram derfor trenger verdien. Målet for hvor langt brukeren har kommet er en indeks (int acceptedCount) inn i tallsekvensen. Returverdien fra metoden som sjekker et nytt tall fra brukeren (acceptItem(int)), må kunne skille mellom tre tilfeller: 1) tallet er feil, 2) tallet er riktig og sekvensen er komplett, og 3) tallet er riktig, men sekvensen er ikke ferdig. Derfor bruker vi et Boolean-objekt, og lar Boolean.FALSE, Boolean.TRUE og null representere de tre tilfellene. Her er et oppdatert diagram over implementasjonen så langt:

PlantUML Macro
class MemoryProgram {
}
class Memory {
	-List<Integer> expectedItems
	-int acceptedCount
	+int nextItem()
	+Boolean acceptItem(int)
}

MemoryProgram -right-> Memory: memory