De presentatie wordt gedownload. Even geduld aub

De presentatie wordt gedownload. Even geduld aub

Richtlijnen Specificaties Multiple inheritence H9: Klasse Ontwerp.

Verwante presentaties


Presentatie over: "Richtlijnen Specificaties Multiple inheritence H9: Klasse Ontwerp."— Transcript van de presentatie:

1 Richtlijnen Specificaties Multiple inheritence H9: Klasse Ontwerp

2 2 SchetsPlus... doe ik het goed ? SchetsPlus... doe ik het goed ?

3 Hoe maak ik goede klassen ? We gaan kijken naar: algemene ontwerp-richtlijnen software metric Complement: style-gidsen, tips, best practices, kookboeken, enz. Sun’s Java Coding Style Guide Ambler, the Elements of Java Style 3

4 Richtlijnen Structuur is belangrijk, wat je niet wil: complex  fouten, onderhoudkost star Optimaliseer : encapsulatie inheritence cohesie koppeling 4

5 Cohesie Een “module” is cohesief als het een set van sterk aan elkaar gerelateerd “functionaliteiten” aanbiedt. 5 Persoon getGewicht() getLengte() Persoon getGewicht() getLengte() Persoon getGewicht() getLengte() getVrienden() Persoon getGewicht() getLengte() getVrienden() Persoon getGewicht() getLengte() addInAdresBoek(aboek) Persoon getGewicht() getLengte() addInAdresBoek(aboek)

6 Koppeling Er is een koppeling tussen modules A en B als een van de andere afhankelijk is. Voorbeelden: datakoppeling globale-var koppeling 6 f() {... u.g(x)... } m 1,m 2 via een static attribuut C 1, C 2 via een package-private attribuut m 1,m 2 via een static attribuut C 1, C 2 via een package-private attribuut

7 Koppeling Pathologisch in C++ heb je ook friends. 7 Drank - suiker : int - water : int + zoet() : int + roer() Drank - suiker : int - water : int + zoet() : int + roer() Mixer if (drank.zoet() > 10) { drank.water++ ; drank.roer() ; }

8 Koppeling In OO ook door: Associatie / navigatie Verse objecten in methode Via inheritence Vaak spanningveld tussen koppeling en de andere aspecten: maak A subklasse van B  koppeling verhoogt cohesie met delegatie  koppeling 8

9 Inheritence koppeling 9 Persoon getKinderen() Persoon getKinderen() Klant Drank mixMetMelk() // concreet abstract mix() Drank mixMetMelk() // concreet abstract mix() Thee Koffie

10 Demeter Principe Ian Holland, 1987 “Zorg dat objecten alleen met vrienden praten.” Delegeer: 10 Vliegtuig bagageGewicht() : int Persoon naam vervoert * Tas gewicht heeft* Vliegtuig bagageGewicht() : int Persoon naam tassenGewicht() vervoert* Tas gewicht heeft* ten koste van de cohesie van Persoon.

11 Connascance Page-Jones, Letterlijk: tegelijkertijd geboren. Page-Jones: Klassen C en D zijn connascent als het mogelijk is om C aan te passen die een aanpassing van D dwingt.  koppeling! 11

12 Uit project management perspectief Software metriek  complexiteit indicatoren Om strategisch te beslissen dat bepaalde delen van de software een risico factor zijn, en dat reorganisatie nodig is. Voor programmeurs ook nuttig als richtlijnen. 12

13 Voorbeeld Metriek : + Uit te rekenen (en goedkoop)  tools! - abstract Zoals, #regels Nog meer? Traditionele metrieken Halstead McCabe Oviedo OO metriek “de” metriek bestaat niet  ze zijn allemaal indicatoren. 13

14 Halstead Complexiteit: moeite om code te lezen E = D * V 14 x = x + x ; x++ x = x + y ; z++ (alleen ter info)

15 McCabe Het aantal lineair onafhankelijke paden in je programma. 15 int P() { if (...) return 100 else return 0 } Control Flow Graph (CFG)

16 McCabe

17 Oviedo Splits programma in sequentiële blokken interacties tussen elementen in een blok voegen niets aan complexiteit. afhankelijkheden tussen blokken wel. Voorbeeld: 17 P(int x, int y) { if (y>0) x = 0 ; else x = 1 ; return x } (y>0) ; x = 0 (~y>0) ; x = 1 return x DF = 2 DF(P) = 6

18 OO metriek Voor OO willen we ook indicatie hebben over structurele complexiteit van je klassen. Chen & Lu, 1993: Encapsulatie Koppeling Inheritence Cohesie 18

19 Encapsulatie (P) Idee: Methode met minder argumenten is abstracter Simpel vs complex parameters, bijvoorbeeld: P = som van de complexiteit van de argumenten (van pub. methodes) in C. 19 TypeComplexiteit waarde boolean, int0 double2 object6-9

20 Koppeling (Cp) Idee C gebruikt D  1x koppeling C wordt door D gebruikt  1x koppeling wederzijde koppeling  lastig  telt als extra Cp = som van boven. 20

21 Cohesie Co Hoe weten we welke methode bij elkaar horen?? Idee: methodes met dezelfde type signatuur horen vaak bij elkaar. Chen en Lu  ook “sub” signatuur. m1(int,Vervoer) ~ m2(Vervoer,int,Persoon) 21 Vervoer + versnel(real) + addPassagier(Persoon) + swapPassagiers(Persoon, Persoon) + addPassagiers (Collection ) Vervoer + versnel(real) + addPassagier(Persoon) + swapPassagiers(Persoon, Persoon) + addPassagiers (Collection ) Co = G / N = 0.75

22 Inheritence H Inheritence is goed (code hergebruik), maar je code wordt ook minder expliciet  in zekere zin ook fout gevoelig. H is een meting van inheritence complexiteit. Som van: # methodes inheritence afstand # direct superklassen. # subklassen 22

23 JHawk 23

24 Klasse specificatie Meer kun je niet met klasse diagram uitdrukken... Een klant is een mj als zijn/haar leeftijd ≤ 18 De klant die voor een mj verantwoordelijk is, is zelf geen mj.. 24 Klant Naam Leeftijd Klant Naam Leeftijd Minderjarig bonus Minderjarig bonus Videotheek DVD titel leeftijdgrens DVD titel leeftijdgrens *leent < is verantwoordelijk voor

25 Klasse invariant Een klasse invariant van C is een constraint op de attributen van de objecten van C. Anders zit een object in een verkeerde/onveilig toestand. Het gaat over de stabiele toestand van een object (dus niet als een operatie nog bezig is met het object). 25 Minderjarig Bob 10 Minderjarig Bob 10 Minderjarig Octo 30 Minderjarig Octo 30 De leeftijd van een mj is  18.

26 Klasse invariant Maar indirect gaat het eigenlijk ook over associaties... Hoe belangrijk?  erg belangrijk. 26 Minderjarig Bob 10 Minderjarig Bob 10 DVD Sneeuwwit 0+ DVD Sneeuwwit 0+ DVD Star Trek 10+ DVD Star Trek 10+ DVD Kill Bill 12+ DVD Kill Bill 12+ leent

27 Hoe druk je dat uit? Met “predicaten” zoals in Logica : “Object Constraint Language” (OCL)  onderdeel van UML. 27 (forall x : Minderjarig  x.leeftijd  18) context x : Minderjarig inv: x.leeftijd  18 context x : Minderjarig inv: x.leeftijd  18

28 Navigatie in OCL 28 Klant Naam Leeftijd Klant Naam Leeftijd DVD titel leeftijdgrens DVD titel leeftijdgrens *leent > dvdslener context dvd : DVD inv: dvd.lener.leeftijd  dvd.leeftijdgrens context dvd : DVD inv: dvd.lener.leeftijd  dvd.leeftijdgrens context x : Klant inv: x.leeftijd  x.dvds.leeftijdgrens context x : Klant inv: x.leeftijd  x.dvds.leeftijdgrens levert een verzameling terug!

29 Collecties in OCL Zoals Set en Sequence Operatoren zoals: size(), sum(), isEmpty() includes(x) forAll(...), exists(...), select(…) Eigenaardig syntax: u  isEmpty() u  includes(x) 29

30 Voorbeeld 30 Klant Naam Leeftijd Klant Naam Leeftijd DVD titel leeftijdgrens DVD titel leeftijdgrens *leent dvdslener context x : Klant inv: x.leeftijd  x.dvds.leeftijdgrens context x : Klant inv: x.leeftijd  x.dvds.leeftijdgrens inv: x.dvds  forall (dvd | x.leeftijd  dvd.leeftijdgrens)

31 Filter  select operatie 31 Klant Naam Leeftijd Klant Naam Leeftijd DVD titel premium : boolean DVD titel premium : boolean *leent dvdslener Je mag slechts één permium DVD lenen. context x : Klant inv: x.dvds  select (dvd | dvd.premium = true)  size() ≤ 1 context x : Klant inv: x.dvds  select (dvd | dvd.premium = true)  size() ≤ 1

32 Methode specificeren 32 Klant inschrijf() leen(d) getLeenLimiet() Klant inschrijf() leen(d) getLeenLimiet() forall x : Klant  { true } x.inschrijf() { x.dvds =  } context x : Klant:: inschrijf() pre: true post: x.dvds  isEmpty() context x : Klant:: inschrijf() pre: true post: x.dvds  isEmpty() declaratief ! Inschrijf() dient de collectie van gelende dvds op leeg te zetten Pre/Post spec, pseudo code, geen OCL.

33 Mix in specificatie met “query” 33 Klant inschrijf() leen(d) getLeenLimiet() Klant inschrijf() leen(d) getLeenLimiet() Je mag niet meer dan je limiet lenen. context x : Klant:: leen(d) pre: x.dvds  size() + 1 ≤ x.getLeenLimiet() post: x.dvds =  insert(d) context x : Klant:: leen(d) pre: x.dvds  size() + 1 ≤ x.getLeenLimiet() post: x.dvds =  insert(d) markeer als ‘isQuery’, maar alleen als side-effect vrij!

34 Multiple inheritence Krachtig ! Je kunt makkelijk verschillende features erven. Talen met MI  C++. Eiffel, Python Om uit te kijken  diamantprobleem Als je toch in Java wil implementeren … 34 Product ID Naam Prijs Product ID Naam Prijs Koffie GroteBestelling koopGroot(n) GroteBestelling koopGroot(n) ImportGoed invoerBelasting() ImportGoed invoerBelasting()

35 Feature clash… Geen echte issue. Eiffel  renaming 35 Werknemer werk() Werknemer werk() Muzikant Artiest werk() Artiest werk() Welke werk() wordt bedoelt in Muzikant ? (soms de ene soms de andere) class Muzikant inherit Werknemer rename werk as werk1 Artiest rename werk as werk2 feature … end class Muzikant inherit Werknemer rename werk as werk1 Artiest rename werk as werk2 feature … end

36 Diamantprobleem Een muzikant kan in principe 2x namen en leeftijden erven. leefdtijd  onzinnig  merge tot 1x naam  misschien wil je een echte naam en een artiestnaam. Ambigu  compiler kan deze niet zelf beslissen… 36 Werknemer Artiest Muzikant Persoon Naam Leeftijd Persoon Naam Leeftijd

37 Inheritence vs associatie 37 Artiest Naam Werk() Artiest Naam Werk() Muzikant Artiest Naam Werk() Artiest Naam Werk() W W MIDelegatie Feature ervenJa Is M ook een A ?JaNee

38 Simuleren met assoc + interface 38 Artiest Naam Werk() Artiest Naam Werk() Muzikant Artiest Naam Werk() Artiest Naam Werk() W W W W Artiest (Interface) Werk() Artiest (Interface) Werk() Gedoe.. Als MI essentieel in je ontwerp is, implementeer ook in een MI taal. Anders haal MI uit je ontwerp. Andere overweging: persistence.


Download ppt "Richtlijnen Specificaties Multiple inheritence H9: Klasse Ontwerp."

Verwante presentaties


Ads door Google