Indhold:
Analyse: Finde vigtige ord, brugsscenarier, aktivitetsdiagrammer og skærmbilleder
Design: Kollaborationsdiagrammer og klassediagrammer
Eksempel: Skitse til et yatzy-spil
Kapitlet giver idéer til, hvordan en problemstilling kan analyseres, før man går i gang med at programmere.
Forudsætter kapitel Fejl: Henvisningskilde ikke fundet, Fejl: Henvisningskilde ikke fundet.
Når et program udvikles, sker det normalt i fem faser:
Kravene til programmet bliver afdækket.
Analyse – hvad det er for ting og begreber, programmet handler om.
Design – hvordan programmet skal laves.
Programmering.
Afprøvning.
Traditionel systemudvikling bygger vandfaldsmodellen: De fem faser udføres en efter en, sådan at en ny fase først påbegyndes, når den forrige er afsluttet. Hver fase udmøntes i et dokument, som de senere faser skal følge og som kan bruges til dokumentation af systemet.
Dette er i skarp modsætning til den måde, som en selvlært umiddelbart programmerer på. Her blandes faserne sammen i hovedet på programmøren, som skifter mellem dem, mens han programmerer. Resultatet er ofte et program, der bærer præg af ad-hoc-udbygninger og som er svært at overskue og vedligeholde – selv for programmøren selv1.
Den bedste udviklingsmetode findes nok et sted mellem de to ekstremer. Der dukker f.eks. altid nye ting op under programmeringen, som gør, at man må ændre sit design. Omvendt er det svært at programmere uden et gennemtænkt design.
Derfor er det ikke en god ide at bruge alt for lang tid på at lave fine tegninger og diagrammer – en blyantskitse er lige så god. Det er indholdet, der tæller, og ofte laver man om i sit design flere gange, inden programmet er færdigt. Dette gælder især, hvis man er i gang med at lære at programmere.
Nu til dags stræber mange mod en arbejdsform, hvor man på ca. fire uger (en iteration) udfører et "mini-vandfald" hvor alle de fem faser indgår. Det, man derved lærer, bruges så til at forfine kravene, analysen, designet og programmet, i næste iteration. Denne udviklingsform kaldes "Unified Process".
Dette kapitel viser gennem et eksempel (et Yatzy-spil) en grov skitse til objektorienteret analyse og design (forkortet OOAD). Det er tænkt som inspiration til, hvordan man kunne gribe sit eget projekt an ved at følge de samme trin.
Vi skal lave et Yatzy-spil for flere spillere. Der kan være et variabelt antal spillere, hvoraf nogle kan være styret af computeren. Computerspillerne skal have forskellige strategier (dum/tilfældig, grådig, strategisk), der vælges tilfældigt.
Krav skal afdække, kommunikere og huske behovene. Lav en nummereret kravsliste:
K1) Yatzy skal understøtte 2-6 spillere
K2) Yatzy skal tjekke at reglerne er overholdt
K3) Yatzy skal kunne styre nogle af spillerne
K4) Yatzy skal lagre spillene når de er afsluttet
K5) Yatzy skal kunne vise en hiscore-liste
K6) Yatzy skal (kun) være på dansk
Analysen skal beskrive, hvad det er for ting og begreber, programmet handler om. Analysefasens formål er, at afspejle virkeligheden mest muligt.
Det kan være en hjælp først at skrive alle de navneord (i ental) eller ting op, man kan komme i tanke om ved problemet. Ud for hver ting kan man notere eventuelle egenskaber (ofte tillægsord) og handlinger (ofte udsagnsord), knyttet til tingen.
Yatzyspil – antal spillere
Terning – værdi, kaste, holde
Raflebæger – kombination, ryste, holde
Blok – skrive spillernavn på, skrive point på
Spiller – navn, type (computer/menneske)
Computerspiller – strategi (dum/tilfældig, grådig, strategisk)
Menneskespiller
Regel (eller mulighed eller kriterium) – opfyldt, brugt, antal point
Lager – hiscore
Brugsscenarier (eller brugsmønstre, eng.: Use Case) beskriver en samling af aktører og hvilke situationer de deltager i. Man starter helt overordnet og går mere og mere i detaljer omkring hvert scenarie. Herunder to brugsscenarier. Til venstre ses et meget overordnet, der beskriver to spillere og lageret som aktører. Til højre ses brugsscenariet for en tur.
I stedet for diagrammer kan man også
blot beskrive scenariet efter et skema:
Primær aktør |
Brugeren eller systemet, det handler om i denne situation |
Interessenter |
Andre aktører, der har sekundær interesse i denne situation |
Startsituation |
Hvad skal være opfyldt før brugsscenariet forekommer |
Slutsituation |
Resultatet af at brugsscenariet udføres |
Hovedscenarie |
Sekvensen af handlinger, der fører aktøren fra startsituation frem til slutsituationen |
Afvigelser |
Afvigelser og undtagelser fra hovedscenariet |
Åbne spørgsmål |
Problemstillinger som der først tages stilling til på et senere tidspunkt (hvis man anvender en udviklingsmodel som f.eks. Unified Process hvor analysen gentages senere i udviklingsforløbet) |
Her er et eksempel:
Brugsscenariet "SpilEnTur" i Yatzy
Primær aktør |
Brugeren, hvis tur det er |
Interessenter |
Systemet |
Startsituation |
Det er brugerens tur |
Slutsituation |
Bruger har valgt felt i blokken og alle pointtal er opdateret |
Hovedscenarie |
|
Afvigelser |
2a. Alle terninger er holdt: Advarselsvindue dukker op: "Vil du afslutte kastene?" |
Åbne spørgsmål |
- |
Man kan hævde, at Yatzy-spillet er på grænsen til at være for simpelt til at lave brugsscenarier. Her er et mere realistisk eksempel på en scenarium for et kurvetegningsprogram:
Brugsscenariet "TegnGraf" i et kurvetegningsprogram
Primær aktør |
Bruger |
Interessenter |
- |
Startsituation |
Et vindue skal være åbent og en funktion skal være tastet ind |
Slutsituation |
Grafens støttepunkter er beregnet og grafen vises i vinduet |
Hovedscenarie |
|
Afvigelser |
3a: Brugeren afbryder indtastning
3b: Brugeren har indtastet andet end tal i
startværdi eller slutværdi
|
Åbne spørgsmål |
Hvordan tegnes uendelig? F.eks. 1/x ? Skal man kunne se flere grafer samtidig? |
Aktivitetsdiagrammer beskriver den rækkefølge, som adfærdsmønstre og aktiviteter foregår i. Eksempel: Aktiviteten "definere deltagere i spillet":
Herunder ses et diagram for spillets gang, "en tur":
Hvis skærmbilleder er en væsentlig del af ens program, er det en god hjælp at tegne de væsentligste, for at gøre sig klart, hvilke elementer programmet skal indeholde.
Disse kan med fordel designes direkte med et Java-udviklingsværktøj. Herved opnår man en ide om, hvad der er muligt, samtidig med at den genererede kode ofte (men ikke altid!) kan genbruges i programmeringsfasen. Normalt kommer der en klasse for hvert skærmbillede, så man kan også med det samme give dem sigende navne.
Når programmet startes, skal vælges 2-6 spillere, hvoraf nogle kan være computerspillere:
TilfoejSpillervindue
Under spillet skiftes spillerne til at få tur. For menneske-spillerne dukker dette billede op:
Turvindue
Man kan holde på terningerne ved at klikke på afkrydsningsfelterne.
Når spilleren er færdig (efter max 3 kast), skal han/hun vælge, hvilken regel der skal bruges, ved at klikke på den i blok-vinduet:
Blokvindue
Designets formål er at beskrive, hvordan programmet skal implementeres. I denne fase skal man bl.a. identificere de vigtigste klasser i systemet og lede efter ligheder mellem dem med henblik på nedarvning og genbrug.
Et udgangspunkt for, hvordan man designer klasser, er at objekterne i programmet skal svare nogenlunde til de virkelige, oftest fysiske objekter fra problemstillingen:
Navneord (substantiver) i ental bliver ofte til klasser
Klassenavne skal altid være i ental
Udsagnsord (verber) bliver ofte til metoder
Typisk har hver klasse 3-5 ansvarsområder
Det er vigtigt at huske, at dette kun er tommelfingerregler, som man ikke kan tage alt for bogstaveligt. Man bliver ofte nødt til at dreje tankegangen lidt for at få den til at passe i sit eget program.
F.eks. er en blyant eller et andet skriveredskab uundværlig i et virkeligt, fysisk Yatzy-spil (ellers kan man ikke skrive på blokken), men ingen erfarne programmører kunne drømme om at lave en Blyant-klasse og oprette Blyant-objekter, da blyanter slet ikke er vigtige for logikken i spillet.
Nyttige diagramformer under design er kollaborationsdiagrammer (samarbejdsdiagrammer), hvor man beskriver relationerne mellem klasserne eller objekterne på et overordnet plan.
Her er et eksempel:
Har-relationer giver et vink om, at et objekt har en reference til (evt. ejer) et andet objekt:
Raflebægeret har en reference til terningerne, ellers kan det ikke kaste dem. Terningerne kender ikke til raflebægerets eksistens.
Blokken har nogle regler (en for hver række). Reglerne kender ikke til blokkens eller spillerens eksistens.
Blokken har nogle spillere (en for hver søjle). Spillerne ved, de hører til en blok, hvor deres resultater skal skrives ind på.
Blokkens data skal vises i et vindue. Der er brug for, at blokken kender til Blokvindue, vinduet, der viser blokken på skærmen, så det kan gentegnes, når blokken ændrer sig. Men vinduet har også brug for at kende til blokken, som indeholder de data, det skal vise.
Når spilleren tjekker regler, sker det gennem blok-objektet. Man kan forestille sig, at spilleren løber gennem alle blokkens regler og ser, om der er nogle, der passer, som han ikke har brugt endnu. Tjek af regler er altså ikke en har-relation, for spilleren har ikke en variabel, der refererer til reglerne.
Visse steder er der mange slags objekter, der kan indgå i samme rolle. Det gælder for eksempel Spiller i diagrammet ovenfor. Så kan man tegne et separat diagram, der viser rollerne.
Er-en-relationer angiver generalisering eller specialisering (hvor nedarvning kan være en fordel). Det tegnes oftest med en hul pil.
Her er det lidt specielle, at én type spiller (nemlig Menneske) har et vindue tilknyttet. Dette vindue skal jo have adgang til at vise terningerne, så man skal huske at sørge for, at spillere har en reference til raflebægeret.
Herefter kan skitseres klassediagrammer, hvor man fastlægger nedarvning (er-en-relationerne), de vigtigste variabler og referencerne mellem objekterne (har-relationer) og de vigtigste metoder.
Dette kan eventuelt tegnes med et UML-udviklingsværktøj som samtidig kan generere kode til programmeringsfasen, f.eks. Oracle JDeveloper, ArgoUML, der kan hentes på http://argouml.tigris.org/, eller Poseidon for UML, på http://www.gentleware.com/:
Til højre ses, hvilke typer regler, der kunne forekomme.
access |
adgang, tilgang |
applet |
applet |
array |
tabel, række, array |
assignment |
tildeling |
backslash |
omvendt skråstreg ( \ - angives som "\\" i en streng i kildeteksten) |
backspace |
bak-tegnet ('\b') |
block (statement) |
blok |
boolean |
logisk (boolesk) værdi |
bytecode |
binær kode i en .class-fil, genereret af Java-compileren fra en .java-kildetekst. |
cast |
eksplicit typekonvertering |
character |
tegn |
character set |
tegnsæt |
checked exception |
exception/undtagelse med tvungen håndtering |
class |
klasse |
comment |
kommentar |
compiler |
oversætter |
concatenation |
sammensætning (af tegnstrenge) |
condition |
betingelse |
constructor |
konstruktør |
debugging |
fejlfinding af et program med trinvis gennemgang |
declaration |
erklæring |
decrement |
nedtælling |
deprecated |
frarådet, forældet, ildeset |
digit |
ciffer |
encapsulation |
indkapsling |
enumeration |
opremsning (af nogle elementer) |
event |
hændelse |
event driven |
hændelses-styret |
exception |
undtagelse i programudførslen |
expression |
udtryk |
file |
fil |
floating-point number |
kommatal |
graphical user interface, GUI |
grafisk brugergrænseflade |
host |
værtsmaskine |
increment |
optælling |
indentation |
indrykning |
inheritance |
nedarvning |
instance |
instans, forekomst af et objekt |
integer |
helt tal |
interface |
grænseflade |
interpreter |
fortolker |
label |
etikette |
library |
bibliotek |
listener |
lytter (efter hændelser) |
loop |
løkke |
memory |
lager, RAM |
method |
metode |
nested |
indlejret |
newline |
linjeskift ('\n') |
open source |
åben kildekode/kildetekst |
overloading |
navnesammenfald af metoder (samme navn, forskellige parametre) |
override |
tilsidesætte/omdefinere/overskrive metode i en nedarvet klasse |
package |
pakke |
parse |
analysere, fortolke |
pointer |
reference til et objekt et sted i lageret (adresse i RAM-lageret) |
polymorphism |
polymorfi |
real |
kommatal i Java er kommatalstyperne float og double. |
reference |
reference til et objekt |
scope |
virkefelt |
service |
tjeneste |
source code |
kildetekst, kildekode |
statement |
sætning, ordre, kommando |
stack trace |
stakspor |
stream |
strøm |
string |
tekststreng |
subclass |
underklasse, subklasse, afledt klasse, nedarvet klasse |
test |
afprøvning |
thread |
tråd |
token |
brik, bid |
truncation |
nedrunding (3.7 bliver rundet ned til 3.0) |
typecast |
typekonvertering |
underscore |
understreg ('_' ) |
unchecked exception |
exception uden tvungen håndtering |
variable |
variabel |
visibility |
synlighed |
whitespace |
blanktegn |
A
abstract 296
abstrakte klasser 251, 296
ActionListener 228, 230
actionPerformed() 198, 228, 230
adaptere 232
add() 79, 91
adgang til metoder/variabler 156
adgangskontrol 156
AffineTransform 185
afkrydsningsfelter 200
afledt klasse 127
after() 90
aktivitetsdiagrammer 311
aktør 309
alternativudtryk 61
analyse 309
AND 55
anførelsestegn 89
animationer 183
annotation 126
anonyme klasser 232, 302
antialias 184
apostrof 89
append() 92
argumenter 69
ArithmeticException 235
aritmetiske operatorer 54
array 168
array versus ArrayList 171, 174
ArrayIndexOutOfBoundsException 168, 234
ArrayList 79, 91, 142, 171, 174
arv 126, 222
associative afbildninger 95
AudioClip 191
auto-commit 292
autoboxing 91, 94
B
backslash 89
baggrundsfarve 180, 200
bak 89
bankkonto 124
BasicStroke 185
basisklasse 127
before() 90
beregning af formel 164
beregningsudtryk 32
betinget udførelse 37
binær læsning og skrivning 250
binære talsystem 248
binært til tegnbaseret 253
blok 40, 119
BlueJ 24, 121
Boks 98, 101, 103, 110, 143, 158, 244
boolean 53
boolesk variabel 36
booleske udtryk 38
BorderLayout 206
break 62
browser 190
brugergrænseflade 196
brugsmønstre 309
brugsscenarier 309
buffer 250
BufferedReader 247, 253
byte 53
ByteArrayInputStream 253
bytekode 22, 30
C
CallableStatement 293
catch 235, 241
char 53
Character.isDigit() 159
Character.isLetter() 160
Character.isLowerCase() 160
CharArrayReader 253
Checked-filtreringsklasser 253
checksum 253
ClassCastException 133, 235
ClassNotFoundException 237
CLASSPATH 153
clone() 282
close() 246, 255
CODEBASE 191, 194
commit 292
Comparator 218
ComponentListener 230
Connection 288
containere 204
continue 62
cosinus 35
createStatement() 288
Cursor 180
D
database 288
databasedriver 288
DatabaseMetaData 294
datakompression 254
datastrømme 246, 251
Date 83, 90
design af klasser 312
design-fane 196
destroy() 192
dialog-boks 204
division 33
do-while-løkken 62
double 33, 53
Double.parseDouble() 159, 248
drawImage 178
drawImage() 177
drawLine() 177
drawString 176
drawString() 177
drejninger 185
drevbogstaver 258
DriverManager 288
E
Eclipse 25
egenskaber 200
eksekverbare jar-filer 155
eksplicit typekonvertering 46, 54, 142
eksponentiel notation 248
elementtype 91
enumeration 64
equals() 75, 93, 141
er-en-relation 126, 135, 147, 313
Error 243
esperanto-dansk-ordbog 96
etiket 200
Event 224
eventyrfortælling 81
Exception 242
executeQuery() 289
extends 126
F
FalskTerning 126, 128
fange undtagelser 237
farve 177
fejl 48
fejlmeddelelse 49
Felt (matadorspil) 134, 135, 297
felter 98, 158
File 257
FilenameFilter 302
FileNotFoundException 237
FileReader 247, 252
FileSystem.listRoots() 258
FileWriter 246
filhåndtering 257
filtrering af filnavne 302
filtreringsklasser 253
final 150, 297
finally 244
fjerninterface 284
flerdimensionale arrays 173
flertrådet programmering 270
float 53
FlowLayout 203, 206
flueben 200
flush() 260
FocusListener 230
Font 178
for-løkken 43, 81
forberedt SQL 293
forbinde til en port 260
foreach 81, 169, 171
forgrundsfarve 180, 200
formateringsstreng 57
formelberegning 164
formen af en klasse 119
forpligtende SQL 292
forældreklasse 127
fraktaler 166
FTP 264, 265
G
Gade (matadorspil) 137, 146
GeneralPath 185
getConnection() 288
getTime() 90
grafisk brugergrænseflade 196, 224
grafiske komponenter 196
Graphics 177
Graphics2D 184
GridBagConstraints 208
GridBagLayout 207
Grund (matadorspil) 145
grupper af klasser 152
GUI 196
GZIP-filtreringsklasser 254
H
har-relation 107, 113, 124, 136, 147, 313
HashMap 95
header 261
Helle (matadorspil) 135
heltal 31, 53
heltalsdivision 54
hexadecimale talsystem 248
hjem 258
hjemmesider 190
HTML-dokument 190
HTTP-tjeneste 260
hændelser 224
I
if 38
if-else 39
Image 178
implementere interface 214, 221
implicit typekonvertering 47, 53
import 152
import af klasser 70
indexOf() 75
indkapsling 101, 289, 299
indlejrede løkker 44
indlæsning fra tastatur 238
Indlæsning fra tastaturet 38, 238, 248
indre klasser 299
indrykning 40
indtastningsfelt 201
init() 192
initComponents() 197
initialisering uden for konstruktør 149
InputStream 251
InputStreamReader 253
insert() 92
Insets 208
instruktioner 29
int 31, 53
Integer.parseInt() 159, 248
interaktive programmer 198
interface 214
InterruptedException 271
IOException 237
isEmpty() 91
ItemListener 230
J
JApplet 191
jar-filer 154
Java Web Start 194
Java-arkiver 154
java.awt 70, 152, 176, 179
java.io 152, 251
java.lang 152
java.net 152, 261
java.rmi 152, 284
java.sql 152, 288
java.text 152
java.util 80, 152
Java2D 184
javac 30
javadokumentationen 85
javax.swing 152, 176, 178, 179, 185
jbInit() 197
JButton 200, 229
JCheckBox 200
JComboBox 201
JDBC 288
JDeveloper 24
JDialog 204
JDK 26
JFrame 180, 204
JLabel 200
JList 202
JMenuBar 209
JPanel 204
JRadioButton 200
JTable 211
JTextArea 201
JTextField 201
JTree 211
JWindow 204
K
kaste exceptions 243
KeyListener 229, 230
kildetekst 29
klassediagram 113, 134, 147, 314
klassemetode 58
klasser 66, 85, 118
klassevariabler og -metoder 158, 162
klipning 177
kollaborationsdiagrammer 313
kommandolinie-parametre 170
kommatal 33, 53
kommentarer 28, 51
komponenter 196
komprimering 254
konstruktør 103
konstruktør i underklasse 143, 145
konstruktører 70, 118, 150
Konto 124
konvertere mellem arrays og lister 174
koordinater 176
kopiere en fil 250
Kurvetegning 179
kvadratrod 35
køretidsfejl 49
L
layout 196
layout-manager 205
length() 75
LineNumber-filtreringsklasser 253
lineær transformation 185
linieskift 89
Linjelytter 232
Linjetegning 225, 227
LinjetegningAnonym 303
LinjetegningIndre 300
liste af objekter 79
logisk variabel 36
logiske fejl 48
logiske udtryk 38, 55, 60
lokale klasser 301
lokale variabler 99, 158, 160
long 53
lukke vindue 231
LukProgram 231
lytte på en port 262
lytter 224
læsLinje() 238
læsTal() 238
løkker 41
M
main()-metoden 29, 99, 160, 170
manifest-fil 155
matadorspil 134
matematiske funktioner 35
mellemvariabel 73
memappe 258
metadata 261, 294
metodehovede 99, 120
metodekald 36, 68, 69
metodekrop 100
metoder 36, 66, 71, 118, 162
metoder i vinduer 180
metoders returtype 72
Microsoft 22
modal 204
MouseAdapter 232
mouseClicked() 231
mouseDragged() 227, 231
MouseListener 224, 231
MouseMotionListener 227, 231
mouseMoved() 227, 231
mousePressed() 231
mouseReleased() 224, 231
multipel arv 222
multiplikation 33
Muselytter 224
musens udseende 180
MySQL 288
N
navngivne løkker 63
navngivningsregler 53
nedarvning 126, 222
nedtælling 61
NetBeans 23
new-operatoren 67
next() 289
NOT 55
notify() 276
NotSerializableException 279
NSidetTerning 111
null 70, 137, 235
null-layout 206
NullPointerException 235
nøgle 95
nøgleindekserede tabeller 95
nøgleordet static 158
nøgleordet super 128, 143
nøgleordet this 110
O
Object (stamklasse) 141
ObjectOutputStream 253, 278
objekter 66, 85
objektorienteret analyse 309
objektorienteret design 312
objektreferencer 161
objektrelationer 107, 124
objektvariabler 68, 98, 119, 158, 162
ODBC 288
omvendt skråstreg 89
OOAD 308
open source 26
operatorer 54
opremsning 64
oprette objekt 67
optimering 93, 250, 292
optælling 61
OR 55
Oracle 24
OutputStream 251
OutputStreamWriter 253
override 127
oversætte 30
oversætterfejl 48
P
paintComponent() 176
pakker 70, 152
parametervariabler 160
parametre 69, 85, 120, 160
pause 138
Person 113
Piped-filtreringsklasser 253
platformuafhængig 21, 30
platformuafhængige filnavne 258
Point 67, 86
Polygon 178
polymorfe variabler 130
polymorfi 131, 134, 140, 171, 218
prepareCall() 293
PreparedStatement 293
prepareStatement() 293
primtal 58
printf() 57
printStackTrace() 236
PrintWriter 246
prioritet 276
private 101, 156
protected 150, 156
public 101, 156
Pushback-filtreringsklasser 253
R
radioknapper 200
RandomAccessFile 258
readLine() 261
readObject() 278, 282
Rectangle 70, 87
Rederi (matadorspil) 136, 146
reference-typekonvertering 133
referencer 161
regneark 211
regneudtryk 32
rekursion 163, 257
relationer mellem objekter 107, 124
Remote 284
remove() 91
repaint() 180, 183
replace () 75
restdivision 54
ResultSet 289, 294
ResultSetMetaData 294
return 100, 118
returtype 72, 85, 99, 120
reverse() 92
RMI 284
rmiregistry 285
rollback() 292
rotation 185
run() 270
Runnable 270
række af data 168
S
sammenligning af strenge 78
sammenligningsoperatorer 38, 55
sammensætte strenge 32
Scanner 38, 248, 249
semaforer 276
serialisering 278, 284
Serializable 279
ServerSocket 262
service 260
Shape 184
short 53
sikkerhed 194
simple typer 53
sinus 35
size() 79, 91
skaleringer 185
skilletegn 160
skjule variabler/metoder 101
skrifttype 180, 200
skrive til en tekstfil 246
sleep() 271
SnakkesagligPerson 270
Socket 260
SocketException 237
sortering 218
specialtegn i strenge 89
Spiller (matadorspil) 135
sprogfejl 48
SQL 288
SQLException 237, 288
stakspor 236
stamklasse 127
stamklassen Object 141
standardbiblioteket 85, 152, 159
standardkonstruktør 104, 118, 144
standardp 152
Start (matadorspil) 136
start() 192, 270
Statement 288
static 158
statistik 169, 249
statusfelt 191
sti-separatortegn 258
stifinder 211
stop() 192
stoppe programudførelsen 160
strenge 75
String 75, 88
StringBuilder 92
StringReader 252
subklasse 127
subrutiner 160
substring() 75
super 128, 143, 146
superklasse 127
switch 63, 64
synchronized 275
synlighed af metoder/variabler 156
syntaksfejl 48
System.exit() 160
System.out 159, 248
T
tabulator 89
talsystem 248
Tastatur 38, 238
tastetryk 229
Tegnbar 214
tegne grafik 177
tekstdata 252
tekststrenge 75
Terning 105
TextListener 231
this 110, 124, 150
Thread 270
Thread.sleep() 271
throw 243
Throwable 243
throws 238
tildeling 31
tilsidesætte 127
tilsidesætte variabler 150
titel på vindue 180
tjeneste 260
toLowerCase() 75
toString() 141
toUpperCase() 75
transaktion 292
transformation 185
transient 279
trappeudjævning 184
trim() 88
trinvis gennemgang 45
try-catch-blok 235, 241
tråde 270, 304
typekonvertering 46, 53, 133, 142
tællevariabel 42
U
udbygge en klasse 126
udjævnede farveovergange 184
uendelige løkker 45
uforanderlig 76
UML-notationen 67
UML-udviklingsværktøj 314
underklasse 127
undtagelser 49, 234
Unified Modelling Language 67
Unified Process 309
Unified Process" 308
unikode 89
UnknownHostException 237
unreported exception 237
URL 191
URL-klassen 263
user.dir 258
user.home 258
V
valglister 201
vandfaldsmodellen 308
variabel-overskygning 150
variabler 31
variabler i interface 222
vente 138
virkefelt 160
virtuel maskine 22
vognretur 89
void 85, 118
vridninger 185
værditypekonvertering 46, 53
værtsmaskine 260
W
wait() 276
webserver 262, 272
while-løkken 41
WindowListener 231
wrapper-klasse 91
writeObject() 278, 282
Y
Yatzyspil 309
ydre klasse 299
Z
Zip-filtreringsklasser 253
1En helt anden arbejdsform, der prøver at gå med den umiddelbare impuls: at programmere med det samme, er ekstremprogrammering (XP). I denne form beskriver man først kodens ønskede opførsel i form af testtilfælde, der kan afprøves automatisk gennem hele forløbet. Så programmerer man to og to foran samme tastatur, indtil testene er opfyldt. Til sidst lægger man sig fast på et fornuftigt design og omstrukturerer programmet til at passe med det valgte design.