De presentatie wordt gedownload. Even geduld aub

De presentatie wordt gedownload. Even geduld aub

De koektrommel of de grabbelton

Verwante presentaties


Presentatie over: "De koektrommel of de grabbelton"— Transcript van de presentatie:

1 De koektrommel of de grabbelton
Een presentatie over Templates Door Paul Bouman

2 Abstracte 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

3 Voorbeeld: 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; Maar hier kunnen we alleen ints in opslaan!

4 We willen een Koektrommel
Stap 1: Neem de lijst voor ints Class IntList { Node first, last; List() {} add(int i) { Node n = new Node(i); last.next = n; n.prev = last; last = n; } Stap 2: Kopieer de code 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, next; Stap 3: Pas de code aan Class KoekList { Node first, last; List() {} add(Koek i) { Node n = new Node(i); last.next = n; n.prev = last; last = n; } Class Node Koek inhoud; Node prev, next;

5 Nadelen 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.

6 Oplossing 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.

7 Probleem 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?

8 Oplossing: Multiple Inheritance
Object OVorm Is dit wat we willen? Je ziet door de bomen het bos niet meer! OVierkant OCirkel ODriehoek

9 Probleem 2: Bugs 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); List koek1 = new List(); List koek2 = new List(); KokosMakroon km, ab, fg; BokkenPoot bp, rs, pq; koek1.add(km); 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. koek1 en koek2 zijn nu geen nette koektrommels meer, maar koek1 is een slordige grabbelton!

10 Templates 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.

11 Hoe werkt het? Stap 1: Schrijf een template klasse
Template <class T> Class List { Node<T> first, last; List() {} add(T i) { Node<T> n = new Node<T>(i); last.next = n; n.prev = last; last = n; } Class Node T inhoud; Node<T> prev, next; Stap 2: Gebruik deze voor elk type dat je wilt List<KokosMakroon> koek1; List<BokkenPoot> koek2; Stap 3: De compiler kopieert de code van List voor elke klasse die je gebruikt.

12 Templates 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.

13 Templates 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.

14 Conclusie 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.


Download ppt "De koektrommel of de grabbelton"

Verwante presentaties


Ads door Google