Title: De koektrommel of de grabbelton
1De koektrommel of de grabbelton
- Een presentatie over Templates
- Door Paul Bouman
2Abstracte Datatypes
- Algemene ideeën over de opslag van gegevens.
- Toepasbaar op allerlei soorten data.
- Voorbeelden zijn terug te vinden in ontelbare
informatica boeken. - Gebruikt in talloze algortimen
- Stack
- Heap
- Tree
- List
- Map
- Queue
3Voorbeeld List met alleen add
- Class IntList
-
- Node first, last
- List()
- add(int i)
- Node n new Node(i)
- last.next n
- n.prev last
- last n
-
-
- Class Node
-
- int inhoud Node prev Node next
4We willen een Koektrommel
5Nadelen
- Bijna identieke code voor het opslaan van ints en
koeken. - Als we iets willen veranderen in onze lijst,
moeten we dat nu op twee plekken doen! - Bij grote projecten met niet alleen ints en
koeken, krijg je nog veel meer identieke code.
6Oplossing 1 Smalltalk stijl
Class ObjectList Node first, last
List() add(Object i) Node n new
Node(i) last.next n n.prev last last
n Class Node Object inhoud Node
prev, next
- Object-georienteerde talen kennen type
overerving - Laat alle objecten afstammen van één type
(bijvoorbeeld Object) - Laat de datastructuur werken met Objecten in
plaats van met ints of Koeken.
7Probleem 1 Klassen van anderen
- In C stammen klassen NIET automatisch van één
ouder af. - Je kunt er zelf voor zorgen.
- Maar wat bij bibliotheken die dat niet doen?
8Oplossing Multiple Inheritance
Object
Is dit wat we willen? Je ziet door de bomen het
bos niet meer!
9Probleem 2 Bugs
List koek1 new List() List koek2 new
List() KokosMakroon km, ab, fg BokkenPoot bp,
rs, pq koek1.add(km) koek1.add(km) koek1.add(km
) koek1.add(km) koek1.add(km) koek1.add(km)
List koek1 new List() List koek2 new
List() KokosMakroon km, ab, fg BokkenPoot bp,
rs, pq koek1.add(km) koek1.add(ab) koek1.add(fg
) koek1.add(bp) koek1.add(rs) koek1.add(pq)
List koek1 new List() List koek2 new
List() KokosMakroon km, ab, fg BokkenPoot bp,
rs, pq koek1.add(km) koek1.add(ab) koek1.add(fg
) koek1.add(bp) koek1.add(rs) koek1.add(pq)
- Bij het ophalen van Objecten uit de
datastructuren moet er gecast worden. - Hierdoor kunnen er fouten in het programma slopen
die pas ontdekt worden tijdens het uitvoeren.
10Templates
- Vaak wordt duplicatie van code voorkomen met
parametrisatie. - In C kan dat met behulp van Templates
- In Java (vanaf 1.5) tegenwoordig ook met behulp
van Generics - De twee hebben grote verschillen, maar die vallen
niet direct op voor de programmeur.
11Hoe werkt het?
Stap 3 De compiler kopieert de code van List
voor elke klasse die je gebruikt.
12Templates vs. Generics
- Templates maken object code voor elke combinatie
van parameters. - Je moet je broncode distribueren en bij het
compilen gelinked worden.
- Generics leiden tot één generiek stuk object
code. - Objectcode is daarom distribueerbaar en kan
runtime gelinked worden.
13Templates vs. Generics (2)
- Templates kunnen andere parameters krijgen dan
typen. - Hierdoor is het mogelijk om Template
Metaprogramming toe te passen. - Dit is turing compleet!
- Bij generics is het alleen mogelijk om types als
parameter mee te geven.
Voor meer informatie over niet-type parameters
bij Templates en Template Meta Programming
verwijs ik graag naar het boek Thinking in C
Volume 2 van Bruce Eckel en de Wikipedia Pagina
over Template Metaprogamming.
14Conclusie
- Met templates kan code duplicatie voorkomen
worden. - Met templates kan je een erg ingewikkelde
multiple inheritance structuur voorkomen. - Met templates worden types bij het compilen
gecontroleerd. - Hierdoor wordt het makkelijker bekende
datastructuren en algoritmes op nieuwe problemen
toe te passen.