wofür templates?



  • "... edle Form von Makros ... "
    wahrscheinlich, weil sie vor laufzeit aufgelöst werden



  • Hatten wir das nicht schonmal?

    IMHO sind Templates ein Spezialfall von Makros und keine "edle" Form, aber darum gehts ja nicht. Makro ist dabei nicht im cpp-Sinne zu verstehen.



  • ... hatten wir das schonmal?



  • Original erstellt von Bashar:
    ein Spezialfall

    edel, weil rekursiv



  • Hatten wir das nicht schonmal?

    Wenn du das sagst, bestimmt. Ich kann mich dummerweise nicht daran erinnern und eine Suche war bisher auch nicht erfolgreich.

    IMHO sind Templates ein Spezialfall von Makros und keine "edle" Form, aber darum gehts ja nicht.

    Wo ist der Unterschied? Und was macht sie zum Spezialfall?

    Makro ist dabei nicht im cpp-Sinne zu verstehen.

    Ok. Was sind dann Makros? Ich kenne den Begriff nur in zwei Versionen:
    a) Blöcke dir durch reine Textersetzung zu Ziel-Sprachkonstrukten umgewandelt werden (-> C-Makros)
    b) Ansammlung von einfachen Befehlen die nach einander abgearbeitet werden (-> Makros in GUI-Umgebungen oder Makro im Sine von Makro-Command).

    Da muss es ja sicher noch mindestens ein c) geben.

    Also, falls jemand Zeit und Lust hat, ich würde mich über ein paar erklärende Sätze freuen.

    [ Dieser Beitrag wurde am 04.06.2003 um 07:24 Uhr von HumeSikkins editiert. ]



  • Also ich lehn mich jetzt mal ganz weit aus dem Fenster und behaupte,wenn ich in Java nen Vector nutze der alle Subtypen von Object speichert muss ich zur Laufzeit in allen Methoden,die Elemente des Vectors nutzen wollen,Fallunterscheidungen einfügen um sicherzustellen,dass das Object-Objekt 😃 ,das ich aus dem Vector auslese,auch von der "passenden" Methode weiterverarbeitet wird um böse Laufzeitfehler zu vermeiden.Weiter behaupte ich mal dass einer der Vorteile der OOP darin liegt diese Fallunterscheidungen durch dynamische Typenprüfung überflüssig zu machen.
    Wenn ich also ohnehin prüfen muss,ob das ausgelesene Object-Objekt nun vom Subtyp A,B oder C ist,kann ich das Ganze auch gleich in C schreiben.

    Vielleicht bin ich ja auch im falschen Film,aber ich denke schon das Templates eine gewisse Arbeitserleichterung darstellen und die Jungs bei sun werden schon wissen warum sie es für nötig halten ihre Sprache damit zu erweitern 😉 .

    MfG Spacelord 🙂



  • Original erstellt von HumeSikkins:
    Hatten wir das nicht schonmal?**
    Wenn du das sagst, bestimmt. Ich kann mich dummerweise nicht daran erinnern und eine Suche war bisher auch nicht erfolgreich.**

    Vielleicht vor nem Jahr, oder etwas mehr ... Makro deshalb, weil *im wesentlichen* nichts anderes passiert, als dass die Parameter eingesetzt werden (von Sachen wie Spezialisierung und speziellen Lookup-Regeln abgesehen). Spezialfall deshalb, weil die Möglichkeiten der Code-Transformation doch sehr begrenzt sind.

    **
    Ok. Was sind dann Makros? Ich kenne den Begriff nur in zwei Versionen:
    a) Blöcke dir durch reine Textersetzung zu Ziel-Sprachkonstrukten umgewandelt werden (-> C-Makros)
    **

    Syntaktisch zusammenhängende Blöcke, die durch beliebige Verarbeitung zu Ziel-Sprachkonstrukten umgewandelt werden, auf Syntaxbaum-Ebene.

    -> Lisp-Makros

    [ Dieser Beitrag wurde am 04.06.2003 um 09:00 Uhr von Bashar editiert. ]



  • Original erstellt von Spacelord:
    Also ich lehn mich jetzt mal ganz weit aus dem Fenster

    Etwas zu weit, würde ich meinen

    **
    und behaupte,wenn ich in Java nen Vector nutze der alle Subtypen von Object speichert muss ich zur Laufzeit in allen Methoden,die Elemente des Vectors nutzen wollen,Fallunterscheidungen einfügen um sicherzustellen,dass das Object-Objekt 😃 ,das ich aus dem Vector auslese,auch von der "passenden" Methode weiterverarbeitet wird um böse Laufzeitfehler zu vermeiden.**

    Unsinn.

    Weiter behaupte ich mal dass einer der Vorteile der OOP darin liegt diese Fallunterscheidungen durch dynamische Typenprüfung überflüssig zu machen.

    Und jetzt willst du behaupten ausgerechnet Java würde dynamische Typprüfung nicht können? War wohl nix.



  • Unsinn??? 😕
    Naja,vielleicht hast du ja nen anderes Java aber wenn ich bei mir versuche aus einem Object-objekt z.B das Attribut Bremsweg meines Auto-objekts(das in dem Object vector gespeichert war)auszulesen schmiert mir das Programm ab.
    Wenn du nicht prüfen musst ob das Object-objekt dass dir der Vector liefert ein Auto oder ein Bananen Objekt ist bin ich ja beruhigt.

    MfG Spacelord



  • Du castest das Objekt in die Klasse, die du meinst, die es hat, und gut. Ne Fallunterscheidung gibts da nicht. Höchstens nen Fehler, der von dem zu verantworten ist, der das Objekt in den Vektor gesteckt hat.



  • Das ist ja der Punkt,du weisst ja nicht welche Klasse es hat also kannst du für alle möglichen Fälle ne instanceof Abfrage machen.
    Wenn du die Objekte aus dem Vektor z.B als Parameter für ne Methode nutzen möchtest musst du doch erstmal sicherstellen das deine aktuellen Parameter mit der richtigen Methode verarbeitet werden,und hin ist die Dynamik.





  • @spacelord
    in einen java-Vector tut man normalerweise nur Objete eines bestimmtes Typs rein und weiß dann ja auch wie man casten muß..

    Vector autos= new Vector();
    Auto bmw= new Auto("BMW");
    autos.addElement(bmw);
    Auto car= (Auto) autos.get(0);  //casten und fertig, wenn der Cast bei Laufzeit
                                    //schief läuft, weiß man das was nich stimmt
    

    [ Dieser Beitrag wurde am 04.06.2003 um 10:27 Uhr von crass editiert. ]



  • Spacelord: siehe crass' Antwort
    Ausserdem, hattest du nicht für Templates stattdessen argumentiert? Templates sind komplett statisch, wo ist *da* deine Dynamik?



  • Was ist normal??
    Wenn hier eine Objectoberklasse als Vorteil angepriesen wird,sollte es doch erlaubt sein aufzuzeigen das ein inhomogener Vektor(der durch Object ja möglich ist) auch Probleme mit sich bringt.Ich kann doch nicht auf der einen Seite sagen,"Guck mal hier in dem Objejt-Vector kann ich alle erdenklichen Objekte speichern" und dann sag ich das man aber nur eine Sorte darin speichern sollte weil es Mist ist damit zu arbeiten.



  • niemand hat gesagt (so weit ich weiß) daß es ein Vorteil ist alle möglichen Objekt-Typen speichen zu können, es ging hauptsächlich darum, ob Templates notwendig sind und ob man es nicht gleichwertig durch diese Technik ersetzen kann..(wobei ich gar nicht der Meinung bin, daß es völlig gleichwertig ist)

    [ Dieser Beitrag wurde am 04.06.2003 um 10:36 Uhr von crass editiert. ]



  • Makro deshalb, weil *im wesentlichen* nichts anderes passiert, als dass die Parameter eingesetzt werden (von Sachen wie Spezialisierung und speziellen Lookup-Regeln abgesehen). Spezialfall deshalb, weil die Möglichkeiten der Code-Transformation doch sehr begrenzt sind.

    Hm, obwohl ich mich bemühe, kann ich mich hier nicht deiner Ansicht anschließen.
    An den C++ Templates sind automatische Typherleitung (Funktionstemplates), Spezialisierung, 2-Phasenlookup, export und co ja gerade das entscheidene.

    Wenn du das jetzt alles weglässt, dann sehe ich eindeutig den Makrocharacter. Dann sehe ich allerdings nicht mehr viel von C++ Templates.
    Das ist mir einfach ein wenig zu sehr abstrahiert und vereinfacht.

    [...]es ging hauptsächlich darum, ob Templates notwendig sind und ob man es nicht gleichwertig durch diese Technik ersetzen kann..(

    Beides lässt sich meiner Meinung nach leicht beantworten:
    1. Nein, Templates sind strenggenommen nicht notwendig (genau wie Klassen und Vererbung)
    2. Nein, gleichwertig lassen sie sich durch dynamische Polymorphie nicht ersetzen. Allein schon weil in Sprachen wie C++ Compilezeitfehler noch was anderes als Laufzeitfehler sind und man immer erstere bevorzugt.



  • @HumeSikkins: Du bist abschätzig gegenüber Makros, nur weil du nur C Makros kennst (kann ich dir nich verübeln :D). Bashar hat ja schon von irgendwelchen Common-Lisp Makros geredet - ich kenn nur Scheme Makros. Und diese Scheme-Makros sind gar nicht mal übel.



  • Nur so kann man zB bei jedem Objekt garantieren, daß es Methoden hat, die jedes Objekt haben sollte(bei einer praktischen Sprache die auf die Bedürfnisse der Programmierer zugeschnitten ist zumindest), zB toString().

    Kann mit bitte einer erklären, warum mein Vogel und mein Auto jetzt ein toString() haben sollte und wie ich diese Methode vernüpftig implementieren sollte (inhaltlich).

    jo, OO halt ich für "natürlich"...damit mein ich eine Technik, die dem menschlichen Denken nahe liegt.. Menschen stellen sich würd ich mal sagen, normalerweise alles irgendwie als Objekt (Sache) vor, auch Verallgemeinerungen und Konkretisierungen (wie bei Vererbungen) von Dingen und Personen sind typisch fürs normale Denken

    Ja und es ist ja völlig abwegig sich vorzustellen, dass es eine Kiste für Eier und eine Kiste für Äpfel gibt. Nein, eine normal denkender Mensch denkt nur an Kisten, in denen Objekte sind und geht davon aus, dass nur Objekte einer Art drin sind. Sollte versehentlich doch mal eine andersgeartetes Objekt in die Kiste gelangen, ist das eben ein Fehler. Kannst du so denken? Ich jedenfalls nicht.



  • Original erstellt von HumeSikkins:
    **
    An den C++ Templates sind automatische Typherleitung (Funktionstemplates), Spezialisierung, 2-Phasenlookup, export und co ja gerade das entscheidene.
    **

    Wieso ist das entscheidend? Mag ja sein, dass man damit tolle Sachen machen kann, aber das ist alles nur eine Folge aus der Grundidee, Komponenten zur Übersetzungszeit zu parametrieren.

    Was ist eigentlich Two-Phase-Lookup, und warum ist es so toll, dass du es mit aufzählst?


Anmelden zum Antworten