Interpreter Seminar Entwurfsmuster Tobias Webelsiep Korreferenten Prof. Dr. Burkhardt Renz Prof. Dr. Wolfgang Henrich 18.06.2003
Inhaltsverzeichnis Einführung in Verhaltensmuster Interpreter: Definition und Motivation Beispiel: Interpreter für römische Zahlen Interpreter – Entwurfsmuster Struktur, Aufbau Anwendbarkeit, Vor- und Nachteile Beispiel: Projektdaten einlesen Kritische Würdigung Entwurfsmuster - Interpreter Tobias Webelsiep
Einführung in Verhaltensmuster Definition Beschreiben allgemeine Algorithmen Befasst sich mit der Zuweisung von Zuständigkeiten Regeln Interaktionen zwischen Objekten bzw. Klassen Ermöglicht Beschreibung komplexer Kontrollflüsse Unterschiedliche Arten Klassenbasiert (Vererbung): Interpreter, Schablonenmethode Objektbasiert (Objektkomposition): Vermittler, Strategie, Zustandsmuster Entwurfsmuster - Interpreter Tobias Webelsiep
Interpreter - Definition "Definiere für eine gegebene Sprache eine Repräsentation der Grammatik sowie einen Interpreter, der die Repräsentation nutzt, um Sätze in der Sprache zu interpretieren." [GoF] "Löse ein Problem, indem es rekursiv in kleinere unabhängige Probleme unterteilt wird. Die resultierenden Teilprobleme können getrennt voneinander gelöst und zu einer um fassenden Lösung zusammengefügt werden." [Applied Java Patterns] Entwurfsmuster - Interpreter Tobias Webelsiep
Interpreter - Motivation Direkt Interpretation von Sprachen und Grammatiken Parsen von Eingabeströmen (String, Datei) Indirekt Finde für ein Problem eine Grammatik: Zerlege das Problem in Teile Schreibe jedes Teilproblem als Satz der Sprache Füge die Sätze zu einer Grammatik zusammen Lösung des gleichen Problemtyps mit einem einzigen Interpreter Entwurfsmuster - Interpreter Tobias Webelsiep
Interpreter – Beispiel (1) Interpreter für Römische Zahlen Eingabe römischer Zahlen Ausgabe Interger-Zahlen Grammatik <Roman> := <Tausend> <Hundert> <Zehn> <Eins> <Tausend> := {'M'} <Hundert> := {'C'} | 'CD' | 'D' {'C'} | 'CM' <Zehn> := {'X'} | 'XL' | 'L' {'X'} | 'XC' <Eins> := {'I'} | 'IV' | 'V' {'I'} | 'IX' Entwurfsmuster - Interpreter Tobias Webelsiep
Interpreter – Beispiel (2) Struktur und Aufbau Entwurfsmuster - Interpreter Tobias Webelsiep
Interpreter – Beispiel (3) Quellcode Teilnehmer ZahlenParser: Hauptklasse, liest römische Zahl ein, gibt die Integer-Zahl aus. ZahlenKontext: Speichert aktuelle Integer-Zahl während des Parsvorgangs ZahlInterpreter: Abstrakte Basisklasse, enthält die interpretiere()-Methode ZahlEins: Interpretiert 1, 4, 5, 9 ZahlZehn: Interpretiert 10, 40, 50, 90 ZahlHundert: Interpretiert 100, 400, 500, 900 ZahlTausend: Interpretiert 1000 Entwurfsmuster - Interpreter Tobias Webelsiep
Interpreter-Entwurfsmuster Definition Klassenbasiertes Verhaltensmuster Beschreibt den Entwurf der Klassen aus der Grammatik Globale Informationen werden in einer Kontext-Klasse gespeichert Was wird nicht beschrieben Wie wird der Syntaxbaum erzeugt (vgl. Kompositum) Beispiele: Stringparsen, CUI, Algebraische Ausdrücke Entwurfsmuster - Interpreter Tobias Webelsiep
Interpreter-Entwurfsmuster Aufbau und Struktur Entwurfsmuster - Interpreter Tobias Webelsiep
Interpreter-Entwurfsmuster Anwendbarkeit Einfache und kleine Grammatik Anzahl der Klassen wird zu groß Wartbarkeit, Handhabbarkeit eingeschränkt Problem lässt sich einfach als Grammatik formulieren Suche darf den Rahmen nicht sprengen Die Effizienz spielt keine Rolle Aufbau des Syntaxbaumes kostet Zeit Viele Klassen-Instanziierungen Entwurfsmuster - Interpreter Tobias Webelsiep
Interpreter-Entwurfsmuster Vorteile Die Grammatik ist leicht zu implementieren Erweiterung der Grammatik und des Interpreters ohne großen Aufwand möglich Neue Interpretationsart durch eine neue Methode in der abstrakten Basisklasse Ausdruck Nachteile Große Grammatiken bereiten Probleme Parsergeneratoren meist besser geeignet Entwurfsmuster - Interpreter Tobias Webelsiep
Beispiel: Projektdaten einlesen Aufgabe Kommaseparierte Projekt-Daten und Projektpositionen einlesen und interpretieren Auswertung des Projektnamen und des Gesamtwertes Grammatik <Projekt> := PrjNr PrjName PrjStatus {<PrjPosition>} PrjNr := int PrjName := String PrjStatus := int <PrjPosition> := PrdNr PrdName PrdPreis PrdAnzahl PrdNr := int PrdName := String PrdPreis := float PrdAnzahl := int Entwurfsmuster - Interpreter Tobias Webelsiep
Beispiel: Projektdaten einlesen Klassendiagramm Entwurfsmuster - Interpreter Tobias Webelsiep
Beispiel: Projektdaten einlesen Syntaxbaum Wird vom ProjektParser aufgebaut Projekt und ProjektPosition enthalten Kind-Objekte Entwurfsmuster - Interpreter Tobias Webelsiep
Beispiel: Projektdaten einlesen Teilnehmer Start des Interpretier-Vorgangs im ProjektParser über die werteAus()-Methode des Wurzel-Objektes Jeder NichtTerminalAusdruck wertet den Kontext durch Aufruf der werteAus()-Methode seiner Kind-Objekte aus Die TerminalAusdrücke bilden das Ende der Rekursion Wertübergabe im Baum durch Klasse ProjektKontext und PositionKontext in beide Richtungen Quellcode Entwurfsmuster - Interpreter Tobias Webelsiep
Kritische Würdigung Besonderheit bei der Implementierung Einfache Möglichkeit der Kommando-Eingabe Fehlerbehandlung kann umfangreich werden Bei großen Syntaxbäumen hilft Iterator-Muster Typische Anwendungsgebiete Ausdruck-Interpreter in Mathematica Übersetzer für Smalltalk Generator für Ausgabe. Sprache ähnlich wie SQL HTML Generierung für Web-Client Entwurfsmuster - Interpreter Tobias Webelsiep
Kritische Würdigung Fazit Strukturierter Aufbau der Grammatik in Klassen Gute Wiederverwendung und Erweiterbarkeit Mächtiges Werkzeug durch Baumstruktur Implementierungsaufwand größer, da Klient und Kontext nicht im Entwurfsmuster beschreiben Da eingeschränktes Anwendungsgebiet nur selten im Softwareentwurf eingesetzt Entwurfsmuster - Interpreter Tobias Webelsiep
Vielen Dank für Ihre Aufmerksamkeit Noch Fragen? Vielen Dank für Ihre Aufmerksamkeit Entwurfsmuster - Interpreter Tobias Webelsiep