Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3
Excerpt

På denne siden vises klasse- og objekttilstandsdiagrammer for løsningen, som hjelp til å skrive selve koden.

PlantUML Macro
interface StringGrid {
	getRowCount()
	getColumnCount()
	getElement(int row, int column)
}

class StringGridImpl {
}

StringGrid <|.. StringGridImpl

interface "Iterator<String>" as iterator {
	boolean hasNext()
	String next()
}

class StringGridIterator {
	int row
	int column
}

iterator <|.. StringGridIterator
StringGridIterator -left-> "1" StringGrid: grid

Dette klassediagrammet illustrerer forholdet mellom grensesnittetene StringGrid og StringGridIterator og klassen StringGridImpl.

StringGridImpl inneholder begge 0, 1 eller flere String-objekter. StringGrid deklarerer metoder som StringGridImpl må implementere, og som gir tilgang til String-objektene den inneholder.

StringGridIterator implementerer Iterator<String> og må derfor implementere hasNext() og next(). Den har en assosiasjon til en StringGrid og hasNext()- og next()-metodene brukes for å iterere over String-objektene som det assosierte StringGrid-objektet inneholder.

Internt bruker StringGridIterator-objekter row- og column-attributtene for å holde rede på hvilket String-objekt som neste kall til next() skal returnere. hasNext() må bruke row og column og StringGrid-objektet sine getRowCount()- og getColumnCount()-metoder for å si om iterasjonen er ferdig, og next() må bruke row og column og StringGrid-objektet sin getElement(int, int)-metode for å få tak i riktig String-objekt. Hvert kall til next() må dessuten øke column og evt. row (og nullstille column) slik at iterasjonen går forover og til neste linje.

PlantUML Macro
object "StringGridImpl" as stringGrid {
	"en" "to" "tre"
	"fire" "fem" "seks"
}

object "StringGridIterator" as iterator00 {
	row = 0
	column = 0
}
iterator00 --> stringGrid: stringGrid


object "StringGridIterator" as iterator01 {
	row = 0
	column = 1
}
iterator01 --> stringGrid: stringGrid

iterator00 ..> iterator00: hasNext() => true
iterator00 ..> iterator01: next() => en


object "StringGridIterator" as iterator02 {
	row = 0
	column = 2
}
iterator02 --> stringGrid: stringGrid

iterator01 ..> iterator01: hasNext() => true
iterator01 ..> iterator02: next() => to


object "StringGridIterator" as iterator10 {
	row = 1
	column = 0
}
iterator10 --> stringGrid: stringGrid

iterator02 ..> iterator02: hasNext() => true
iterator02 ..> iterator10: next() => tre


object "StringGridIterator" as iterator11 {
	row = 1
	column = 1
}
iterator11 --> stringGrid: stringGrid

iterator10 ..> iterator10: hasNext() => true
iterator10 ..> iterator11: next() => fire

object "StringGridIterator" as iterator12 {
	row = 1
	column = 2
}
iterator12 --> stringGrid: stringGrid

iterator11 ..> iterator11: hasNext() => true
iterator11 ..> iterator12: next() => fem

object "StringGridIterator" as iterator20 {
	row = 2
	column = 0
}
iterator20 --> stringGrid: stringGrid

iterator12 ..> iterator12: hasNext() => true
iterator12 ..> iterator20: next() => seks


iterator20 ..> iterator20: hasNext() => false



Dette objekttilstandsdiagrammet viser en objektstruktur med et StringGridImpl-objekt, som inneholder to rader og tre kolonner med seks String-objekter, og hvordan en (og samme) StringGridIterator utvikler seg over tid gjennom en iterasjon over String-objektene som StringGridImpl-objektet inneholder, altså "en", "to", "tre", "fire", "fem" og "seks". Vi ser at StringGridIterator-objektet hele tiden er koblet til samme StringGridImpl-objekt og at det eneste som endrer seg er row, column-attributtene, som går gjennom alle par fra 0, 0 til og med 1, 2 og stopper på 2, 0 (siden 2 >= antall rader). Her er det ikke tatt hensyn til rowMajor-logikken, som oppgaven etterspør, men det endrer ikke så mye, kun hvilken av column og row som økes først.

Merk at i dette eksemplet er StringGridIterator-objektet koblet til et StringGridImpl-objekt, men at det godt kunne vært en hvilken som helst instans av en klasse som implementerer StringGrid.