Double Dispatch für Operationen auf Zahlen



  • Ich implementiere momentan als Übungsprojekt ein kleines Algebra System. Dabei wird die Eingabe eines Benutzers natürlich zunächst geparst und in ein verwertbares Format gebracht. Das funktioniert auch alles einwandfrei. Als Wertetyp nehme ich eine relativ große Gleitkommazahl.

    Ich möchte nun mein System unabhängig von diesem "festen" Wertetyp machen und auch Ganze Zahlen, Brüche und eventuell Komplexe Zahlen erlauben. Beim Verrechnen der Zahlen soll immer möglichst viel Typinformation erhalten bleiben. So soll eine Addition von zwei ganzen Zahlen wieder eine ganze Zahl als Ergebnis liefern. Eine Verrechnung von Brüchen und ganzen Zahlen liefert wieder Brüche. Kommen reele Zahlen ins Spiel ist das Ergebnis wohl eine Fließkommazahl, usw.

    Ich habe mir überlegt, dass ich dafür Double Dispatch verwenden könnte, da ich so oin Besitz der nötigen Typinformationen über beide Operanden bei binären Operationen kommen. Die einzelnen Klassen sind von einer abstrakten Basisklasse bzw. einem Interface abgeleitet.

    Allerdings habe ich bereits bei der Implementierung von Double Dispatch für die vier Grundrechenarten auf zwei Wertetypen (Ganze Zahl und Fließkomma) einen ganzen Batzen an Code. Jeder Wert muss alle anderen Werteklassen kennen. Ein paar Zeilen Code wiederholen sich auch (so z.B. Int + Float und Float + Int).

    Gibt es da irgendwelche alternativen Ansätze oder Ideen zu dem Thema? Einfach Fließkommazahlen nehmen und glücklich sein, habe ich schon selbst in Betracht gezogen.

    Ich hab den Thread mal in dieses Forum gepackt, da das Problem von der konkreten Sprache unabhängig ist.

    Gruß
    Don06



  • Don06 schrieb:

    Gibt es da irgendwelche alternativen Ansätze oder Ideen zu dem Thema?

    Daß jeder Typ die anderen Typen kennen muß, ist glaub ich bei Deinem Programm nicht so wild, es kommen ja nicht alle paar Monate wieder ein paar Typen dazu.
    Es gibt andere Implemetierungen des double dispatchings. Aber die tendieren wohl alle dazu, langsamer zu sein. Willst Du mehrkosten zahlen?

    Vielleicht liest user_l das hier, der kann angeblich jedes Problem ohne double dispatching lösen.



  • Erstmal danke für die Antwort. Dass sich die Klassen gegenseitig kennen müssen ist, wie du sagst, wirklich nicht so schlimm.

    volkard schrieb:

    Willst Du mehrkosten zahlen?

    Performanz ist in diesem Projekt eher unwichtig. Die meiste Zeit wird eh in den nicht optimierten Transformationen (Differnzieren, Integrieren) verbraten. Mir geht es mehr um eine saubere Implementierung.

    Ich werde die Komplexen Zahlen wohl erstmal außen vor lassen, dann sollte das ganze noch in einem überschaubaren Rahmen bleiben (Integer, Rational, Real). Das bedeutet dann, wenn ich Double Dispatch richtig verstanden habe, für jede binäre Operation in jede Klasse drei Methoden eingefügt werden müssen. Das gibt dann insgesamt 3*3 = 9 Methoden für eine Operation. Na ja, mit Multi-Methoden müsste man ja auch für alle Typkombinationen Funktionen schreiben.

    Gruß
    Don06



  • Don06 schrieb:

    Ich hab den Thread mal in dieses Forum gepackt, da das Problem von der konkreten Sprache unabhängig ist.

    Ist es nicht. LISP ist dafür ideal, bzw RPL.


Anmelden zum Antworten