1 øving_D3_vedlegg.pdf

Konseptuell modell,
skjermdesign
og konstruksjon
Vedlegg til øving D3
1. Gjennomgående eksempel
2. Beskrivelse av konseptuell modell
3. Skjermdesign, kobling mot konseptuell modell og
oppførsel
4. Dokumentasjon av konstruksjon
1. Gjennomgående eksempel
• For å illustrere notasjonene som skal benyttes i øvingen
har vi laget et veldig enkelt gjennomgående eksempel:
Programmet Gruppeliste.
– Du skal lage et program for å håndtere en gruppe (liste) av
personer. Dette kan for eksempel være en venneliste.
– For hver person i listen skal det vises navn, e-mail og fødselsdato.
– Det skal være mulig å legge til nye personer og endre persondata.
• Lysbildene med ramme angir hva som skal leveres i
rapporten i øving D3.
2. Konseptuell modell (generelt)
• Den konseptuelle modellen beskriver de
begrepene brukeren skal behøve å forholde seg
til.
• Disse beskrives tekstlig og v.h.a. UMLdiagrammer, der begrepene enten blir til klasser,
datafelt i klassene, eller navn på relasjoner
mellom klasser.
• Klassene kan forholde seg til hverandre v.h.a arv
(”er”-relasjoner) eller aggregering ( ”har”/”består
av”-relasjoner).
2. Konseptuell modell (innlevering)
• I Gruppeliste er begrepene:
Gruppe, Person, Navn, e-mail og
Fødselsdato.
• Sammenhengen mellom disse
begrepene er:
– en person har et navn, en e-mail og en
fødselsdato.
– En gruppe kan bestå av et vilkårlig
antall personer.
• UML-diagrammet til høyre viser dette.
(Alle figurer er på engelsk)
Grou p
0..1
persons
0..n
Perso n
name
email
dateOfBirth
3. Skjermdesign (generelt)
• Hensikt å beskrive
– den overordnede strukturen til brukergrensesnittet,
uten konstruksjonsdetaljer
– sammenheng mellom brukergrensesnittet og
den konseptuelle modellen
• Abstrakt, unngår detaljer
– hierarkisk struktur, men ikke komponentstruktur
– hva slags data vises hvor, men ikke modell-klasser
– omtrentlig layout, men ingen LayoutManager-logikk
• Et godt utgangspunkt for konstruksjon
3. Skjermlayout (innlevering)
Skissen til venstre viser skjermlayout:
– panel som viser liste av Personobjekter
• støtter seleksjon av Person-objekt
Group group (view)
Person[ ] persons =
group.persons (view)
- Person seleksjon
Viser frem liste av
Person-objekter, hvorav
en kan velges. Valgt
Person skal vises i
hvert sitt panel til høyre.
Person person = seleksjon
(view, edit)
= person.name (edit)
= person.email (edit)
= person.dateOfBirth (edit)
= seleksjon
(view)
som over, men kun view
nyPerson(group) (edit)
– panel som støtter visning og
editering av det Person-objektet
som er selektert i
Person-liste-panelet
• editering av name-attributtet
• editering av email-attributtet
• editering av dateOfBirth-attributtet
– panel som støtter visning av det
samme selekterte Person-objektet
som over
– nyPerson-aksjon som operererer
på Group-objektet i vinduet over
Notasjon for skjermlayout (1)
• Boks for komponent
• Deklarasjon av dataene som
komponenten håndterer
– (logisk) datatype, klassenavn,
evt. array-klammer
– variabelnavn
– initiell verdi, uttrykk som kan
referere til andre variabler
– Funksjon – view og/eller edit
• Type, navn og tekstlig
beskrivelse kan utelates
Person person = seleksjon
(view, edit)
= person.name (edit)
= person.email (edit)
= person.dateOfBirth (edit)
Notasjon for skjermlayout (2)
• Boks for komponent
• Deklarasjon av dataene som
komponenten håndterer
– (logisk) datatype, klassenavn,
evt. array-klammer
– variabelnavn
– initiell verdi, uttrykk som kan
referere til andre variabler
• Funksjon – view og/eller edit
• Lokale variabler
• Tekstlig beskrivelse
Person[ ]
persons =
group.persons
(view)
- Person seleksjon
Viser frem liste av
Person-objekter, hvorav
en kan velges. Valgt
Person skal vises i
hvert sitt panel til høyre.
Notasjon for skjermlayout (3)
• View eller Edit
– Bruk View dersom dataene i dette feltet kun skal
vises fram.
– Bruk Edit dersom brukeren skal kunne endre
innholdet.
3. Kobling konseptuell modell (innlevering)
Konseptuell
modell
Skjermlayout
Group group (view)
Grou p
0..1
persons
0..n
Perso n
name
email
dateOfBirth
Person[ ] persons =
group.persons (view)
- Person seleksjon
Viser frem liste av
Person-objekter, hvorav
en kan velges. Valgt
Person skal vises i
hvert sitt panel til høyre.
nyPerson(group) (edit)
Person person = seleksjon
(view, edit)
= person.name (edit)
= person.email (edit)
= person.dateOfBirth (edit)
= seleksjon
(view)
som over, men kun view
3. Koblinger mellom data (innlevering)
Group group (view)
Person[ ] persons =
group.persons (view)
- Person seleksjon
Viser frem liste av
Person-objekter, hvorav
en kan velges. Valgt
Person skal vises i
hvert sitt panel til høyre.
nyPerson(group) (edit)
Person person = seleksjon
(view, edit)
= person.name (edit)
= person.email (edit)
= person.dateOfBirth (edit)
= seleksjon
(view)
som over, men kun view
3. Konkret skjermdesign (innlevering)
Group group (view)
Person[ ] persons =
group.persons (view)
- Person seleksjon
Viser frem liste av
Person-objekter, hvorav
en kan velges. Valgt
Person skal vises i
hvert sitt panel til høyre.
Person person = seleksjon
(view, edit)
= person.name (edit)
= person.email (edit)
= person.dateOfBirth (edit)
= seleksjon
(view)
som over, men kun view
nyPerson(group) (edit)
Konkret realisering i SWING
Skjermlayout
3. Virkemåte (innlevering)
• Brukeren velger en
person i listen, og kan
deretter se persondata
og endre navn, e-mail
og fødselsdato.
• Brukeren trykker ”Ny
person” og får opp en
tom person. Data for
navn, e-mail og
fødselsdato kan legges
inn/endres.
4. Konstruksjonsbeskrivelse
• Hensikt
– å vise hvilke klasser og objekter som inngår i løsningen
– hvordan disse støtter implementasjonen av
den abstrakte GUI-modellen
• hvilke klasser implementerer vinduer og panes
• hvordan representeres ”variablene” i GUI-modellen
• Diagrammer
– utdyping av GUI-modellen med konstruksjonsklasser
– tradisjonelle klassediagrammer med relevante klasser
– interaksjonsdigrammer for sentrale sekvenser
4. MVC i layout (innlevering)
• Introduserer klasser som implementerer Model-,
View- og Controller-rollene
– kombinasjoner
av roller (M,V,C)
– klasser og impl.
grensesnitt
VC: GroupPanel, ListSelectionListener; M: Group
VC: JList;
M: PersonListModel
VC: PersonPanel;
M: Person
VC: JTextField
VC: JFormattedTextField
• Utelater komp.spesifikke støtteklasser
VC: JFormattedTextField
V: PersonPanel
M: Person
VC: JButton;
M: NewPersonAction
Datatyper og GUI-elementer
• Boolean
– avkryssningsboks, krever tydelig ledetekst
– radioknapper/nedtrekksliste/liste med symmetriske
valg (ja/nei, av/på, ...)
• Heltall
– tekstfelt, krever validering
– radioknapper, relevant valg + ”Andre...”-knapp
– combobox, tekstfelt med validering + relevante valg
– tall med opp/ned-knapper
– slider, relevant verdiområde og granularitet
Datatyper og GUI-elementer...
• Desimaltall
– tekstfelt, krever validering
– slider, relevant verdiområde og granularitet
• Dato
– tekstfelt med validering (merk datoformat)
– uavhengig innfylling av år, måned og dag som tall
– nedtrekksdialog for kalender
• Tekst
– tekstfelt, evt. validering og komplettering
– combobox, tekstfelt + relevante valg
– merk at tekstvariabler ofte brukes til å begrensede sett
Datatyper og GUI-elementer...
• Egne objekter
– bruk av navn (er egen ID) som nøkkel
– liste av ”relevante” objekter, f.eks. alle av en
klasse, naboer et nettverk, parent-kjede, etc.
– combobox med komplettering gir stor fleksibilitet
• Strukturer
– aggregeringshierarki, tre-komponent
– 1-n – relasjon, lister side om side
– klassifiseringshierarki, felles visning med ulike
ikoner
4. Konstruksjon
• Hvordan beskrive
– ferdige komponenter
– hvilke komponenter som GUI’et består av
– hierarkisk sammensetning
– hvordan disse samspiller
• Klassehierarki for ferdig komponenter
• Objektdiagram for instanser og relasjoner
• Interaksjonsdiagram (sequence,
collaboration) for samspill
4. Konstruksjon
• Klasser
– arving
– impl.
Ab stractListModel
NewPerso
nAction
PersonList
Model
Ab stractAction
• Properties
Group
0..n
listeners
model ListModel
0..1
JList
0..n
GroupListen
er
personList
cellRenderer
action
persons
JButton
PersonLine
GroupPanel
ListCellRender
er
• Relasjoner
– navn
– kardinalitet
group
value
pp1
JPanel
pp2
0..n
1
<<Interface>>
PropertyChangeListener
– felt som kan lese og
skrives fritt vha. getog set-metoder
– utelat metodene selv
PersonPanel
0..n
model
1
Person
name
email
dateOfBirth
1
emailTextField
nameTextField
JTextField
dateOfBirthTextField
pcs
1
Pro pertyC hangeSupport
JFormatted
TextField
formatter
AbstractFor
matter
RegexpFor
matter
EmailFor
matter
JList
4. Konstruksjon
• Komponenthierarki
• Arving av
Swing-klasser
• Relasjonsnavn
personList
JButton
GroupPanel
pp1
JPanel
pp2
PersonPanel
emailTextField
nameTextField
JTextField
JFormatted
TextField
dateOfBirthTextField
Konstruksjon
NewPerso
nAction
Ab stractListModel
PersonList
Model
group
0..n
listen ers
model ListModel
Ab stractAction
Group
JList
persons
0..n
GroupListen
er
personList
action
0..n
value
PersonLine
JButton
ListCellRender
er
• • • • 0..1
Abstrakte klasser og grensesnitt
Relasjoner mellom Swing-klasser og egne
Flyktige relasjoner
Modell-klasser vs. GUI-klasser
1
Person
4. Sentrale sekvenser
panel :
GroupPanel
action :
NewPersonAction
group : Group
listModel :
PersonListModel
jList :
List DataList ener
getGroup
addPerson
groupChanged
intervalAdded
4. Sentrale sekvenser
panel :
GroupPanel
1: getGroup
jButton :
JButton
action
action :
NewPersonAction
jList :
List DataListener
4: intervalAdded model
listModel :
PersonListModel
2: addPerson
group
group :
Group
3: groupChanged
4. Sentrale sekvenser
personList :
JList
groupPanel :
ListSelectionList ener
pp1 :
PersonP anel
addListS electionListener(List Select ionLis tener)
valueChanged(List SelectionEvent )
getS electedValue
setModel
setModel
pp2 :
PersonPanel
4. Sentrale sekvenser
5: setModel
groupPanel :
ListSelectionListener
pp2 :
PersonPanel
2: valueChanged(ListSelectionEvent)
4: setModel
personList
: JLis t
1: addListSelectionListener(ListSelectionListener)
3: getSelectedValue
pp1 :
PersonPanel