Entwurfsmuster Interpreter

Werbung
Seminar Entwurfsmuster
Interpreter
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> <Hundert> <Zehn>
{'M'}
{'C'} | 'CD' | 'D' {'C'} |
{'X'} | 'XL' | 'L' {'X'} |
{'I'} | 'IV' | 'V' {'I'} |
Entwurfsmuster - Interpreter
<Eins>
'CM'
'XC'
'IX'
Tobias Webelsiep
Interpreter – Beispiel (2)
Struktur und Aufbau
Entwurfsmuster - Interpreter
Tobias Webelsiep
Interpreter – Beispiel (3)
Teilnehmer
Quellcode
 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>
PrdNr
PrdName
PrdPreis
PrdAnzahl
:=
:=
:=
:=
:=
:=
:=
:=
:=
PrjNr PrjName PrjStatus {<PrjPosition>}
int
String
int
PrdNr PrdName PrdPreis PrdAnzahl
int
String
float
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
Noch Fragen?
Vielen Dank für Ihre Aufmerksamkeit
Entwurfsmuster - Interpreter
Tobias Webelsiep
Herunterladen