N&O: Objectgericht Programmeren

Maat: px
Weergave met pagina beginnen:

Download "N&O: Objectgericht Programmeren"

Transcriptie

1 N&O: Objectgericht Programmeren (in Python) Joost Vennekens

2 N&O Twee aparte onderwerpen Internet en websites (50%) Programmeren in Python (50%) Komen samen in dynamische websites Webpagina als user interface voor Python programma s

3 Waarom objectgericht programmeren? Software is overal Meestal objectgericht Gebruiken, begrijpen, meedenken Doen van complexe berekeningen Automatiseren van taken Objectgerichte bibliotheken in Python

4 Doelstellingen Begrijpen en meedenken -> Hoorcolleges Met ook al veel aandacht voor Python code Op slide Live Oefening Programma s schrijven -> Practica

5 Evaluatie Begrijpen en meedenken Multiple choice vragen op examen (32%) Programma s schrijven Permanente evaluatie in practica (20%) Schriftelijke oefening op examen (48%)

6 Motivatie Programmeren is moeilijk

7 Waarom? Complexiteit kloc (1000 lijnen code)

8

9 Waarom? Complexiteit Margeret Hamilton with source code for Apollo space program kloc (1000 lijnen code)

10 Oude oplossing Datastructuren Gegevens bijhouden Functies Gegevens manipuleren Code opsplitsen! Zoals wiskundige stelling: wat onafhankelijk van hoe!

11 Bijvoorbeeld Datastructuur Verhouding ingredienten Functie Hoeveel gin per tonic

12 Bijvoorbeeld Datastructuur gintonic = { "gin": 0.33, "tonic": 0.67 } Functie def ginpertonic(data, tonic): cocktail = tonic / data["tonic"] gin = cocktail * data["gin"] return gin

13 Bijvoorbeeld Datastructuur gintonic2 = { "gin": 1, "tonic": 2 } Functie def ginpertonic2(data, tonic): totaal = gintonic["gin"] + gintonic["tonic"] cocktail = tonic / gintonic["tonic"] gin = cocktail * cocktail["gin"] return gin / totaal

14 Maar let op! Datastructuur gintonic2 = { "gin": 1, "tonic": 2 } Functie def ginpertonic(data, tonic): cocktail = tonic / data["tonic"] gin = cocktail * data["gin"] return gin

15 RIP ( ) -$

16 (Nieuwe) oplossing Datastructuren Gegevens bijhouden Functies Objecten Gegevens manipuleren

17 Object = Gegevens + Gedragen = Kennen + Kunnen

18 ± het idee gintonic = { "gin": 0.33, "tonic": 0.67, "gpt": ginpertonic1 } def ginpertonic1(data, tonic): cocktail = tonic / gintonic["tonic"] gin = cocktail * cocktail["gin"] return gin

19 ± het idee gintonic = { "gin": 1, "tonic": 2, "gpt": ginpertonic2 } def ginpertonic2(data, tonic): totaal = gintonic["gin"] + gintonic["tonic"] cocktail = tonic / gintonic["tonic"] gin = cocktail * cocktail["gin"] return gin / totaal

20 Voordeel gintonic = { "gin": 1, "tonic": 2, "gtp": ginpertonic2 } gintonic["gtp"](gintonic, 20) Zoals wiskundige stelling: wat onafhankelijk van hoe! gintonic = { "gin": 0.33, "tonic": 0.67, "gtp": ginpertonic1 } gintonic["gtp"](gintonic, 20)

21 Demo

22 Demo: wenkbrauw Als PLOTS_GELUID dan HOOG Als LIEF_GELUID dan LAAG Als BOOS_GELUID dan LAAG

23 Demo: oog Als PLOTS_GELUID dan GROOT Als LIEF_GELUID dan GROOT Als BOOS_GELUID dan KLEIN

24 Demo: mond Als PLOTS_GELUID dan OPEN Als LIEF_GELUID dan OMHOOG Als BOOS_GELUID dan OMLAAG

25 Lessen uit demo Verschillende onderdelen (objecten) Eigen toestand (attributen) Eigen algoritme (methodes) Verschillende soorten onderdelen (klassen) Zelfde soort zelfde attributen en methodes Geen centrale intelligentie, maar emergent gedrag elke component weet wat te doen

26 Illustratie Object aanmaken Attributen toevoegen en opvragen Object kan verschillende namen hebben

27 Object met externe functie class Rechthoek: pass x = Rechthoek() x.breedte = 4 x.hoogte = 5 def oppervlakte(rechthoek): return (rechthoek.breedte * rechthoek.hoogte) print oppervlakte(x)

28 Methode = functie in klasse class Rechthoek: def oppervlakte(zelf): return (zelf.breedte * zelf.hoogte) x = Rechthoek() x.breedte = 4 x.hoogte = 5 print x.oppervlakte()

29 Methode = functie in klasse class Vierkant: def oppervlakte(zelf): return zelf.lengte ** 2 x = Vierkant() x.lengte = 4 print x.oppervlakte()

30 class Rechthoek: def oppervlakte(zelf): return zelf.breedte * zelf.hoogte class Vierkant: def oppervlakte(zelf): return zelf.lengte ** 2 x = Rechthoek() x.breedte = 4 x.hoogte = 5 y = Vierkant() y.lengte = 4 rij = [x,y] for figuur in rij: print figuur.oppervlakte()

31 Illustratie Object initialiseren

32 class Rechthoek: def oppervlakte(zelf): return zelf.breedte * zelf.hoogte x = Rechthoek() x.breedte = 4 x.hoogte = 5 y = Rechthoek() y.breedte = 2 y.hoogte = 3 z = Rechthoek() z.breedte = 10 z.hoogte = 15

33 class Rechthoek: def oppervlakte(zelf): return zelf.breedte * zelf.hoogte def initializeer(zelf,b,h): zelf.breedte = b zelf.hoogte = h x = Rechthoek() x.initializeer(4,5) y = Rechthoek() y.initializeer(2,3) z = Rechthoek() z.initializeer(10,25)

34 class Rechthoek: def oppervlakte(zelf): return zelf.breedte * zelf.hoogte def init (zelf,b,h): zelf.breedte = b zelf.hoogte = h x = Rechthoek(4,5) y = Rechthoek(2,3) z = Rechthoek(10,25)

35 Constructor Wordt automatisch opgeroepen bij aanmaken van object Heeft altijd naam init Magische methode : dinges Conventie: daar alle attributen van object maken

36 Magische methodes int(x) ---> x. int () float(x) ---> x. float () str(x) ---> x. str () print x ---> x. str ()

37 class Rechthoek: def oppervlakte(zelf): return zelf.breedte * zelf.hoogte def init (zelf,b,h): zelf.breedte = b zelf.hoogte = h def str (zelf): return ("Rechthoek van " + str(zelf.breedte) + "x" + str(zelf.hoogte)) def int (zelf): return zelf.oppervlakte() >>> x = Rechthoek(4,5) >>> int(x) 20 >>> str(x) 'Rechthoek van 4x5' >>> print x Rechthoek van 4x5

38 Object afprinten Illustratie

39 Magische attributen >>> x = Rechthoek(1,2) >>> x. class <class main.rechthoek at 0x505930> >>> x. dict {'breedte': 1, 'hoogte': 2} >>> x. class. dict {' int ': <function int at 0x511030>, ' module ': ' main ', ' str ': <function str at 0x5061b0>, 'oppervlakte': <function oppervlakte at 0x503470>, ' doc ': None, ' init ': <function init at 0x5034f0>}

40 En wat met ons probleem? Complexiteit kloc (1000 lijnen code)

41 class Rechthoek: Inkapseling def oppervlakte(zelf): return zelf.breedte * zelf.hoogte def init (zelf,b,h): zelf.breedte = b zelf.hoogte = h def str (zelf): return ("Rechthoek van " + str(zelf.breedte) + "x" + str(zelf.hoogte))

42 class Rechthoek: Inkapseling def oppervlakte(zelf): def init (zelf,b,h): def str (zelf):

43 class Rechthoek: Inkapseling def oppervlakte(zelf): return zelf.breedte * zelf.hoogte def init (zelf,b,h): zelf.breedte = b zelf.hoogte = h def str (zelf): return ("Rechthoek van " + str(zelf.breedte) + "x" + str(zelf.hoogte))

44 class Rechthoek: Inkapseling def oppervlakte(zelf): return zelf.opp def init (zelf,b,h): zelf.breedte = b zelf.opp = b * h def str (zelf): return ("Rechthoek van " + str(zelf.breedte) + "x" + str(zelf.opp / zelf.breedte))

45 Praktisch Slides downloaden: