naam - LIACS

Report
Ontwerpen
Klassendiagrammen
Case 1: Mario
Wat zijn de objecten?
Case 1: Mario
Case 1: Mario
•
•
•
•
•
•
•
•
•
•
•
•
•
•
Mario
Luigi
Toad1
Toad2
Yoshi Groen
Yoshi Rood
Hamerman 1
Hamerman 2
Hamer 1
Hamer 2
Hamer 3
Munt 1
Munt 2
Munt 3
• Mushroom
• Mysterieblok
• Rij blokken 1
– Blok1
– Etc.
Onhandig
• Rij blokken 2
– Blok1
– Etc.
•
•
•
•
•
•
Vloer
Dakje
Platform 1
Platform 2
Platform 3
Platform 4
Case 1: Mario
• Een lijst maken met objecten maken is
onhandig
– Stel je voor dat je 200 munten hebt in een level!
– Wat nou als we ook nog eigenschappen van
objecten willen beschrijven?
• Veel objecten zijn (vrijwel) hetzelfde!
– Probeer objecten die erg op elkaar lijken onder 1
‘blauwdruk’ samen te nemen!
– Dit is een klasse
Klasse
• Een klasse beschrijft een blauwdruk van een collectie individuen
(objecten)
• Voorbeeld: De klasse mens beschrijft ons allemaal.
– Wij zijn dan de ‘objecten van klasse mens’
• Een klasse beschrijft per klasse:
– Attributen: Eigenschappen
– Methoden: vaardigheden
• Methoden mens:
– Lopen, praten, zitten
– Methoden zijn voor elk object identiek
• Attributen mens:
– Haarkleur, lengte, gewicht
– Attributen hebben voor elk object een andere waarde
Klasse UML syntax
• Syntax zijn de ‘spellingsregels’ van een
computertaal.
– UML: Hoe hoor je de plaatjes te tekenen
Mens
-
haarkleur
lengte
gewicht
-
lopen
praten
zitten
Case 1: Mario
Munt
Mysterieblok
- locatie
Blok
Mario
- locatie Platform
- waarde
Luigi
locatie
- -inhoud
Dak
- Toad
locatie
- locatie
-Yoshi
locatie
Vloer
- status
locatie
- hoogte
- locatie
Hamerman
Hamer
- status
- geefprijs
- locatie Mushroom
breedte
- locatie
- -breedte
- Kleur
Handiger
Kan
beter
-
-gaten
locatie
locatie
kapot
- springen
- -aantal
- hoogte
- kleur
- status
- -locatie
- springen
hoogte
- snelheid
- yoshipakken
- schuinheid
- berijder
- richting - springen
- yoshipakken
- richting
- Sterven
- lopen
- Berijden
- yoshipakken
- Sterven
- Stootblok
- kill - springen
- Steektonguit
- Sterven
- Stootblok
- pakmunt
- -opeten
hamergooien
- Eetop
- Stootblok
- pakmunt
- kill
- raakkwijt
- pakmunt
Overerving
Kind
• Een kind:
-
Volwassene
– Heeft een lengte, gewicht,haarkleur
haarkleur,
haarkleur
voorkeursspeelgoed
Lengte
gewicht
–
Kan
lopen,
praten,
zitten,
lievelingsspeelgoed
-
Lengte
gewicht
spelen,
baan
schoolgaan
• Een volwassene:
-
lopen
- lopen
– Heeft een lengte, gewicht,
haarkleur, baan
praten
- praten
zitten
zitten
– Kan lopen, praten, zitten,- stemmen,
autorijden
spelen
- stemmen
schoolgaan
- autorijden
Wat valt op (kan handiger)?
Overerving UML syntax
Mens
• Een mens is óf een kind
óf een volwassene
• Een kind is een specifiek
soort mens
• Een volwassene is een
specifiek soort mens
-
haarkleur
lengte
gewicht
-
lopen
praten
zitten
SuperKlasse of
parent class
Subklasse of
Child class
Kind
Volwassene
-
lievelingsspeelgoed
-
baan
-
schoolgaan
spelen
-
stemmen
autorijden
Overerving theorie
• Overerving: ook wel Generalisatie
• Een subklasse heeft alle attributen van zichzelf
en zijn superklasse(n)
– Kunnen ook meer zijn (grandfather class)
• Een subklasse heeft alle methoden van
zichzelf en zijn superklasse(n)
• Naar ‘beneden’: specificering
• Naar ‘boven’: veralgemening
Case 1: Mario
Spelelement
Bewegend
Zelfbewegend
Speler
Mensen
Vijand
Toads
Actief
Hamer
Yoshi
Hamerman
Munt
Platform
Mushroom
Dit is niet af!
• Waar moeten de
methoden?
• Waar moeten de
attributen?
• Er ontbreken klassen
• Zie oefenopgave
Klassendiagram: procedure
• Lees de tekst
• Zelfstandige Naamwoorden:
– Klasse
– Attribuut
– Niet modelleren
• Werkwoorden
– Methoden
– Iets anders
– Niet modelleren
Case 2: Studeren
Van nieuwe studenten dienen de volgende
gegevens ingevoerd te worden: naam, studentcode,
geboortedatum en SLB’er.(bij inschrijven krijgt
iedere student een docent als SLB’er toegewezen).
Studenten hebben een cijferlijst en studeren en
maken tentamens.
Na iedere periode moeten de cijfers voor de
blokken en de toetsdatum ingevoerd worden. Het
systeem rekent het gemiddelde van de behaalde
cijfers uit.
Docenten hebben een naam, geboortedatum en
vestiging. Ze berekenen cijfers en beoordelen
studenten
Case 2: Studeren
Van nieuwe studenten dienen de volgende
gegevens ingevoerd te worden: naam, studentcode,
geboortedatum en SLB’er.(bij inschrijven krijgt
iedere student een docent als SLB’er toegewezen).
Studenten hebben een cijferlijst en studeren en
maken tentamens.
Na iedere periode moeten de cijfers voor de
blokken en de toetsdatum ingevoerd worden. Het
systeem rekent het gemiddelde van de behaalde
cijfers uit.
Docenten hebben een naam, geboortedatum en
vestiging. Ze berekenen cijfers en beoordelen
studenten
Wat
is
wat?
Case 2: Studeren
ZNW:
• studenten
• gegevens
• Naam
• geboortedatum
• SLB’er
• docent
• periode
• cijfer
• blok
• toetsdatum
• systeem
• Gemiddelde
• Vestiging
WW:
• Invoeren
• Inschrijven
• Toewijzen
• Tentamen maken
• Studeren
• Hebben
• Uitrekenen
• Cijfers berekenen
• Studenten beoordelen
Case 2: Studeren
• Student
– naam
– Geboortedatum
– Studentcode
– Slb’er
– cijferlijst
– Inschrijven
– Tentamen maken
– studeren
• Docent
–
–
–
–
–
–
SLB-studenten
Naam
Geboortedatum
Vestiging
Student beoordelen
Cijfers berekenen
• Resultaat
– Cijfer
– Toetsdatum
– Blok
Case 2: Studeren
Persoon
-
naam
geboortedatum
Student
Resultaat
Docent
-
code
SLB’er
cijferlijst
-
Vestiging
SLB studenten
-
Inschrijven
Studeren
Tentamen maken
-
Cijfers berekenen
Studenten
beoordelen
-
Blok
Toetsdatum
cijfer
Case 1: Mario
Interactie??
Klassendiagram als systeemmodel
• Vorige keer:
Een Klassendiagram beschrijft de interactie
tussen objecten.
• Hoe leggen we die interactie vast?
Case 1: Mario
Welke objecten interacteren?
Case 1: Mario
•
•
•
•
•
•
Mysterieblok bevat Mushroom
Speler berijdt Yoshi (parent class!)
Hamerman gooit Hamer
Hamer ‘doodt’ Speler
Speler pakt munt
Etc.
• Hoe modelleren we dat?
Associatie UML syntax
• Als 2 objecten kennis van elkaar hebben ( =
met elkaar interacteren) dan hebben ze een
associatie.
• Associaties met een superklasse gelden
(natuurlijk) ook voor de subklasse.
• Notatie is een lijn.
Hamerman
Speler
Hamer
Yoshi
Associatie UML syntax
• Een associatie heeft altijd een beschrijving
– Dat is een ‘naam’ met leesrichting (midden) óf
– Een rolverdeling aan beide kanten
Hamerman
Hamer
Speler
Hamer
gooit
gooit
Hamerman
wapen
slachtoffer
Hamer
Speler
berijdt
Yoshi
Case 1: Mario
Kan Mario meerdere
Yoshi’s berijden?
Kan een mysterieblok
meerdere mushrooms
bevatten?
Kan een hamerman
meerdere hamers
gooien?
Multipliciteit UML syntax
• Multipliciteit geeft de hoeveelheden bij een
associatie aan:
– 1  precies 1
– 99  precies 99
– 5..55  een waarde tussen de 5 en de 55
– *  meerdere (=potentieel oneindig veel, kan ook 0)
– 4..*  4 of meer
• De multipliciteit geef je aan beide kanten aan
Multipliciteit UML syntax
Hamerman
1
*
gooit
Hamer
• Een Hamerman gooit 0 of meer Hamers
• Een hamer wordt gegooid door 1 Hamerman
Speler
• Een Speler berijdt 0 of 1 Yoshi
• Een Yoshi wordt bereden door 0 of 1 speler
0..1
berijdt
0..1
Yoshi
Klassendiagram: procedure
• Zelfstandige Naamwoorden:
– Klasse
– Attribuut
– Niet modelleren
• Werkwoorden
– Methoden
– Iets anders
– Niet modelleren
Associatie !
Case 2: Studeren
Van nieuwe studenten dienen de volgende
gegevens ingevoerd te worden: naam, studentcode,
geboortedatum en SLB’er.(bij inschrijven krijgt
iedere student een docent als SLB’er toegewezen).
Studenten hebben een cijferlijst en studeren en
maken tentamens.
Na iedere periode moeten de cijfers voor de
blokken en de toetsdatum ingevoerd worden. Het
systeem rekent het gemiddelde van de behaalde
cijfers uit.
Docenten hebben een naam, geboortedatum en
vestiging. Ze berekenen cijfers en beoordelen
studenten
Case 2: Studeren
ZNW:
• studenten
• gegevens
• Naam
• geboortedatum
• SLB’er
• docent
• periode
• cijfer
• blok
• toetsdatum
• systeem
• Gemiddelde
• Vestiging
WW:
• Invoeren
• Inschrijven
• Toewijzen
• Tentamen maken
• Studeren
• Hebben
• Uitrekenen
• Cijfers berekenen
• Studenten beoordelen
Case 2: Studeren
• Student
– naam
– Geboortedatum
– Studentcode
– Slb’er
– cijferlijst
– Inschrijven
– Tentamen maken
– studeren
• Docent
–
–
–
–
–
–
SLB-studenten
Naam
Geboortedatum
Vestiging
Student beoordelen
Cijfers berekenen
• Resultaat
– Cijfer
– Toetsdatum
– Blok
Case 2: Studeren
Persoon
-
naam
geboortedatum
Docent
*
beoordeelt
Student
-
*
-
Vestiging
-
Cijfers berekenen
Studenten
beoordelen
SLB’er
1
1
Bepaalt
Code
cijferlijst
*
-
Inschrijven
Studeren
Tentamen maken
1
1..*
Resultaat
Eerstejaars
Behaalt
*
-
Blok
Toetsdatum
cijfer
Associaties: afspraken
• Associaties kunnen ook ‘naar zichzelf’. Dat
heet een unaire associatie.
– Een student heeft 2 of meer vrienden
– Een docent is baas van meerdere andere docenten
van
• Iedere klasse heeft 12..*
minstens 1Isis baas
associatie
vriend
van
Student
Docent
Docent
• Als een klasse- - verwijst
naar
een
object
van
code
*2..*
Vestiging
Vestiging
SLB’er
SLB studenten
SLBis
studenten
een klasse die- - ook
in je diagram staat,
dat
cijferlijst
nooit een attribuut,
maar altijd een- associatie
- - Inschrijven
Cijfers berekenen
Cijfers berekenen
--
Studeren
Studenten
Tentamen
maken
beoordelen
-
Studenten
beoordelen
Case 3: Kebab
DönerKings is een grote keten kebab-bakkers. Ieder filiaal
heeft minimaal 2 werknemers met een bepaald salaris en een
naam. Ze worden ingehuurd om te bakken, verkopen en
broodjes te vullen. Sommige werknemers geven leiding aan 2
andere werknemers. Je kan verschillende bazen hebben.
Filialen verkopen broodjes en Turkse pizza’s; van beide weten
we de kostprijs. Van broodjes weten we de inhoud (Kip of Kalf)
en van pizza’s de doorsnede. Beide kunnen ze bakken. Soms
breiden filialen uit. Ze nemen dan meer werknemers in dienst.
Broodjes en pizza’s bevatten altijd 3 ingrediënten. Van
ingrediënten weten we de houdbaarheidsdatum. Soms
verrotten ze. Oh ja! Filialen hebben een adres en eigenaar. Dat
is 1 van de medewerkers.
Case 3: Kebab
DönerKings is een grote keten kebab-bakkers. Ieder filiaal
heeft minimaal 2 werknemers met een bepaald salaris en een
naam. Ze worden ingehuurd om te bakken, verkopen en
broodjes te vullen. Sommige werknemers geven leiding aan 2
andere werknemers. Je kan verschillende bazen hebben.
Filialen verkopen broodjes en Turkse pizza’s; van beide weten
we de kostprijs. Van broodjes weten we de inhoud (Kip of Kalf)
en van pizza’s de doorsnede. Beide kunnen bakken. Soms
breiden filialen uit. Ze nemen dan meer werknemers in dienst.
Broodjes en pizza’s bevatten altijd 3 ingrediënten. Van
ingrediënten weten we de houdbaarheidsdatum. Soms
verrotten ze. Oh ja! Filialen hebben een adres en eigenaar. Dat
is 1 van de medewerkers.
Case 3: Kebab
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
DönerKings
Keten
Kebab-bakkers
Filiaal
Werknemers
Salaris
Naam
Broodjes
Bazen
Turkse Pizza’s
Kostprijs
Inhoud
Kip
Kalf
Pizza’s
Doorsnede
Beide
Ingrediënten
Houdbaarheidsdatum
Adres
Eigenaar
Eerst synoniemen
identificeren en overbodige
woorden eruit
Case 3: Kebab
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
DönerKings
Keten
Kebab-bakkers = filialen
Werknemers
Salaris
Naam
Broodjes
Bazen
Turkse Pizza’s = pizza’s
Kostprijs
Inhoud
Kip
Kalf
Doorsnede
Beide
Ingrediënten
Houdbaarheidsdatum
Adres
Eigenaar
Klantnaam
Uitleg klant
synoniem
Nu enkelvoud en
ordenen…
Onderdeel van werkwoord
synoniem
Mogelijke optie voor attribuut
Mogelijke optie voor attribuut
Taalconstructie (wel hint!)
Case 3: Kebab
• Filiaal
– Adres
– Eigenaar
• Werknemer
Verwijst naar klasse in
diagram (Associatie)
– Salaris
– Naam
– Ondergeschikten
• Product
– Kostprijs
• Broodje
– Inhoud
• Turkse Pizza
– Doorsnede
• Ingrediënt
– Houdbaarheidsdatum
Superklasse!
Case 3: Kebab
• Filiaal
Verschillend?
– Adres
• Werknemers
– Salaris
– Naam
• Product
– Kostprijs
• Broodje
– Inhoud
• Turkse Pizza
– Doorsnede
• Ingrediënt
– Houdbaarheidsdatum
•
•
•
•
•
•
•
•
•
•
•
•
•
Heeft werknemers = inhuren
Bakken
Verkopen
Broodjes vullen
Geven leiding = bazen hebben
Verkopen
Weten
Bakken
Uitbreiden
In dienst nemen
Hebben
Verrotten
Bevatten
Case 3: Kebab
•
Filiaal
–
–
–
•
Werknemers
–
–
–
–
–
•
Inhoud
Turkse Pizza
–
•
Kostprijs
Bakken
Broodje
–
•
Salaris
Naam
Bakken
Verkopen
Broodjes vullen
Product
–
–
•
Adres
Uitbreiden
In dienst nemen
Doorsnede
Ingrediënt
–
–
Houdbaarheidsdatum
Verrotten
• Associaties:
– Werknemer  filiaal
• Inhuren
• Eigenaar
– Werknemer  werknemer
• Leiding geven
– Filiaal  Product
• Verkopen
– Product  Ingrediënt
• bevatten
Case 3: Kebab
Werknemer
-
Naam
Salaris
-
Bakken
Verkopen
Broodjes Vullen
1
eigenaar
*
eigendom
*
Filiaal
-
Adres
-
Uitbreiden
In dienst nemen
2..*
1
Let op!!!
(ook *?)
huurt in
2
*
Twijfel…
verkoopt
Baas van
Product
Let op!!!
Dit is fout
-
Kostprijs
-
Bakken
Inhoud
Ingrediënt
*
Turkse Pizza
Broodje
-
1..*
-
Doorsnede
Bevat
3
-
Houdb. datum
-
Verrotten
In beperking schuilt de meester…
Hamerman
1
gooit
*
Hamer
• Een Hamerman gooit meerdere Hamers
• Een hamer wordt gegooid door 1 Hamerman
• Maar…
– Is het voor een Hamer interessant wie hem heeft gegooid?
– Is het voor een Hamerman interessant welke hamers hij
gooit?
Navigabiliteit: UML syntax
• Een associatie heeft een richting. Dat noemen we de
navigabiliteit.
– Welke klasse ‘heeft kennis van’ de andere klasse bij een
associatie.
• Als je kennis van een klasse hebt kun je daarvan methoden
‘aanroepen’ (= gebruiken).
– Dit is iets anders dan de leesrichting
– Tekenen door middel van pijlen en kruisen
Hamerman
1
gooit
*
Hamer
De Hamerman heeft Kennis van de Hamer
De Hamer heeft geen kennis van de Hamerman
Navigabiliteit: UML syntax
• Er zijn meerdere
navigabiliteitsopties
– Bi-directioneel
– Uni-directioneel
– Undefined
• Maar die mag eigenlijk niet
• Regels
– Minstens 1 kant navigeerbaar
(anders geen associatie)
– Zo min mogelijk navigeerbaar
• Zie Workshop 4
A
A
A
Bi-directioneel
Uni-directioneel
ene kant
Uni-directioneel
andere kant
B
B
B
Links ‘Undefined’
A
B
Case 1: Mario
• Geef de navigabiliteit:
Mushroom
0..1
0..1 Zit in
1
1
Mysterieblok
Speler
Speler
0..1
berijdt
berijdt
0..1
Yoshi
Yoshi
Navigabiliteit unaire associatie
• Wat is de navigabiliteit van ‘is vriend van’
– Je bent altijd vriend van elkaar
• Dus bi-directioneel?
2..*
is vriend van
Student
-
code
SLB’er
cijferlijst
• Antwoord: NEE, Unidirectioneel -- Inschrijven
Studeren
Tentamen maken
• Anders ‘2x opslaan’
• ‘Ik heb jou als vriend’
• ‘Ik ben van jou een vriend’
• Regel: Bij gelijkwaardige unaire associatie
(vrienden, buren, broer-zus, etc) altijd unidirectioneel
2..*
Navigabiliteit unaire associatie
• Wat is de navigabiliteit van ‘is baas van’
– Ongelijkwaardige relatie
• Dus uni-directioneel?
0..1
Is baas van
Medewerker
-
Naam
Salaris
Geboortedatum
-
Werken
Luieren
Zeiken
*
• Antwoord: NEE, het kan beide
• Als je weet wie je baas is en je baas weet dat jij
zijn ondergeschikte bent: bi-directioneel
• Als 1 van beide dat niet weet dan uni-directioneel
• Regel: bij ongelijkwaardige associatie: beide kan
Afhankelijkheids-associaties
• Soms is een klasse afhankelijk van een andere
klasse.
– Meestal is dat een deel-geheel relatie.
– De navigabiliteit is vrijwel altijd van ‘geheel’ naar
‘deel’
• Het ‘deel’ wordt geheel gestuurd door het ‘geheel’
– Er zijn 2 varianten:
Computer
Gezicht
Randapparatuur
Neus
Aggregaat
Compositie
Aggregaat
• Het geheel (het aggregaat) ‘bestuurt’ het deel
• Regels:
Geen naam!!
– Het aggregaat kan soms bestaan zonder zijn delen,
soms niet
• Het aggregaat is altijd ‘incompleet’ als een deel mist
– De delen kunnen horen bij meerdere aggregaten
– De delen kunnen bestaan zonder aggregaat
ComputerComputer
*
Randapparatuur
Randapparatuur
*0..3
0..3
0..1
Kassa
*
Compositie
• Het geheel (de compositie) ‘bezit’ het deel.
• Regels:
Altijd 1 !!
– Een compositie kan soms bestaan zonder zijn delen, soms niet
• Een compositie is altijd ‘incompleet’ als een deel mist
–
–
–
–
Een deel kan niet bestaan zonder de compositie
Een deel hoort maar bij 1 compositie
Een deel wordt gemaakt en verwijderd door zijn compositie
Als de compositie verdwijnt moeten ook alle delen verdwijnen
of over ‘gegeven worden’ aan andere compositie
GezichtGezicht
1
X
Neus
11
1
Neus
1
Vliegtuig
1
Case 4: De bank
Een bank heeft een naam en een beurswaarde.
Een bank bestaat uit klanten en filialen, van
klanten weten we een naam en adres, van
filialen een locatie en omzet. Een filiaal bestaat
uit medewerkers met een naam en salaris.
Case 4: De bank
Een bank heeft een naam en een beurswaarde.
Een bank bestaat uit klanten en filialen, van
klanten weten we een naam en adres, van
filialen een locatie en omzet. Een filiaal bestaat
uit medewerkers met een naam en salaris.
Case 4: De bank
• Bank
– Naam
– Beurswaarde
• Filiaal
– Locatie
– Omzet
• Persoon
– Naam
• Klant
– Adres
• Medewerker
– salaris
• Aggregaten
– Bank bestaat uit
klanten
– Filiaal bestaat uit
medewerkers
• Composities
– Bank bestaat uit
Filialen
• Associaties
Case 4: De bank
Bank
-
Klant
Naam
Beurswaarde
-
Adres
*
*
Persoon
1
-
Naam
*
Filiaal
-
Medewerker
Locatie
Omzet
-
1
*
Salaris
Case 5: Beestenboel
Alle dieren kunnen bewegen en ademen. Dieren
zijn ofwel katachtigen ofwel reptielen. Alle
amfibieën hebben een aantal schubben, leggen
eieren, alle katachtigen hebben een aantal
kinderen en geven melk. Reptielen zijn ofwel
een slang, ofwel een hagedis, ofwel een
dinosaurus. De familie katachtigen bestaat uit
tijgers en huiskatten.
Case 5: Beestenboel
Dinosaurus
Dier
-
Ademen
Bewegen
Reptiel
Katachtige
-
Aantal Kinderen
-
Aantal Schubben
-
Melk geven
-
Eieren Leggen
Huiskat
Tijger
Slang
Hagedis
Case 5: Beestenboel
Katachtige
?
Abstracte Klasse: UML Syntax
• Sommigen klassen zijn niet bedoeld
om een object van te maken
– Het is slechts aan handig instrument
om gemeenschappelijkheid te
modelleren
• Dit heet een abstracte klasse
Katachtige
-
Aantal Kinderen
-
Melk geven
– In UML: klasse naam cursief
– Van een abstracte klasse mag je geen
object maken
Case 5: Beestenboel (uitbreiding)
Verschillende dieren bewegen totaal
verschillend. Reptielen bewegen in principe ‘laag
bij de gronds’, behalve slangen, die kruipen.
Katachtigen bewegen ‘erg lichtvoetig’
Uitwerking methodes
• We zagen al in Case 3 (Kebab) dat er in een tekst
soms mogelijke waarden van een attribuut
gegeven worden (inhoud is kip of kalf).
• Soms heb je dit ook met methoden. De
bijbehorende uitleg geeft aan in welke (sub- of
super)klasse een bepaalde methode thuishoort
– In superklasse: overerving
– In superklasse: abstracte methode
– Evengoed ook in kindklasse: polymorphisme
Abstracte Methode: UML Syntax
• “Verschillende dieren bewegen totaal
verschillend”
– De superklasse ‘Dier’ heeft geen idee hoe de
invulling van de methode eruit ziet
• Immers, alle subklasses hebben een totaal
verschillende implementatie.
– Wel weten we dat iedere subklasse kan
bewegen
• Dit heet een Abstracte Methode.
Beide Abstract!!
– Iedere subklasse moet deze methode verplicht
hebben
• Of weer abstract doorgeven naar lagere
subklassen
– Kan alleen in abstracte klasse!
– UML: methodenaam cursief
-
Dier
Ademen
Bewegen
Polymorphisme
• “Reptielen bewegen in principe ‘laag bij de
gronds’, behalve slangen, die kruipen”
• Als het merendeel van de subklassen
eenzelfde implementatie van een methode
heeft, plaats je die in de superklasse
– De afwijkende subklassen overschrijven die
methode dan met een eigen variant.
– Dit heet polymorphisme
– UML: gewoon de methode in de subklasse nog
eens opnemen
Polymorphisme
Dinosaurus
Standaard Methode
Reptiel
Polymorphisme!!
-
Aantal Schubben
-
Eieren Leggen
Bewegen
Detail-afwijking
Slang
-
bewegen
Hagedis
Case 5: Beestenboel
Dinosaurus
Dier
-
Ademen
Bewegen
Reptiel
Katachtige
-
Aantal Kinderen
-
Aantal Schubben
-
Melk geven
Bewegen
-
Eieren Leggen
Bewegen
Huiskat
Tijger
Slang
-
Bewegen
Hagedis
Herhaling
• Associaties hebben een richting: de navigabiliteit
– Dat kan uni- of bi-directioneel
– Let hiermee op bij unaire associaties
• Er bestaan afhankelijkheidsrelaties
– Aggregaat: Deel / geheel, waarbij het deel los kan bestaan
– Compositie: Deel / geheel, waarbij het deel NIET los kan
bestaan
• Van een abstracte klasse kan geen object gemaakt
worden
• Een abstracte methode moet door alle subklassen
worden geïmplementeerd
• Als een subklasse een standaard methode van een
superklasse overschrijft heet dat polymorphisme
Types: UML syntax
• In de meeste programmeertalen hebben
attributen, parameters (variabelen), en
methoden een bepaald type.
– Deze leg je bij het ontwerp vaak al vast…
– … en zie je dus al in het klassendiagram
– De syntax is (methode / variabele)naam : type
Katachtige
-
aantalKids : int
-
geefMelk (minuten: int) : int
bewegen (afstand : double)
Geen void!!
Encapsulatie
• Als klassen met elkaar een associatie hebben
kunnen ze elkaars attributen aanpassen en
Mag Mario deze
elkaars methoden gebruiken.
aanpassen?
Mario
-
levens : int
Spel
1
1
-
Score : int
-
nieuwPunt(punt: int)
Is deelnemer bij
-
spring()
gaDood()
pakItem(deze: Item)
Mag Spel deze
• Het proces van toegang regulerenaanpassen??
heet
Mag
Spel deze methode gebruiken??
encapsulatie
Encapsulatie: UML syntax
• Een attribuut of methode is public:
– Het element kan door elke geassocieerde klasse
aangeroepen of aangepast worden
– Syntax ‘+’
• Een attribuut of methode is private:
– Het element kan alleen door methoden van de eigen
klasse aangeroepen of aangepast worden
– Syntax ‘-’
• Regel: zoveel mogelijk private (zie straks)
– In ieder geval alle attributen
• Een klasse zonder ‘public’s’ is onnuttig.
Encapsulatie: UML syntax
Mario
-
levens : int
Spel
1
1
-
score : int
+
nieuwPunt(punt: int)
Is deelnemer bij
+
-
spring()
gaDood()
pakItem(deze: Item)
Kwaliteit van ontwerp
• Een systeemontwerp
– Is onderdeel van een ontwikkelingscyclus (WS 1)
– Dient als input bij het maken van ‘code’
• Het is belangrijk dat al bij het ontwerp
kwalitatief goede keuzes worden gemaakt.
Ontwerp
Kwaliteitsdoelen
• Software wordt niet 1 keer geschreven en daarna
nooit meer veranderd (zoals een boek)
• Software wordt uitgebreid, aangepast, geupdate,
onderhouden, gecorrigeerd, geport.
• Dit wordt gedaan door verschillende mensen
gedaan op verschillende momenten
– Vaak veel mensen
– Vaak over een lange tijd
• Dit gegeven moet worden ondersteund.
Kwaliteitsdoelen
– Iedere vakman moet binnen
afzienbare tijd begrijpen hoe het
systeem in elkaar zit
• Uitbreidbaarheid (Expandability):
– Het systeem moet makkelijk voorzien
kunnen worden van nieuwe
functionaliteit
• Aanpasbaarheid (adaptability):
– Het systeem moet makkelijk aangepast
kunnen worden aan veranderde
omstandigheden
Begrijpelijkheid
Uitbreidbaarheid
Aanpasbaarheid
Doelen
• Begrijpelijkheid (understandability):
Kwaliteitscriteria
– Naamgeving is dus belangrijk!
– Doel: hoog
Compleetheid
Criteria
• Dit heet compleetheid
(Completeness).
Begrijpelijkheid
Uitbreidbaarheid
Aanpasbaarheid
Doelen
• Een Klasse verricht alle taken
die de naam doet vermoeden
Bankrekening
-
tegoed : double
+
+
opnemen() : double
storten(bedrag : double)
Kwaliteitscriteria
Begrijpelijkheid
Uitbreidbaarheid
Aanpasbaarheid
– Naamgeving is dus belangrijk
• Dit heet uitsluitendheid
(sufficiency)
Bankrekening
– Doel hoog
-
tegoed : double
VerzekeringsBedrag: double
credit : double
+
+
+
+
opnemen() : double
storten(bedrag : double)
checkVerzekering() : double
checkCreditCard() : double
CreditCard
-
credit : double
+
check() : double
Verzekering
-
bedrag : double
+
check() : double
Criteria
Compleetheid
Uitsluitendheid
Doelen
• Een klasse verricht alleen de
taken die de naam doet
vermoeden.
Kwaliteitscriteria
Bankrekening
-
tegoed : double
+
+
+
+
opnemen() : double
storten(bedrag : double)
stortGrootBedrag(bedrag : double)
meerStortingen(bedragen : double[])
X
Compleetheid
Uitsluitendheid
Primitiefheid
Criteria
– Doel: hoog
Begrijpelijkheid
Uitbreidbaarheid
Aanpasbaarheid
Doelen
• Een klasse biedt slechts een
enkele manier om iets te
doen
• Dit heet primitiefheid
(primitiveness).
Kwaliteitscriteria
• Dit heet cohesie (cohesion)
– Doel: hoog
• Ook bij methoden kan je
spreken van cohesie
Compleetheid
Uitsluitendheid
Primitiefheid
Cohesie
Criteria
– Zo’n klasse is makkelijk te
begrijpen en hergebruiken
Begrijpelijkheid
Uitbreidbaarheid
Aanpasbaarheid
Doelen
• Een Klasse modelleert slechts
1 logische taak en alle
methoden ondersteunen dat
doel.
Kwaliteitscriteria
• Indicatie van lage cohesie:
– Grote classes
– Het diagram is een ‘ster’
– Veel public methoden
• Er moet toch gecommuniceerd
worden…
– Acties en namen van andere
klassen in methode-namen
-
score : int
status : GameState
+
+
+
+
+
+
+
+
+
nieuwPunt(punt: int)
pauze()
hervat()
stopVijanden()
startVijanden()
beweegMario()
checkMarioLevend()
maakYoshiWild()
vulMysterieBlokken()
Compleetheid
Uitsluitendheid
Primitiefheid
Cohesie
Criteria
– Een klasse regelt feitelijk alles,
alle andere klassen hebben
weinig verantwoordelijkheid
Spel
– ‘god-class’
Begrijpelijkheid
Uitbreidbaarheid
Aanpasbaarheid
Doelen
• Ultiem voorbeeld van lage
cohesie:
Kwaliteitscriteria
• Als klassen veel van elkaar
weten (en dus gebruiken)
moeten bij aanpassing van 1
klasse veel andere ook worden
aangepast.
• Dit heet koppeling (coupling)
– Doel laag
Compleetheid
Uitsluitendheid
Primitiefheid
Cohesie
Koppeling
Criteria
– Dit is gebruik van methoden
Begrijpelijkheid
Uitbreidbaarheid
Aanpasbaarheid
Doelen
• Een klasse heeft zo weinig
mogelijk ‘kennis’ nodig van
andere klassen
Kwaliteitscriteria
• Kennelijk gebruiken de klassen elkaar
– Veel bi-directionele associaties
• Kennelijk gebruiken deze klassen
elkaar
– Methoden als:
get<AndereKlasse>()
• Kennelijk geeft deze klasse kennis van
een klasse door naar een andere klasse
– Veel public’s
• Kennelijk worden veel methoden door
andere klassen gebruikt.
Compleetheid
Uitsluitendheid
Primitiefheid
Cohesie
Koppeling
Criteria
– Veel associaties
Begrijpelijkheid
Uitbreidbaarheid
Aanpasbaarheid
Doelen
• Indicaties van koppeling:
Kwaliteitscriteria
• Hier gebeurt input (knoppen)
• Hier gebeurt output (bv. PopUp)
• Bi-directionele koppeling naar andere klassen
ligt op de loer
– Bij een spel:
• Een spel kan pauzeren
• Een spel moet resultaten verwerken
(gewonnen / verloren)
• ‘God-class’ lig op de loer (=lage cohesie)
Compleetheid
Uitsluitendheid
Primitiefheid
Cohesie
Koppeling
Criteria
– Bij een grafische interface:
Begrijpelijkheid
Uitbreidbaarheid
Aanpasbaarheid
Doelen
• Bij een eenvoudig systeem zijn de
kwaliteitscriteria relatief makkelijk te
behalen.
• Bij complexere systemen wordt dit
lastiger
Kwaliteitsmethodiek
– Attributen worden uitsluitend door
eigen klasse aangepast (dus private)
RDD
Methodiek
• Dit heet Responsibility Driven
Design (RDD).
• Belangrijk voorbeeld van RDD:
Compleetheid
Uitsluitendheid
Primitiefheid
Cohesie
Koppeling
Criteria
– Heb ik de verantwoordelijkheden goed
verdeeld?
– Is dit inderdaad de
verantwoordelijkheid van deze klasse?
Begrijpelijkheid
Uitbreidbaarheid
Aanpasbaarheid
Doelen
• Aan de criteria kan je het beste
voldoen door je steeds af te vragen:
Dependencies
• Soms is een klasse op een of andere manier
afhankelijk van een andere klasse,
• Maar is er geen sprake van een associatie
– De ene klasse ‘slaat een connectie op’ naar een
andere klasse om hiervan gebruik te maken
• Er is dan sprake van een ‘afhankelijkheid’
ofwel dependency
• Dependencies zijn een lichtere vorm van
koppeling dan associatie
Dependencies: Voorbeelden
De ene klasse is een nieuwere
vorm van de andere
De ene klasse ‘maakt’ (new)
de andere klasse, maar houdt
niet bij welke hij gemaakt
heeft en gebruikt deze klassen
later ook niet meer
De ene klasse gebruikt de
andere klasse als parameter,
maar houdt dit niet bij.
Dependency: UML Syntax
• Een dependency wordt weergegeven door een
gestippelde pijl
• Als er geen tekst bij de pijl staat wordt
aangenomen dat het << use >> is
• Een dependency is in de vorm van een
stereotype: een standaard soort dependency
– Syntax << naam >>
<< parameter >>
Dependencies: stereotypes
• Er zijn drie soorten stereotypes
– Usage: de ene klasse gebruikt de andere klasse
• Komt meeste voor
– Abstractie: de ene klasse heeft te maken met een
andere klasse
– Permissie: de ene ‘eenheid’ staat gebruik toe aan
een andere ‘eenheid’
• Tussen packages, namespaces, etc.
• Hier niet besproken
Dependencies: usage stereotypes
• << use >>: de ene gebruikt de andere op niet
nader gespecificeerde wijze
– Liever niet, tenzij lokale variabele
• << parameter >>: de ene klasse heeft de
andere als parameter in een methode
• <<instantiate >> of << create >>: de ene
klasse maakt een object van de andere
Dependencies: abstractie stereotypes
• << trace >>: beide klassen representeren hetzelfde
concept, maar zitten in een verschillend model /
verschillende fase
• << substitute >>: de ene klasse kan run-time de andere
vervangen
– Gebruiken als gewerkt wordt in talen zonder overerving
• << refine >>: de ene klasse is een verfijndere versie van
een andere die soms wel, soms niet van toepassing is
– Bijvoorbeeld verschillende klassen voor verschillende
optimalisaties
Eigenschappen van multipliciteit
• Soms wil je aan een *-multipliciteit een eigenschap
toekennen
– De lijst moet gesorteerd zijn
– Elk element mag maar 1 keer voorkomen
• Zo’n eigenschap geef je aan dmv { eigenschap}
– Ordered / unordered  sortering
– unique / nonunique  uniciteit
Abstractie
• Soms wil je
– Een simpele interface bieden naar andere
‘componenten’
• Met minder methoden
• Dit is goed voor de begrijpbaarheid
– Niet weten welke klasse een taak voor je
daadwerkelijk gaat uitvoeren
• Oplossing: abstracte klasse
Abstractie
• Maar! Soms wil je
– Verbieden dat de andere ‘componenten’ alle
functionaliteit kunnen gebruiken
– Geen standaard implementatie
• En…
– Soms is er geen natuurlijke ‘overerving’
• Oplossing: interface
Interface: UML Syntax
<< interface >>
KoffieHaler
+ koffieHalen()
Directeur
gebruikt
• Een interface is een set aan
methoden
die
worden door
+ geïmplementeerd
leidingGeven()
*
andere klassen
interface
– Deze klassen kunnen sub-klassen zijn
van een andere klasse
Stippellijn
– Een interface heeft geen
implementatie
van methoden
– Een interface heeft geen attributen
– Van eenweet
interface
kunnen geen objecten
Directeur
niet (en
worden aangemaakt.
interesseert ook niet) wie er koffie
– Een implementerende klasse moet alle
haalt,interface
ALS het maar
gebeurt.
methoden
implementeren
De interface garandeert dit. Run• Een interface
biedt
functionaliteit
Student
implementeert
de aan
time
kan
in
dit
geval
student
de
andere klassen
door (nog
niet bekende)
verplichte
methode
klus
uitvoeren
klassen die hem implementeren
1
Student
-
Code
cijferlijst
-
koffieHalen()
Studeren
Tentamen maken
Voorbeeld toepassing interface
Gebruikers van de database
kunnen zich beperken tot deze
interface. De interne werking
hoeven ze niet te weten en
mogen ze ook niet gebruiken
Voorbeeld toepassing interface
eigen events (observer)
elke gebeurtenis
het
Het Bij
interesseert
Accountroept
niet OF,
Een
Facebook
account
account
notifyKlassen
aan.
HOEVEEL
& WELKE
verschillende
Dit zijnluisteren
degenereert
verschillende
events
Hierin
wordt
van
elke
luisteraaris (in
naar events.
Hiervoor
‘gebeurtenissen’
(events).
listeners)
methode
een
interface
ergde
geschikt.
Later
Verschillende
klassen
kunnen
faceBookEvent
aangeroepen.
Deze
kunnen
nu nog onbekende
klassen
want
al
deze
zich
aanmelden
om
hierop
te
ookbestaat,
luisteraar
worden
alsklassen
ze de
implementeren
de interface
reageren.
methode
maar
implementeren
NB: in het echt bestaat dit
systeem natuurlijk niet. Al deze
dingen draaien dan op een
Klassen
kunnenapparaat.
zichzelf Het gaat
verschillend
aanmelden of verwijderen
om het idee als
‘luisteraar’

similar documents