Indhold:
Analyse: Finde vigtige ord, brugssituationer, 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 5, Nedarvning.
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.
I traditionel systemudvikling er idealet, at 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 senere kan bruges til dokumentation af systemet.
Dette er i skarp modsætning til den måde, som en selvlært umiddelbart ville programmere. 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.
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.
Efter at spillet er afsluttet, huskes resultatet i et lager, hvorfra man kan generere en hiscore-liste.
Analysen skal beskrive, hvad det er for ting og begreber, programmet handler om. Analyse-fasens 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), der knytter sig 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 (kunne også kaldes en mulighed eller et kriterium) - opfyldt, brugt, antal point
Lager - hiscore
Brugssituationer (eng.: Use Case) beskriver en samling af aktører og hvilke brugssituationer de deltager i. Man starter helt overordnet og går mere og mere i detaljer omkring hver brugssituation.
Man kan hævde, at Yatzy-spillet er på grænsen til at være for simpelt til at lave brugsmønstre. Herunder to brugssituationer. Til venstre ses et meget overordnet, der beskriver to spillere og lageret som aktører. Til højre ses brugssituationen omkring en tur.
I stedet for at tegne flotte diagrammer kan man også blot beskrive hver brugssituation med almindelig tekst.
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 selve 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 klasserne og objekterne i sit program, 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
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. F.eks.:
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 (f.eks. købeudgaven af JBuilder eller TogetherJ, der kan hentes i en gratis prøveudgave på http://www.togethersoft.com ), der samtidig kan generere kode til programmeringsfasen.
Herunder ses, hvilke typer regler, der kunne forekomme.
access |
adgang, tilgang |
applet |
applet |
array |
tabel, række, array |
assignment |
tildeling |
backslash |
bagstreg ( \ - angives som '\\' i kildeteksten) |
backspace |
bak-tegnet ('\b') |
block (statement) |
blok |
boolean |
logisk (boolsk) værdi |
browser |
netlæser (f.eks. Netscape, Opera eller Internet Explorer) |
bytecode |
mellemkode |
carriage return |
vognretur ('\r') |
cast |
typekonvertering |
character |
tegn |
character set |
tegnsæt |
checked 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/aflusning af et program |
declaration |
erklæring |
decrement |
nedtælling |
deprecated |
frarådet, forældet |
digit |
ciffer |
encapsulation |
indkapsling |
enumeration |
opremsning (af nogle elementer) |
event |
hændelse |
event driven |
hændelsesstyret |
exception |
undtagelse |
expression |
udtryk |
file |
fil |
floating-point number |
kommatal |
graphical user interface |
grafisk brugergrænseflade |
hardware |
maskinel |
host |
værtsmaskine |
identifier |
navn |
increment |
optælling |
indentation |
indrykning |
inheritance |
nedarvning |
instance |
instans, forekomst |
integer |
heltal |
interface |
grænseflade |
interpreter |
fortolker |
label |
etikette |
library |
bibliotek |
listener |
lytter (efter hændelser) |
location (in memory) |
plads (i lager) |
loop |
løkke |
memory |
lager |
method |
metode |
nested |
indlejret |
newline |
linjeskift ('\n') |
open source |
åben kildekode/kildetekst |
overloading |
overlæsning, navnesammenfald af metoder |
override |
tilsidesætte/omdefinere/overstyre/overskrive metode i en nedarvet klasse |
package |
pakke |
parse |
analysere, fortolke |
pointer |
reference/peger/hægte til et objekt et sted i lageret |
polymorphism |
polymorfi |
reference |
reference/peger/hægte til et objekt et sted i lageret |
rounding |
afrunding |
scope |
virkefelt |
service |
tjeneste |
software |
programmel |
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 |
undtagelse uden tvungen håndtering |
variable |
variabel |
visibility |
synlighed |
whitespace |
blanktegn |
A
abstract 292
abstrakte klasser 247, 292
ActionListener 224, 226
actionPerformed() 196, 224, 226
adaptere 228
addElement() 81, 93
adgang til metoder/variabler 154
adgangskontrol 154
AffineTransform 185
afkrydsningsfelter 198
afledt klasse 125
after() 92
aktivitetsdiagrammer 306
aktør 305
alternativudtryk 63
analyse 305
AND 57
anførelsestegn 91
animationer 182
anonyme klasser 228, 298
antialias 184
apostrof 91
append() 94
Applet 189
argumenter 71
ArithmeticException 231
aritmetiske operatorer 56
array 166
array versus Vector 169
ArrayIndexOutOfBoundsException 166, 230
ArrayList 80, 93, 140, 169
arv 124, 217
associative afbildninger 97
AudioClip 189
auto-commit 288
autoboxing 93, 96
AWT-komponenter 207
B
baggrundsfarve 177, 198
bagstreg 91
bak 91
bankkonto 122
BasicStroke 186
basisklasse 125
before() 92
beregning af formel 162
beregningsudtryk 34
betinget udførelse 39
binær læsning og skrivning 246
binære talsystem 244
binært til tegnbaseret 249
blinkeri 183
blok 42, 117
BlueJ 27, 119
Boks 100, 103, 105, 111, 141, 156, 240
boolean 55
boolesk variabel 38
booleske udtryk 40
BorderLayout 203
Borland JBuilder 23
break 64
browser 188
brugergrænseflade 194
brugssituationer 305
buffer 246
BufferedReader 243, 249
Button 198, 225
byte 55
ByteArrayInputStream 249
bytekode 21, 32
C
CallableStatement 289
Canvas 200
catch 231, 238
char 55
Character.isDigit() 157
Character.isLetter() 158
Character.isLowerCase() 158
CharArrayReader 249
Checkbox 198
Checked-filtreringsklasser 249
checksum 249
Choice 198
ClassCastException 131, 231
ClassNotFoundException 233
CLASSPATH 151
clone() 276
close() 242, 251
CODEBASE 189, 192
commit 288
Comparator 214
ComponentListener 226
Connection 284
containere 202
continue 64
cosinus 37
createStatement() 284
Cursor 177
D
database 284
databasedriver 284, 289
DatabaseMetaData 290
datakompression 250
datastrømme 242, 247
Date 85, 92
dekoration 174
design af klasser 308
design-fane 194
destroy() 190
Dialog 202
dialog-boks 202
division 35
do-while-løkken 63
double 35, 55
double buffering 184, 207
Double.parseDouble() 157, 244
drawImage 176
drawImage() 175
drawLine() 175
drawString 174
drawString() 175
drejninger 185
drevbogstaver 252
DriverManager 284
E
Eclipse 26
egenskaber 198
eksekverbare jar-filer 152
eksplicit typekonvertering 48, 56, 140
eksponentiel notation 244
elementtype 82, 93
equals() 76, 95, 139
er-en-relation 125, 133, 145, 309
Error 239
esperanto-dansk-ordbog 98
etikette 199
Event 220
eventyrfortælling 82
Exception 238
executeQuery() 285
extends 124
F
FalskTerning 124, 126
fange undtagelser 233
farve 175
fejl 50
fejlmeddelelse 51
Felt (matadorspil) 132, 133, 293
File 252
FilenameFilter 298
FileNotFoundException 233
FileReader 243, 248
FileSystem.listRoots() 252
FileWriter 242
filhåndtering 252
filtrering af filnavne 298
filtreringsklasser 249
final 148, 293
finally 240
fjerninterface 278
flerdimensionale arrays 171
flertrådet programmering 264
float 55
FlowLayout 201, 203
flueben 198
flush() 254
FocusListener 226
Font 176
for-løkken 45, 82
forberedt SQL 289
forbinde til en port 254
forgrundsfarve 177, 198
formateringsstreng 58
formelberegning 162
formen af en klasse 117
forpligtende SQL 288
forældreklasse 125
fraktaler 164
Frame 177, 202
fremviser 188
FTP 258, 259
G
Gade (matadorspil) 135, 144
GeneralPath 185
getConnection() 284
getTime() 92
grafikbuffer 184, 207
grafisk brugergrænseflade 194, 220
grafisk vindue 174
grafiske komponenter 194
Graphics 175
Graphics2D 185
GridBagConstraints 205
GridBagLayout 204
Grund (matadorspil) 143
grupper af klasser 150
GUI 194
GZIP-filtreringsklasser 250
H
har-relation 108, 114, 122, 134, 145, 309
HashMap 97
Helle (matadorspil) 133
heltal 33, 55
heltalsdivision 56
hexadecimale talsystem 244
hjem 252
hjemmesider 188
HTML-dokument 188
HTTP-tjeneste 254
hændelser 220
I
if 40
if-else 41
ild 94
Image 176
implementere interface 210, 217
implicit typekonvertering 49, 55
import 150
import af klasser 72
indexOf() 76
indkapsling 103, 285, 295
indlejrede løkker 46
indlæsning fra tastatur 234
Indlæsning fra tastaturet 40, 59, 234, 244
indre klasser 295
indrykning 42
indtastningsfelt 199
init() 190
initComponents() 195
initialisering uden for konstruktør 147
InputStream 247
InputStreamReader 249
insert() 94
insertElementAt() 81, 93
Insets 174, 177, 205
instruktioner 31
int 33, 55
Integer.parseInt() 157, 244
interaktive programmer 196
interface 210
InterruptedException 265
IOException 233
ItemListener 226
J
J2SE 27
jar-filer 152
Java Studio Creator 25
Java-arkiver 152
java.applet 150, 188
java.awt 72, 150, 174
java.io 150, 247
java.lang 150
java.net 150, 255
java.rmi 150, 278, 282
java.sql 150, 285
java.text 150
java.util 81, 150
Java2D 184
javac 32
javadokumentationen 87
javax.swing 150, 207
jbInit() 195
JBuilder 23
JDBC 284
JDeveloper 24
JDK 27
JDK 1.5 41, 82, 96
JDK1.5 58
K
kaste undtagelser 239
KeyListener 225, 226
kildetekst 31
klassediagram 114, 132, 145, 309
klassemetode 60
klasser 68, 87, 116
klassevariabler og -metoder 156, 160
klipning 175
kollaborationsdiagrammer 308
kommandolinie-parametre 168
kommatal 35, 55
kommentarer 30, 53
komponenter 194
komprimering 250
konstruktør 105
konstruktør i underklasse 141, 143
konstruktører 72, 116, 148
Konto 122
koordinater 174
kopiere en fil 246
Kurvetegning 178
kvadratrod 37
køretidsfejl 51
L
Label 199
layout 194
layout-manager 203
length() 76
letvægtkomponenter 207
LineNumber-filtreringsklasser 249
lineær transformation 185
linieskift 91
Linjelytter 228
Linjetegning 221, 223
LinjetegningAnonym 299
LinjetegningIndre 296
List 200
liste af objekter 80
logisk variabel 38
logiske fejl 50
logiske udtryk 40, 57, 62
lokale klasser 297
lokale variabler 101, 156, 158
long 55
lukke vindue 174, 227
LukProgram 227
lytte på en port 256
lytter 220
læsLinje() 234
læsTal() 234
løkker 43
M
main()-metoden 31, 101, 158, 168
manifest-fil 152
matadorspil 132
matematiske funktioner 37
mellemvariabel 75
memappe 252
MenuBar 206
metadata 255, 290
metodehovede 101, 118
metodekald 38, 70, 71
metodekrop 102
metoder 38, 68, 73, 116, 160
metoder i vinduer 177
metoders returtype 74
Microsoft 22
modal 202
MouseAdapter 228
mouseClicked() 227
mouseDragged() 223, 227
MouseListener 220, 227
MouseMotionListener 223, 227
mouseMoved() 223, 227
mousePressed() 227
mouseReleased() 220, 227
multipel arv 217
multiplikation 35
Muselytter 220
musens udseende 177
N
navngivne løkker 64
navngivningsregler 55
nedarving 217
nedarvning 124
nedtælling 63
NetBeans 25
netlæser 188
new-operatoren 69
next() 285
NOT 57
notify() 270
NotSerializableException 273
NSidetTerning 112
null 72, 134, 231
null-layout 203
NullPointerException 231
nulpunkt 174
nøgle 97
nøgleindekserede tabeller 97
nøgleordet static 156
nøgleordet super 126, 141
nøgleordet this 111
O
Object (stamklasse) 139
ObjectOutputStream 249, 272
objekter 68, 87
objektorienteret analyse 305
objektorienteret design 308
objektreferencer 159
objektrelationer 108, 122
objektvariabler 70, 100, 117, 156, 160
ODBC 284, 289
OOAD 304
open source 28
operatorer 56
oprette objekt 69
optimering 95, 246, 288
optælling 63
OR 57
Oracle 24, 284
OutputStream 247
OutputStreamWriter 249
oversætte 32
oversætterfejl 50
P
paint() 174
pakker 72, 150
Panel 202
parametervariabler 158
parametre 71, 87, 118, 158
pause 137
Person 114
Piped-filtreringsklasser 249
platformuafhængig 21, 32, 207
platformuafhængige filnavne 252
Point 69, 88
Polygon 176
polymorfe variabler 128
polymorfi 129, 132, 138, 169, 214
prepareCall() 289
PreparedStatement 289
prepareStatement() 289
primtal 60
printf() 58
printStackTrace() 232
PrintWriter 242
prioritet 270
private 103, 154
protected 148, 154
public 103, 154
Pushback-filtreringsklasser 249
R
radioknapper 198
RandomAccessFile 252
readLine() 255
readObject() 272, 276
Rectangle 72, 89
Rederi (matadorspil) 134, 144
reference-typekonvertering 131
referencer 159
regneudtryk 34
rekursion 161, 252
relationer mellem objekter 108, 122
Remote 278
removeElementAt() 81
repaint() 177, 182
replace () 76
restdivision 56
ResultSet 285, 290
ResultSetMetaData 290
return 102, 116
returtype 74, 87, 101, 118
reverse() 94
RMI 278
rmiregistry 279
rollback() 288
rotation 185
run() 264
Runnable 264
række af data 166
S
sammenligning af strenge 79
sammenligningsoperatorer 40, 57
sammensætte strenge 34
Scanner 40, 244, 245
semaforer 270
serialisering 272, 278
Serializable 273
ServerSocket 256
Shape 185
short 55
sikkerhed 192
simple typer 55
sinus 37
skaleringer 185
skilletegn 158
skjule variabler/metoder 103
skrifttype 177, 198
skrive til en tekstfil 242
sleep() 137, 265
SnakkesagligPerson 264
Socket 254
SocketException 233
sortering 214
specialtegn i strenge 91
Spiller (matadorspil) 136
sprogfejl 50
SQL 284
SQLException 233, 284
stakspor 232
stamklasse 125
stamklassen Object 139
standardbiblioteket 87, 150, 157
standardkonstruktør 106, 116, 142
standardp 150
Start (matadorspil) 133
start() 190, 264
Statement 284
static 156
statistik 167, 245
statusfelt 189
sti-separatortegn 252
stop() 190
stoppe grafisk program 174
stoppe programudførelsen 158
strenge 76
String 76, 90
StringBuffer 94
StringBuilder 94
StringReader 248
subklasse 125
subrutiner 158
substring() 76
super 126, 141, 144
superklasse 125
sværvægtskomponenter 207
Swing-komponenter 207
switch 65
synchronized 269
synlighed af metoder/variabler 154
syntaksfejl 50
System.exit() 158
System.out 157, 244
T
tabulator 91
talsystem 244
Tastatur 40, 59, 234
tastetryk 225
Tegnbar 210
tegne grafik 175
tegneområde 200
tekstdata 248
tekststrenge 76
Terning 107
TextArea 199
TextField 199
TextListener 227
this 111, 122, 137, 148
Thread 264
Thread.sleep() 137, 265
throw 239
Throwable 239
throws 233
tildeling 33
tilsidesætte variabler 148
titel på vindue 177
tjeneste 254
TogetherJ 309
toLowerCase() 76
toString() 139
toUpperCase() 76
transaktion 288
transformation 185
transient 273
trappeudjævning 184
trim() 90
trinvis gennemgang 47
try-catch-blok 231, 237
tråde 264, 300
typekonvertering 48, 55, 131, 140
tællevariabel 44
U
udbygge en klasse 124
udjævnede farveovergange 184
uendelige løkker 47
uforanderlig 77
UML-notationen 69
UML-udviklingsværktøj 309
underklasse 125
undtagelser 51, 230
Unified Modelling Language 69
unikode 91
UnknownHostException 233
unreported exception 233
update() 183
URL 189
URL-klassen 257
user.dir 252
user.home 252
V
valglister 198
variabel-overskygning 148
variabler 33
variabler i interface 218
vente 137
vindue 174
virkefelt 158
virtuel maskine 21
vognretur 91
void 87, 116
vridninger 185
værditypekonvertering 48, 55
værtsmaskine 254
W
wait() 270
webserver 256, 266
while-løkken 43
Window 202
WindowListener 227
writeObject() 272, 276
Y
Yatzyspil 305
ydre klasse 295
Z
Zip-filtreringsklasser 249
Ændringer i tredje udgave
I de sidste år har jeg samlet på rettelser, kommentarer og forslag til bogen og derudover selv undervist i den. Rettelserne og forbedringerne er næsten alle ført ind i tredje udgave
Selvom der er kommet meget stof til, er sidetallet ikke øget. I stedet er de eksisterende sider blevet bedre udnyttet.
1.3 Programmeringsværktøjer til Java
3.6.2 Opdeling af strenge (klassen StringTokenizer)
3.10.2 Nøgleindekserede tabeller (klassen HashMap)
5.2.4 Hvilken vej er en variabel polymorf ?
9.3.1 Opgave: Grafisk Matador-spil
10.5.3 Begrænsninger i ældre netlæsere
11.4.5 Dialog og mere??
11.1 Generering med et værktøj
15.4.1 Konvertere strenge til tal
15.4.2 Samlet eksempel: Statistik
introducere og snakke om ny for-løkke et sted!
else-if beskrevet (OK)
ArrayList i stedet for Vector, HashMap i stedet for Hashtable, Iterator i stedet for Enumeration (OK?)
Brug at generics (f.eks. ArrayList<String>, dvs ArrayList der KUN kan indeholde strenge) (OK?)
ny for-løkke (foreach)
autoboxing (automatisk konvertering af f.eks. int til/fra Integer-objekt)
Animationer sker fra main-metodens tråd ( repaint(1000) er endelig taget væk!! )
Behold AWT (mere begyndervenligt end Swing)?
Afsnit om og supplerende brug af BlueJ
Matador-eksempel revideret (OK)
String-klassen har en del nye metoder, der gør opgaverne om String fjollede
System.out.printf() overtager al tal- og datoformatering
java.util.Scanner gør Tastatur-klassen overflødig
Afsnit om udviklingsværktøjer opdateret
UML-diagrammer strammet op
+ Generiske klasser (generics/parametriserede typer)
Stærkere typesikkerhed. Eks.: ArrayList af strenge:
ArrayList<String> sl = new ArrayList<String>();
+ Nemmere for-løkke
Kan gennemløbe enhver datastruktur (bruger skjult Iterator på Collections-klasser og tællevariabel på almindelige arrays)
for(String s : sl) { System.out.println(s); }
+ Automatisk konvertering mellem simpel type og objekt
Map<String, Integer> navnTilCPR = new HashMap<String, Integer>();
navnTilCPR.put("Jacob Nordfalk", 010171); // boxing af int 010171
int cpr = navnTilCPR.get("Jacob Nordfalk"); // unboxing af Integer 010171
% Typesikre opremsninger (typesafe enums)
public enum MainMenu {FILE, EDIT, FORMAT, VIEW};
+/- Variabelt antal argumenter til en metode (array af arg)
- Import af klassemetoder og -variabler (static import)
import static java.lang.Math.*; ... x = 2*PI; y = sin(x); ...
- Metadata (Annotations)
den sidste printf-sætning formateres et Date-objekt (dato og tid). Her er nogle af typerne:
%tA giver dagens fulde navn (f.eks. onsdag), %ta giver en 3-bogstavs forkortelse
%tB giver månedens fulde navn (f.eks. januar), %tb giver en 3-bogstavs forkortelse
%te giver dagen i måneden, %td evt. med foranstillet 0.
%tY giver året med 4 cifre, %ty med 2 cifre
%tt giver klokkelæt på dagen
xxx flere?
xxx nævn om String.format()
xxx d
OOAD
xxx snak om brugssituationer skrevet på listeform
xxx snak om ansvarsområder
xxx Husk at sætte linjenummerering i typografi "kode m linienr." før ny udgave udgives
1En helt anden arbejdsform, der prøver at gå med den umiddelbare impuls til at programmere med det samme, er ekstremprogrammering. 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.