Heiner KückerVisitor mit Multidispatch |
|
Home Java-Seite Bit Packed Array ASM Improved heterogene Map, HMap Constraint Code Generator JSP WorkFlow PageFlow FlowControl Page Flow Engine Web Flow Engine Control_and_Command JSP_Spreadsheet Code-Generator für Option-Either-Stil in Java verbesserter Comparator Fluent-Interface Code-Generator auf Basis einer Grammatik Visitor mit Multidispatch for-Schleife mit yield-return Kognitions-Maschine semantisches Netz Domain Parser Codegenerator_für hierarchische Datenstrukturen Expression_Engine Formula_Parser Thread Preprocessor State Transition Engine AspectJ Java_Explorer DBF_Library Kalender_Applet SetGetGen BeanSetGet CheckPackage LineNumbers GradDms Excel-Export StringTokenizer JspDoc JspCheck JSP-Schulung Java Server Pages Struts Ascii-Tabellen- Layouter Ascii-Baum- Layouter Ascii-Art-Fluss- Diagramm- Parser AsciiArt AssignmentMatrix Layouter StringSerial Silbentrennung JDBC_Schlüssel- Generierung bidirektional/ unidirektional gelinkte Liste Java_Sitemap Generator XmlBuilder RangeMap StringFormatter VersionSafe XCopy JTextField CommandLine- ParamReader Bitmap-Grafik MultiMarkable- Buffered- InputStream JavaCache JdomUtil CollectionUtil XML Really Pull Parser Log-Filter Remote-Protokoll Sudoku-Generator Delegation statt Mehrfachvererbung Disjunct Interval Set WebCam_Demo Weiterentwicklung_Java Alaska-XBase++-Seite Projekte Philosophien Techniken Konzepte Sudoku Kontakt / Impressum Links SiteMap Letzte Aktualisierung: 23.01.2014 |
Visitor mit Multidispatch
Die hier vorgestellte Erweiterung des Visitor-Patterns erlaubt den Multi-Dispatch über beliebig viele Parameter, nicht nur einen einfachen Double-Dispatch (es gibt natürlich irgendwelche Grenzen, wieviel Parameter sind eigentlich bei einer Java-Methode erlaubt?) Das Visitor-Pattern ist ein Workaround für den Single-Dispatch in Java (oder andere objektorientierte Sprachen mit Single-Dispatch). Das Visitor-Pattern realisiert einen Double-Dispatch, Multi-Dispatch ist nicht möglich. Vorteilhaft ist am Visitor, dass man nur an einer Stelle aufpassen muss, beim Implementieren der visit-Methode in der besuchbaren Klasse, nämlich dass man die richtige Methode des Visitor-Interface aufruft. Alles andere kontrolliert dann der Compiler, zumindest in Java. Nun ist es so eine Art Rätsel oder Herausforderung, wie man mit dem Visitor-Pattern einen Multi-Dispatch hinbekommt. instanceOf oder so ist verboten. Meine Lösung erlaubt als Erweiterung des Visitor-Patterns den Multi-Dispatch, also die Auswahl der aufzurufenden Methode anhand beliebig vieler Parameter. Die Grundidee ist, bei mehreren zu dispatchenden Parametern, für den jeweiligen Parameter einen weiteren Vistor zu erzeugen, der aus den möglichen Methoden (kartesisches Produkt der konkreten Parameter-Klassen) die für die aktuell aufgetretene Parameter-Kombination passenden Methoden auswählt(selektiert). Mit jedem Schritt(verarbeiteten Parameter) verkleinert sich die Menge der passenden Methoden Am Ende wird der letzte Visitor aufgerufen. Dieser letzte Visitor ruft nun die korrekte Methode aus der jeweiligen ...Processor-Klasse auf. In den spezialisierten Visitoren wird der jeweilige Parameter-Wert als Member über den Konstruktor vermerkt. Das Konstrukt bildet eine statische Struktur, die Parameter-Liste mit den besuchbaren Objekten (...Visitable) auf eine sequenzielle Code-Struktur ab. Manuell ist das eine Menge Schreibarbeit. Das Fehler-Risiko ist allerdings begrenzt, weil der Compiler immer mit-kontrolliert. Es würde sich ein Code-Generator dafür anbieten. Diese Arbeit habe ich erst mal gescheut, bei Interesse von Benutzerseite und eventuell noch vorhandener Zeit, würde ich das aber mal angehen. Download der Quelldateien VISITOR_MULTIDISPATCH.zip Installation: Entpacken in Verzeichnis Ihrer Wahl und Import als Eclipse-Projekt Start mit den enthaltenen JUnit4-Tests.
Achtung: Erweiterungen und Fixes stelle ich ohne Historie
und ohne Ankündigung hier bereit. Lizenzbedingungen:
Die Programme, Quelltexte und Dokumentationen können ohne
irgendwelche Bedingungen kostenlos verwendet werden. |