TDDC74 FÖRELÄSNING 9 ANDERS MÄRAK LEFFLER IDA/HCS 180226
Idag (ADT), OOP i Racket, labb 5 2
Allmän info Duggan. Laboration 4 deadline. Planering framöver Muddy cards (nästa timme) 3
Lite repetition ADT OCH OOP 4
our programs should use data in such a way as to make no assumptions about the data that are not strictly necessary for performing the task at hand. At the same time, a concrete data representation is defined independent of the programs that use the data. The interface between these two parts of our system will be a set of procedures, called selectors and constructors, that implement the abstract data in terms of the concrete representation. ((SICP kap 2.1) 5
Immuterbart data (labb 3) (define (empty-name-db) '()) (define (add-to-db name db) (cons name db)) (define first-movie car) (define rest-movies cdr) > (define my-db (empty-movie-db)) > (add-to-db 'Fiyero my-db) Ny databas skapas. '(Fiyero) > my-db '() Inget ändras. > (set! my-db (add-to-db 'Fiyero my-db)) > my-db '(Fiyero) 6
Muterbar data (queue) (define (make-queue) (mcons 'queue '())) (define (queue-set-content! q content) (set-mcdr! q content)) (define (queue-add q new) [--- kod som ändrar i q --- ]) > (define q (make-queue)) > q {queue} > (queue-add q 'jalal) {queue jalal} > q {queue jalal} Innehållet i q har ändrats! 7
Likheter - skillnader Döljer den konkreta representationen. Inga car/cdr/... At the same time, a concrete data representation is defined independent of the programs that use the data. Olika, specifika objekt (inte en enda global variabel). Kapslar in informationen. Den första mer funktionell. Den andra ändrar faktiskt inuti strukturen. Skillnad mot (set! my-db (add-to-db 'Godfather my-db))? 8
Gemensamt Samma externa uppsättning procedurer för förändring, selektion... 9
(define (present-data structure) (printf "Size: ~a~n" (get-size structure)) (printf "First element: ~a~n" (get-first structure))) > (present-data my-queue-structure) Size: 3 First element: Elphaba 10
(define (present-data structure) (printf "Size: ~a~n" (get-size structure)) (printf "First element: ~a~n" (get-first structure))) > (present-data my-queue-structure) > (present-data my-stack-structure) Size: 5 First element: Galinda En get-size passar alla...? 11
Objekt, gränssnitt Låt beteendet följa med objektet 12
Objekt får meddelanden, agerar 13
Vad get-size betyder definieras hos objektet, inte i någon funktion utanför (som add-to-db, queue-add,...) (define (present-data structure) (printf "Size: ~a~n" (structure 'get-size)) (printf "First element: ~a~n" (structure 'get-first))) > (present-data my-queue-structure) Size: 3 First element: Elphaba OBS! get-size kan se helt olika ut. 14
Exempel (closures) 15
Bankkontot (lätt utökat) (med Rackets objektsystem) 16
Meddelanden, och vad de väntas göra: withdraw <amount> ta ut pengar, returnera nytt saldo deposit <amount> - sätt in pengar, returnera nytt saldo get-balance returnera saldot Getter. Används för att få ut värden. 17
Vad get-size betyder definieras hos objektet, inte i någon funktion utanför (som add-to-db, queue-add,...) (define (present-data structure) (printf "Size: ~a~n" (send structure get-size)) (printf "First element: ~a~n" (send structure get-first))) > (present-data my-queue-structure) Size: 3 First element: Elphaba OBS! get-size kan se helt olika ut. 18
Bankkontots gränssnitt Meddelanden, och vad de väntas göra: withdraw <amount> ta ut pengar, returnera nytt saldo deposit <amount> - sätt in pengar, returnera nytt saldo get-balance returnera saldot Getter. Används för att få ut värden. 19
Utökat bankkonto Arv 20
safe-account%-gränssnitt Som account%, men vi har även withdraw <amount> <pin-attempt> ta ut pengar, om pin-attempt är rätt set-pin! <old-pin> <new-pin> - ändrar PIN-kod Setter (och skapar det med korrekt PIN) 21
Ytterligare funderingar Vi vill kunna göra något i stil med > (send acc1 register-with bank-object1) ;; bank-object1 känner till kontot > (send acc2 register-with bank-object2) ;; bank-object2 - - Krav? Nyckelordet this. 22
Introduktion OBJEKTORIENTERING 23
Kapsla data och beteende Hos bankkonton, spelfigurer, grafikfönster, databehållare som köer... 24
Modellera världen som objekt som talar med varandra. Objektorienterad programmering 25
Vem har ansvar för vad? Ex: en karaktär håller reda på var i världen den är (inte en stor global tabell) osv. 26
Klass En klass beskriver alla objekt av ett visst slag. Ex: gemensamt för alla konton är (define account% (class...)) 27
Instans/objekt En instans av en klass är ett specifikt sådant objekt. Ex: en viss spelfigur, ett visst konto (define acc1 (new account% [balance 15)) 28
är ett exempel på Ex: account1 är ett exempel på ett konto (account%). 29
Objekten...har tillstånd (som kanske kan uppdateras)....är isolerade. Bankkontona känner inte till varandras saldon exv....kommunicerar på bestämt vis. Gränsnitt. Konton förstår meddelandet withdraw, agerar på känt vis....kan bete sig på egna vis. Varje objekt har sin hantering. 30
Några tumregler En klass beskriver gemensamma egenskaper. Alla konton kan... (new class%...) En instans av en klass. är ett exempel på my-account är ett exempel på ett konto. Bonus: säger något om vad som bör/inte bör ligga i account% 31
En klass per fil Mycket grov tumregel. require-härvor antyder dålig isolering. 32
Kort utblick/omnämnande LABORATION 5 33
Objektorienterat textspel ( Objektorienterat ) 34
Fokus: spelmotor Kul historia, men framförallt motor! 35
Uppdelning presentation - logik Nytt litet textfönster att leka med 36
Givna gränssnitt att utöka Följ det som står! Generaliserbart! 37
SISTA NOTERINGAR 38
Mer för den intresserade (ej i labben!) Interfaces (utan implementationer), mixins, UML-diagram, compositionmönster, init-användning... 39
Troligen användbart i projekt! Typer av figurer i spel, grafikobjekt... 40
Ord att understryka Gränssnitt (interface). Metoder. getters, setters Fält. Public/private. Arv. Overriding, inherit, inherit-field, super this 41
Mer läsning Kursen: OOP-guide (föreläsningssidan) Racket Guide (länkat) Senare: Kursen TDDC76. 42
Nästa föreläsning Projektintroduktion (VT2) 43
www.liu.se