H9 klasse ontwerp
Download
1 / 38

H9: Klasse Ontwerp - PowerPoint PPT Presentation


  • 109 Views
  • Uploaded on

H9: Klasse Ontwerp. Richtlijnen Specificaties Multiple inheritence. SchetsPlus... doe ik het goed ?. Hoe maak ik goede klassen ?. We gaan kijken naar: algemene ontwerp-richtlijnen software metric

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' H9: Klasse Ontwerp' - uriah-hood


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
H9 klasse ontwerp

H9: Klasse Ontwerp

Richtlijnen

Specificaties

Multiple inheritence


SchetsPlus...

doe ik het goed ?


Hoe maak ik goede klassen
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 GuideAmbler, the Elements of Java Style


Richtlijnen
Richtlijnen

  • Structuur is belangrijk, wat je niet wil:

    • complex  fouten, onderhoudkost

    • star

  • Optimaliseer :

    • encapsulatie

    • inheritence

    • cohesie

    • koppeling


Cohesie
Cohesie

  • Een “module” is cohesiefals het een set van sterk aan elkaar gerelateerd “functionaliteiten” aanbiedt.

Persoon

getGewicht()

getLengte()

Persoon

getGewicht()

getLengte()

getVrienden()

Persoon

getGewicht()

getLengte()

addInAdresBoek(aboek)


Koppeling
Koppeling

  • Er is een koppeling tussen modules A en B als een van de andere afhankelijk is.Voorbeelden:

    • datakoppeling

    • globale-var koppeling

  • f() { ... u.g(x) ... }

  • m1,m2 via een static attribuut

  • C1, C2 via een package-private attribuut


Koppeling1
Koppeling

  • Pathologischin C++ heb je ook friends.

Mixer

if (drank.zoet() > 10) {

drank.water++ ;

drank.roer() ;

}

Drank

- suiker : int

- water : int

+ zoet() : int

+ roer()


Koppeling2
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


Inheritence koppeling
Inheritence koppeling

Drank

mixMetMelk() // concreet

abstract mix()

Persoon

getKinderen()

Thee

Klant

Koffie


Demeter principe
Demeter Principe

  • Ian Holland, 1987“Zorg dat objecten alleen met vrienden praten.”

  • Delegeer:

Vliegtuig

bagageGewicht() : int

Persoon

naam

heeft

*

Tas

gewicht

vervoert

*

Persoon

naam

tassenGewicht()

Vliegtuig

bagageGewicht() : int

heeft

*

Tas

gewicht

vervoert

*

ten koste van de cohesie van Persoon.


Connascance
Connascance

  • Page-Jones, 1992.

  • 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!


Uit project management perspectief
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.


Voorbeeld
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.


Halstead
Halstead

  • Complexiteit: moeite om code te lezen E = D * V

x = x + x ; x++

x = x + y ; z++

(alleen ter info)


Mccabe
McCabe

  • Het aantal lineair onafhankelijke paden in je programma.

int P() {

if (...) return 100

else return 0

}

0

1

2

Control Flow Graph (CFG)


Mccabe1
McCabe

0

4

1

3

2

5


Oviedo
Oviedo

  • Splits programma in sequentiële blokken

    • interacties tussen elementen in een blok voegen niets aan complexiteit.

    • afhankelijkheden tussen blokken wel.

  • Voorbeeld:

P(int x, int y) {

if (y>0) x = 0 ; else x = 1 ;

return x

}

(y>0) ; x = 0

(~y>0) ; x = 1

DF = 2

DF = 2

return x

DF(P) = 6

DF = 2


Oo metriek
OO metriek

  • Voor OO willen we ook indicatie hebben over structurele complexiteit van je klassen.

  • Chen & Lu, 1993:

    • Encapsulatie

    • Koppeling

    • Inheritence

    • Cohesie


Encapsulatie p
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.


Koppeling cp
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.


Cohesie co
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)

Vervoer+ versnel(real)+ addPassagier(Persoon)+ swapPassagiers(Persoon, Persoon)

+ addPassagiers (Collection<Persoon>)

Co = G / N = 0.75


Inheritence h
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



Klasse specificatie
Klasse specificatie

Videotheek

  • 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.

      .

Minderjarig

bonus

Klant

Naam

Leeftijd

DVD

titel

leeftijdgrens

leent

*

<is verantwoordelijk voor


Klasse invariant
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).

Minderjarig

Octo

30

Minderjarig

Bob

10

De leeftijd van een mj is  18.


Klasse invariant1
Klasse invariant

  • Maar indirect gaat het eigenlijk ook over associaties...

  • Hoe belangrijk?  erg belangrijk.

DVD

Sneeuwwit

0+

leent

Minderjarig

Bob

10

DVD

Star Trek

10+

DVD

Kill Bill

12+


Hoe druk je dat uit
Hoe druk je dat uit?

  • Met “predicaten” zoals in Logica :

  • “Object Constraint Language” (OCL)  onderdeel van UML.

(forallx : Minderjarig  x.leeftijd  18)

context x : Minderjarig

inv: x.leeftijd  18


Navigatie in ocl
Navigatie in OCL

Klant

Naam

Leeftijd

DVD

titel

leeftijdgrens

leent >

*

lener

dvds

context dvd : DVD

inv: dvd.lener.leeftijddvd.leeftijdgrens

context x : Klant

inv: x.leeftijdx.dvds.leeftijdgrens

levert een verzameling terug!


Collecties in ocl
Collecties in OCL

  • Zoals Set en Sequence

  • Operatoren zoals:

    • size(), sum(), isEmpty()

    • includes(x)

    • forAll(...), exists(...), select(…)

  • Eigenaardig syntax: u  isEmpty() u  includes(x)


Voorbeeld1
Voorbeeld

Klant

Naam

Leeftijd

DVD

titel

leeftijdgrens

leent

*

lener

dvds

context x : Klant

inv: x.leeftijdx.dvds.leeftijdgrens

inv: x.dvds  forall (dvd | x.leeftijddvd.leeftijdgrens)


Filter select operatie
Filter  select operatie

Klant

Naam

Leeftijd

DVD

titel

premium : boolean

leent

*

lener

dvds

Je mag slechts één permium DVD lenen.

contextx : Klant

inv: x.dvds  select (dvd | dvd.premium = true)

size() ≤ 1


Methode specificeren
Methode specificeren

Pre/Post spec, pseudo code, geen OCL.

Klant

inschrijf()

leen(d)

getLeenLimiet()

declaratief !

Inschrijf() dient de collectie van gelende dvds op leeg te zetten

forall x : Klant { true } x.inschrijf() { x.dvds =  }

context x : Klant:: inschrijf()

pre:true

post:x.dvdsisEmpty()


Mix in specificatie met query
Mix in specificatie met “query”

Klant

inschrijf()

leen(d)

getLeenLimiet()

Je mag niet meer dan je limiet lenen.

markeer als ‘isQuery’, maar alleen als side-effect vrij!

context x : Klant:: leen(d)

pre:x.dvds size() + 1 ≤ x.getLeenLimiet()

post:[email protected] insert(d)


Multiple inheritence
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 …

Product

ID

Naam

Prijs

GroteBestelling

koopGroot(n)

ImportGoed

invoerBelasting()

Koffie


Feature clash
Feature clash…

Werknemer

werk()

Artiest

werk()

  • Geen echte issue. Eiffel  renaming

Welke werk() wordt bedoelt in Muzikant ? (soms de ene soms de andere)

Muzikant

class Muzikant inherit Werknemer rename werk as werk1

Artiest rename werk as werk2

feature

end


Diamantprobleem
Diamantprobleem

Persoon

Naam

Leeftijd

  • 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…

Werknemer

Artiest

Muzikant


Inheritence vs associatie
Inheritence vs associatie

W

Artiest

Naam

Werk()

Artiest

Naam

Werk()

Muzikant

Muzikant


Simuleren met assoc interface
Simuleren met assoc + interface

Gedoe ..

Als MI essentieel in je ontwerp is, implementeer ook in een MI taal.

Anders haal MI uit je ontwerp.

Andere overweging: persistence.

W

Artiest

Naam

Werk()

Muzikant

W

Artiest (Interface)

Werk()

Artiest

Naam

Werk()

Muzikant


ad