Ontwerpen Klassendiagrammen
Case 1: Mario Wat zijn de objecten? Dit is eigenlijk verkeerd om; systeem KD, ipv KD systeem Wat zijn de objecten?
Case 1: Mario
Onhandig 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. Rij blokken 2 Vloer Dakje Platform 1 Platform 2 Platform 3 Platform 4 Onhandig
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
Kan beter Handiger Case 1: Mario Munt Mysterieblok Blok Mario Platform locatie waarde Mysterieblok locatie inhoud geefprijs Blok locatie kapot Mario locatie status springen yoshipakken Sterven Stootblok pakmunt Kan beter Platform locatie hoogte breedte Handiger Luigi locatie status springen yoshipakken Sterven Stootblok pakmunt Dak locatie breedte hoogte schuinheid Toad locatie Kleur status springen yoshipakken Sterven Stootblok pakmunt Vloer locatie aantal gaten Yoshi locatie kleur berijder Berijden Steektonguit Eetop raakkwijt Hamer locatie snelheid richting kill Hamerman locatie hoogte lopen springen hamergooien kill Mushroom locatie richting opeten
Overerving Wat valt op (kan handiger)? Een kind: Een volwassene: haarkleur Lengte gewicht lievelingsspeelgoed lopen praten zitten spelen schoolgaan Volwassene baan stemmen autorijden Wat valt op (kan handiger)? Een kind: Heeft een lengte, gewicht, haarkleur, voorkeursspeelgoed Kan lopen, praten, zitten, spelen, schoolgaan Een volwassene: Heeft een lengte, gewicht, haarkleur, baan Kan lopen, praten, zitten, stemmen, autorijden
Overerving UML syntax Kind Volwassene Mens lievelingsspeelgoed schoolgaan spelen Volwassene baan stemmen autorijden Mens haarkleur lengte gewicht lopen praten zitten Een mens is óf een kind óf een volwassene Een kind is een specifiek soort mens Een volwassene is een specifiek soort mens SuperKlasse of parent class Subklasse of Child class
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 Actief Platform Zelfbewegend Hamer Munt Mushroom Speler Vijand Yoshi Dit is niet af! Waar moeten de methoden? Waar moeten de attributen? Er ontbreken klassen Zie oefenopgave Mensen Toads Hamerman
Klassendiagram: procedure Lees de tekst Zelfstandige Naamwoorden: Klasse Attribuut Niet modelleren Werkwoorden Methoden Iets anders
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 WW: Invoeren Inschrijven Toewijzen 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 Student Docent Resultaat naam geboortedatum code SLB’er cijferlijst Inschrijven Studeren Tentamen maken Docent Vestiging SLB studenten Cijfers berekenen Studenten beoordelen Resultaat 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 Hamer Speler Yoshi
Associatie UML syntax Een associatie heeft altijd een beschrijving Dat is een ‘naam’ met leesrichting (midden) óf Een rolverdeling aan beide kanten Hamer Hamerman gooit Yoshi Speler berijdt Hamer Hamerman gooit wapen Speler Hamer slachtoffer
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 1 Hamer Hamerman gooit * Een Hamerman gooit 0 of meer Hamers Een hamer wordt gegooid door 1 Hamerman Yoshi Speler berijdt 0..1 Een Speler berijdt 0 of 1 Yoshi Een Yoshi wordt bereden door 0 of 1 speler 0..1
Klassendiagram: procedure Zelfstandige Naamwoorden: Klasse Attribuut Niet modelleren Werkwoorden Methoden Iets anders 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 WW: Invoeren Inschrijven Toewijzen Tentamen maken 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 1 * beoordeelt * SLB’er 1 Bepaalt * 1..* Eerstejaars Persoon naam geboortedatum Docent Vestiging Cijfers berekenen Studenten beoordelen * 1 beoordeelt * SLB’er 1 Student Code cijferlijst Inschrijven Studeren Tentamen maken Bepaalt Nogmaalslaten zien verschil tussen associatienaam en associatierollen * 1..* Resultaat Blok Toetsdatum cijfer Eerstejaars 1 * Behaalt
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 Iedere klasse heeft minstens 1 associatie Als een klasse verwijst naar een object van een klasse die ook in je diagram staat, is dat nooit een attribuut, maar altijd een associatie X Student code SLB’er cijferlijst Inschrijven Studeren Tentamen maken 2..* is vriend van 1 * Is baas van Docent Vestiging SLB studenten Cijfers berekenen Studenten beoordelen Docent Vestiging SLB studenten Cijfers berekenen Studenten beoordelen Let op multipliciteiten bij unaire associatie. Vertel er wat bij! Zoom in op gelijkwaardige associatie (vrienden, buren, etc)
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 Nu enkelvoud en ordenen… 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 Onderdeel van werkwoord Mogelijke optie voor attribuut Taalconstructie (wel hint!) Nu enkelvoud en ordenen… Hint = superklasse!
Case 3: Kebab Verwijst naar klasse in diagram (Associatie) Filiaal Adres Eigenaar Werknemer Salaris Naam Ondergeschikten Product Kostprijs Broodje Inhoud Turkse Pizza Doorsnede Ingrediënt Houdbaarheidsdatum Verwijst naar klasse in diagram (Associatie) Superklasse!
Case 3: Kebab Verschillend? Filiaal Werknemers Product Broodje 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 Weten Uitbreiden In dienst nemen Hebben Verrotten Bevatten
Case 3: Kebab Associaties: Werknemer filiaal Werknemer werknemer Adres Uitbreiden In dienst nemen Werknemers Salaris Naam Bakken Verkopen Broodjes vullen Product Kostprijs Broodje Inhoud Turkse Pizza Doorsnede Ingrediënt Houdbaarheidsdatum Verrotten Associaties: Werknemer filiaal Inhuren Eigenaar Werknemer werknemer Leiding geven Filiaal Product Verkopen Product Ingrediënt bevatten
Case 3: Kebab Twijfel… Let op!!! (ook *?) Dit is fout 1 * eigenaar Werknemer Naam Salaris Bakken Verkopen Broodjes Vullen Filiaal Adres Uitbreiden In dienst nemen eigenaar eigendom * 2..* 1 huurt in * 2 verkoopt 1..* Baas van Product Kostprijs Bakken Ingrediënt Houdb. datum Verrotten Fout: niet iedere werknemer is baas. Dit moet * zijn. Rode associatie: zou eventueel ook uit de tekst kunnen komen: verkoopt, bakt, vult * Bevat 3 Broodje Inhoud Turkse Pizza Doorsnede
In beperking schuilt de meester… Hamer Hamerman gooit 1 * 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 Hamer Hamerman gooit 1 * 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 Bi-directioneel A B Uni-directioneel ene kant A B Uni-directioneel andere kant A B Links ‘Undefined’ A B
Case 1: Mario Geef de navigabiliteit: Mysterieblok Mushroom Zit in Mysterieblok Mushroom Zit in 0..1 0..1 1 1 Yoshi Speler berijdt Yoshi Speler berijdt 0..1 0..1 0..1 0..1
Navigabiliteit unaire associatie X Wat is de navigabiliteit van ‘is vriend van’ Je bent altijd vriend van elkaar Dus bi-directioneel? Student code SLB’er cijferlijst Inschrijven Studeren Tentamen maken 2..* is vriend van Antwoord: NEE, Unidirectioneel 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 uni-directioneel
Navigabiliteit unaire associatie Wat is de navigabiliteit van ‘is baas van’ Ongelijkwaardige relatie Dus uni-directioneel? Medewerker Naam Salaris Geboortedatum Werken Luieren Zeiken 0..1 * Is baas van 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: Randapparatuur Computer Neus Gezicht Aggregaat Compositie
Aggregaat Het geheel (het aggregaat) ‘bestuurt’ het deel Regels: 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 Geen naam!! Randapparatuur Computer * 0..3 Kassa 0..1 Randapparatuur Computer Randapparatuur Computer * 0..3
X Compositie Het geheel (de compositie) ‘bezit’ het deel. Regels: 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 Altijd 1 !! X Neus Gezicht Vliegtuig 1 Neus Gezicht Neus Gezicht 1 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 Aggregaten Composities Associaties Naam Beurswaarde Filiaal Locatie Omzet Persoon Klant Adres Medewerker salaris Aggregaten Bank bestaat uit klanten Filiaal bestaat uit medewerkers Composities Bank bestaat uit Filialen Associaties
Case 4: De bank * * 1 * * 1 Bank Klant Persoon Filiaal Medewerker Naam Beurswaarde Klant Adres * * Persoon Naam 1 * Filiaal Locatie Omzet Medewerker Salaris 1 *
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 Katachtige Reptiel Huiskat Tijger Ademen Bewegen Katachtige Aantal Kinderen Melk geven Reptiel Aantal Schubben 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 In UML: klasse naam cursief Van een abstracte klasse mag je geen object maken Katachtige Aantal Kinderen Melk geven
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. Iedere subklasse moet deze methode verplicht hebben Of weer abstract doorgeven naar lagere subklassen Kan alleen in abstracte klasse! UML: methodenaam cursief Beide Abstract!! 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 Standaard Methode Polymorphisme!! Detail-afwijking Slang bewegen Hagedis Reptiel Aantal Schubben Eieren Leggen Bewegen Dinosaurus Standaard Methode Polymorphisme!! Detail-afwijking
Case 5: Beestenboel Dinosaurus Dier Katachtige Reptiel Huiskat Tijger Ademen Bewegen Katachtige Aantal Kinderen Melk geven Bewegen Reptiel Aantal Schubben 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 elkaars methoden gebruiken. Het proces van toegang reguleren heet encapsulatie Mag Mario deze aanpassen? Mario levens : int spring() gaDood() pakItem(deze: Item) Spel Score : int nieuwPunt(punt: int) 1 1 Mag Spel deze aanpassen?? Is deelnemer bij Mag Spel deze methode gebruiken??
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 spring() gaDood() pakItem(deze: Item) Spel score : int nieuwPunt(punt: int) 1 1 Is deelnemer bij
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 Begrijpelijkheid (understandability): 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
Kwaliteitscriteria Een Klasse verricht alle taken die de naam doet vermoeden Naamgeving is dus belangrijk! Dit heet compleetheid (Completeness). Doel: hoog Begrijpelijkheid Uitbreidbaarheid Aanpasbaarheid Doelen Compleetheid Criteria Bankrekening tegoed : double opnemen() : double storten(bedrag : double) Bankrekening tegoed : double opnemen() : double
Kwaliteitscriteria Een klasse verricht alleen de taken die de naam doet vermoeden. Naamgeving is dus belangrijk Dit heet uitsluitendheid (sufficiency) Doel hoog Begrijpelijkheid Uitbreidbaarheid Aanpasbaarheid Doelen Compleetheid Uitsluitendheid Criteria Bankrekening tegoed : double opnemen() : double storten(bedrag : double) CreditCard check() : double credit : double Verzekering bedrag : double Bankrekening tegoed : double VerzekeringsBedrag: double credit : double opnemen() : double storten(bedrag : double) checkVerzekering() : double checkCreditCard() : double
Kwaliteitscriteria Een klasse biedt slechts een enkele manier om iets te doen Dit heet primitiefheid (primitiveness). Doel: hoog Begrijpelijkheid Uitbreidbaarheid Aanpasbaarheid Doelen Compleetheid Uitsluitendheid Primitiefheid Criteria Bankrekening tegoed : double opnemen() : double storten(bedrag : double) Bankrekening tegoed : double opnemen() : double storten(bedrag : double) stortGrootBedrag(bedrag : double) meerStortingen(bedragen : double[]) X
Kwaliteitscriteria Een Klasse modelleert slechts 1 logische taak en alle methoden ondersteunen dat doel. Zo’n klasse is makkelijk te begrijpen en hergebruiken Dit heet cohesie (cohesion) Doel: hoog Ook bij methoden kan je spreken van cohesie Begrijpelijkheid Uitbreidbaarheid Aanpasbaarheid Doelen Compleetheid Uitsluitendheid Primitiefheid Cohesie Criteria
Kwaliteitscriteria Ultiem voorbeeld van lage cohesie: Een klasse regelt feitelijk alles, alle andere klassen hebben weinig verantwoordelijkheid ‘god-class’ Begrijpelijkheid Uitbreidbaarheid Aanpasbaarheid Doelen Compleetheid Uitsluitendheid Primitiefheid Cohesie Criteria Spel score : int status : GameState nieuwPunt(punt: int) pauze() hervat() stopVijanden() startVijanden() beweegMario() checkMarioLevend() maakYoshiWild() vulMysterieBlokken() spuugUitMushroom() 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
Kwaliteitscriteria Een klasse heeft zo weinig mogelijk ‘kennis’ nodig van andere klassen Dit is gebruik van methoden 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 Begrijpelijkheid Uitbreidbaarheid Aanpasbaarheid Doelen Compleetheid Uitsluitendheid Primitiefheid Cohesie Koppeling Criteria
Kwaliteitscriteria Indicaties van koppeling: Veel associaties 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. Begrijpelijkheid Uitbreidbaarheid Aanpasbaarheid Doelen Compleetheid Uitsluitendheid Primitiefheid Cohesie Koppeling Criteria
Kwaliteitscriteria Bij een eenvoudig systeem zijn de kwaliteitscriteria relatief makkelijk te behalen. Bij complexere systemen wordt dit lastiger Bij een grafische interface: 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) Begrijpelijkheid Uitbreidbaarheid Aanpasbaarheid Doelen Compleetheid Uitsluitendheid Primitiefheid Cohesie Koppeling Criteria
Kwaliteitsmethodiek Aan de criteria kan je het beste voldoen door je steeds af te vragen: Heb ik de verantwoordelijkheden goed verdeeld? Is dit inderdaad de verantwoordelijkheid van deze klasse? Dit heet Responsibility Driven Design (RDD). Belangrijk voorbeeld van RDD: Attributen worden uitsluitend door eigen klasse aangepast (dus private) Begrijpelijkheid Uitbreidbaarheid Aanpasbaarheid Doelen Compleetheid Uitsluitendheid Primitiefheid Cohesie Koppeling Criteria RDD Methodiek
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 Oplossing: abstracte klasse 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 En… Oplossing: interface 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 leidingGeven() gebruikt * 1 Een interface is een set aan methoden die geïmplementeerd worden door andere klassen Deze klassen kunnen sub-klassen zijn van een andere klasse Een interface heeft geen implementatie van methoden Een interface heeft geen attributen Van een interface kunnen geen objecten worden aangemaakt. Een implementerende klasse moet alle interface methoden implementeren Een interface biedt functionaliteit aan andere klassen door (nog niet bekende) klassen die hem implementeren interface Stippellijn Directeur weet niet (en interesseert ook niet) wie er koffie haalt, ALS het maar gebeurt. De interface garandeert dit. Run-time kan in dit geval student de klus uitvoeren Student Code cijferlijst koffieHalen() Studeren Tentamen maken Student implementeert de verplichte methode
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) Het interesseert Account niet OF, HOEVEEL & WELKE Klassen luisteren naar events. Hiervoor is een interface erg geschikt. Later kunnen nu nog onbekende klassen ook luisteraar worden als ze de methode maar implementeren Bij elke gebeurtenis roept het account notify aan. Hierin wordt van elke luisteraar (in listeners) de methode faceBookEvent aangeroepen. Deze bestaat, want al deze klassen implementeren de interface Een Facebook account genereert verschillende ‘gebeurtenissen’ (events). Verschillende klassen kunnen zich aanmelden om hierop te reageren. Dit zijn de verschillende events Klassen kunnen zichzelf aanmelden of verwijderen als ‘luisteraar’ NB: in het echt bestaat dit systeem natuurlijk niet. Al deze dingen draaien dan op een verschillend apparaat. Het gaat om het idee