1 / 14

De koektrommel of de grabbelton

De koektrommel of de grabbelton. Een presentatie over Templates Door Paul Bouman. 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

morwen
Download Presentation

De koektrommel of de grabbelton

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. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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. Maar hier kunnen we alleen ints in opslaan! 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; }

  4. 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; } } 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; } 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; } Stap 2: Kopieer de code Stap 3: Pas de code aan We willen een Koektrommel

  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. OVorm OCirkel OVierkant ODriehoek Oplossing: Multiple Inheritance Object Is dit wat we willen? Je ziet door de bomen het bos niet meer!

  9. koek1 en koek2 zijn nu geen nette koektrommels meer, maar koek1 is een slordige grabbelton! Probleem 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.

  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. 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; } } Template <class T> Class Node { T inhoud; Node<T> prev, next; } Stap 2: Gebruik deze voor elk type dat je wilt List<KokosMakroon> koek1; List<BokkenPoot> koek2; Hoe werkt het? Stap 3: De compiler kopieert de code van List voor elke klasse die je gebruikt.

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

  13. 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. Templates vs. Generics (2) 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.

More Related