Visitor Pattern



  • Hi,

    ich habe verschiedene Klassen, die alle verschiedene geometrische Objekte darstellen (Box, Sphäre = Kugel, Dreieck, normaler 3D-Vektor) und alle von einer gemeinsamen Basisklasse abgeleitet sind (BoundingVolume).

    Nun möchte ich ganz einfach jedes Bounding Volume auf Kollision gegen jedes andere testen, klar, dass ich die Intersect()-Methoden einfach überladen möchte und nicht jedem Objekt verschiedene IntersectWithBlaBlaBla()-Methoden zur Verfügung stellen möchte. 🙂

    Mein erster Ansatz war erstmal nur Double Dispatch zu implementieren, dadurch könnte ich dann wenn ich die Intersect()-Methoden virtuell mache, auf Kollisionen testen, ohne den genauen Typ zu kennen!

    Nur gibt es das Problem der Doppeldeutigkeit, z.B. gibt es dann Box::IntersectWithSphere() und Sphere::IntersectWithBox().

    Um genau das zu vermeiden, würde ich gerne das Visitor Pattern verwenden, mit dem ich leider noch nicht so viele Erfahrungen gemacht habe. 😞

    Ist das hier eurer Meinung nach geeignet und falls ja, wie kann ich es hier gut umsetzen?

    ChrisM

    PS: Ja, ich habe gegoogelt, aber keinen der Links (ohnehin nicht für C++ geschrieben) wirklich verstanden 😞



  • Ist das hier eurer Meinung nach geeignet und falls ja, wie kann ich es hier gut umsetzen?

    Alexandrescu widmet diesem Thema ein ganzes Kapitel in seinem "Modern C++ Design". Schau z.B. mal in die Loki-Library. Dort gibt es eine feine Multi-Method Implementation.



  • Hi,

    erstmal danke für die Antwort! 🙂

    Ich hab mir jetzt die Visitor.h (im Reference-Ordner) von Loki angeschaut, aber auch daraus werde ich nicht ganz schlau.

    Kennt niemand einen guten Link oder kann mir sagen, wie ich das hier implementieren kann (ich bin echt kein Copy&Paste-Programmierer, aber wenn ich das mal laufen sehen würde, würde ich vielleicht auch verstehen, wie es funktioniert).

    Ansonsten bleibt mir wohl nur Double Dispatch mit globalen Intersect-Funktionen: Extrem unschön 😞

    ChrisM



  • Hm, also ich kann da nur OOP für Dummies empfehlen, da ist es recht verständlich beschrieben.
    Ansonsten kenne ich im Internet keine Texte die sich mit dem Visitor Pattern beschäftigen.
    Aber Google kennt sie bestimmt...

    Devil



  • OOP für Dummies ist das Buch von Marc++us, oder?

    Bitte ehrliche Antwort: Lohnt sich das? Jetzt mal vom Visitor Pattern abgesehen... 🙂

    ChrisM



  • nein, lohnt sich kaum



  • ChrisM schrieb:

    OOP für Dummies ist das Buch von Marc++us, oder?

    Bitte ehrliche Antwort: Lohnt sich das?

    jo, auf jedenfall.



  • Shade Of Mine schrieb:

    ChrisM schrieb:

    OOP für Dummies ist das Buch von Marc++us, oder?

    Bitte ehrliche Antwort: Lohnt sich das?

    jo, auf jedenfall.

    aber nur für noobs.



  • ChrisM schrieb:

    OOP für Dummies ist das Buch von Marc++us, oder?

    Bitte ehrliche Antwort: Lohnt sich das? Jetzt mal vom Visitor Pattern abgesehen... 🙂

    ChrisM

    Das musst du selbst entscheiden. Ich habs mir gekauft aus Neugier was Marcus da
    so verzapft hat, und muss sagen das es ganz ordentlich ist. Kanns eigentlich nur
    empfehlen, und wenn du es über Amazon bestellst, unterstützt du das Forum gleich mit...

    Devil



  • Na gut, wird mir wohl nichts anderes übrig bleiben, als das Buch zu bestellen!

    Obwohl es sich eigentlich für mich nicht lohnt, weil ich die meisten OOP-Konzepte schon gut kenne. 😞

    ChrisM



  • Ich glaube nicht, dass dir das Buch was bringen würde. Wenn du C++ schon halbwegs kannst, Double-Dispatch implementieren kannst und jetzt nach dem Visitor-Pattern guckst, kannst du mit höchstens 10% des Buches was anfangen.



  • Ja, Double Dispatch kann und hab ich schon oft implementiert, mein Problem ist nur der Schritt von Double Dispatch zum Visitor Pattern.

    ChrisM



  • Es enttäuscht mich natürlich zu tiefst, wenn Du so wenig mit dem Buch anfangen kannst. Beginnt der Abschnitt doch so:

    *22.3 Besucher zahlen keinen Eintritt
    Wissen Sie, welche Fähigkeit einen guten Software-Entwickler auszeichnet? Lügen, ohne mit der Wimper zu zucken.
    »Wann ist meine Software fertig?« »Morgen!«
    »Könnt Ihr diese Funktion auch noch in die Software einbauen?« »Klar, kein Problem.«
    »Da ist noch ein Fehler in der Software« »Wir arbeiten bereits an einem Update.«
    Sehen Sie, ist ganz einfach. Irgendwann geht einem das so in Fleisch und Blut über, dass man sogar seine Leser am Anfang eines Kapitels ganz frech anschwindelt. Natürlich können Sie etwas gegen diese wuchernden Klassen tun, ein größerer Bildschirm wird zwar auch immer wieder gerne genommen, aber es gibt Lösungsmöglichkeiten für das Problem der wuchernden Klassen.
    Die Lösung dafür ist ein Design-Pattern, das auf den schönen Namen Visitor-Pattern (Besucher-Muster) hört.
    Das Visitor-Pattern besitzt einige zentrale Ideen
    😉 Operationen auf einer Klasse werden in einer anderen Visitor-Klasse gekapselt
    😉 eine Klasse bietet eine neutrale Schnittstelle für Visitor-Klassen an
    😉 um neue Operationen auf einer Klasse ablaufen zu lassen, muss die Original-Klasse nicht mehr geändert werden
    *

    usw... ist das nicht toll? Na gut, ein Codebeispiel dazu findest Du im Download der Beispiele, Link zu finden unter http://www.c-plusplus.net/oop_dummies.htm

    Und zwar solltest Du nach den Beispielen zu Kapitel 22 schauen, dort gibt's "arbeitende" Beispiele.

    --

    @Unregistrierter: wieso nur für noobs? Ab Kapitel 22 sind schon einige Leute ausgestiegen...



  • Gut, mit dem Code kann ich ohne Erklärungen nicht so viel anfangen, werd ich mir das Buch halt doch bestellen. Ich bin mir sicher, dass auch noch einige Details zu Templates oder so erwähnt werden, die ich noch nicht wusste... 🙂

    Morgen wird's bestellt!

    ChrisM



  • also ich hab bei OOP fuer Dummies manchmal schon recht dumm aus der waesche gekuckt weil ich dachte ein Gebiebt zu kennen und Marc++us kommt dann mit was voellig neuem daher...

    aber nur um Visitor zu kapieren braucht man das Buch wirklich nicht. da hilft ne google suche mehr (oder ein blick ins GOF, denn das hat ja jeder daheim stehen (wenn nicht -> kaufen))


Anmelden zum Antworten