Über Datentypen interieren



  • Du beschreibst dein Problem nicht präzise. Du sagst, dass du

    • über Datentypen iterieren möchtest. Möchtest du aber nicht, du möchtest eine Fallunterscheidung für strings. Das, was du als Datentyp bezeichnest, ist letztendlich doch nur eine Eigenschaft eines JSON Objekts.
    • eine Liste hast. Hast du aber nicht, du hast ein JSON Dokument, in dem bestimmte Objekte einen Namen haben.

    Wenn du uns jetzt verrätst, was du konkret mit zwei Einträgen machen möchtest kann man dir vielleicht helfen.



  • @DocShoe

    ok ich bekomme es nicht rüber. Bzw @Schlangenmensch hat mich verstanden

    Ich machs mit der Loockup Tabelle das wird das einfachste sein.

    @DocShoe sagte in Über Datentypen interieren:

    Wenn du uns jetzt verrätst, was du konkret mit zwei Einträgen machen möchtest kann man dir vielleicht helfen.

    Was ich mit den Einträgen machen will ist doch völlig egal. Es geht mir doch nur darum dass ich die beiden Fälle unterscheiden kann. Egal ich lass es. Passt danke.



  • @booster

    Ne, eben nicht. Du beschreibst deine Anforderung so konfus, dass niemand versteht, was du eigentlich machen möchtest. Du bist gedanklich ein paar Schritte weiter und beschreibst das Problem, das du nach diesen Schritten hast. Wenn du uns erklärst was du eigentlich vorhast kann man dir helfen. Für mich hört sich das jedenfalls nach dem XY Problem an.

    Im Moment verstehe ich das so, dass du verschiedene JSON Objekte aus dem Dokument heraussuchen und unterschiedlich behandeln möchtest. Zur Fallunterscheidung dient dazu eine Eigenschaft des JSON Objekts, das du als "Datentyp" bezeichnest.



  • @DocShoe sagte in Über Datentypen interieren:

    @booster

    Ne, eben nicht. Du beschreibst deine Anforderung so konfus, dass niemand versteht, was du eigentlich machen möchtest.

    Gut dann tuts mir leid dass ich das nicht so beschreiben kann dass du das verstehst. Oder es allgemein zu konfus ist. Wie auch immer

    @DocShoe sagte in Über Datentypen interieren:

    Zur Fallunterscheidung dient dazu eine Eigenschaft des JSON Objekts, das du als "Datentyp" bezeichnest.

    Nein tut es nicht.



  • @booster sagte in Über Datentypen interieren:

    Wenn du meinst.

    Definitiv!

    Wir haben eine Liste.

    Was für eine Liste? (Wenn man sich den kompletten Thread durchliest, kann man entnehmen, dass es wohl Namen von Klassen in der Liste sind.) Warum steht das bei der Beschreibung nicht dabei? Du redest von Iterieren über Typen, meinst aber Namen von Typen. Das ist eben kein unwesentlicher Unterschied.

    EintragA
    EintragB
    EintragC
    EintragD
    EintragA
    EintragB
    EintragC
    EintragD

    Nun möchte ich aus der Liste 2 Einträge raus suchen und unterschiedlich behandeln

    Reflection Problem, Factory nehmen, die liefert dann für jeden Namen ein Objekt (Functor o.ä.) zurück, was dann irgend was macht, was Du vorher definiert hast.



  • @john-0 sagte in Über Datentypen interieren:

    ja nochmals. Ihr könnt mich nun auch aufs übelste verurteilen dass ich das nicht so beschreiben kann das ihr euch das vorstellen könnt. Wollt ihr da nun weiter drauf rum hacken.

    @john-0 sagte in Über Datentypen interieren:

    Warum steht das bei der Beschreibung nicht dabei?

    Tut es sogar an mehreren Stellen.

    Hier zum Beispiel

    @booster sagte in Über Datentypen interieren:

    Noch ein Versuch... In der Json stehen die Namen der Typen der Klasse als vollständiger Name drin.
    Vereinfacht
    class mynamspace::classA
    class mynamspace::classB
    class mynamspace::classC
    class mynamspace::classD
    class mynamspace::classE

    Aber egal.

    Ich möchte das Objekt aus der Json nicht wieder deserialisieren. Ich möchte nur wissen ob sich die beiden Einträge in der Json befinden nichts weiter.

    Wenn sich der Eintrag class mynamspace::classB im Json befindet dann führe Funktion X aus
    Wenn sich der Eintrag class mynamspace::classD im Json befindet dann führe Funktion Y aus



  • @booster sagte in Über Datentypen interieren:

    Wollt ihr da nun weiter drauf rum hacken.

    Es geht darum, dass Du es einmal schaffst eine vollständige korrekte Beschreibung Deines Problems nieder zuschreiben, und das auch nicht auf einem Thread verteilt, sondern an einem Punkt.

    Ich möchte das Objekt aus der Json nicht wieder deserialisieren. Ich möchte nur wissen ob sich die beiden Einträge in der Json befinden nichts weiter.

    Es ist nichtsdestoweniger das Deserialierungsproblem, weil man aus einem Namen ein Objekt bauen muss. Ob man nun das komplette Objekt deserialisiert oder das nur für ein Hilfsobjekt macht, ist für die Lösung keinen wesentlichen Unterschied. Man kann das über eine std::map<std::string, YourSpecialFunctorAbstractClass> machen oder …

    YourMapOfFunctions["mynamespace::classB"].foo();
    

    Und daran denken, dass gcc (so auch andere Compiler) nicht den Namen aus dem Sourcecode über type_info.name() zurückliefern, sondern man diesen vorher erst demangeln muss.



  • @john-0 sagte in Über Datentypen interieren:

    Es geht darum, dass Du es einmal schaffst eine vollständige korrekte Beschreibung Deines Problems nieder zuschreiben, und das auch nicht auf einem Thread verteilt, sondern an einem Punkt.

    Ja sorry. Ich habe es oben beschrieben. Und dann habe ich auf Nachfrage versucht das anders zu beschreiben.

    @john-0 sagte in Über Datentypen interieren:

    Man kann das über eine std::map<std::string, YourSpecialFunctorAbstractClass> machen oder …

    Ja das ist ja das was auch @Schlangenmensch vorgeschlagen hat. Die LoockupTabelle. Das hatte ich ja gesagt dass dieso wohl meine Lösung wird.....



  • @booster
    Du kannst auch das JSON einlesen und daraus eine passende Datenstruktur aufbauen. Wenn du wissen willst welche Klassennamen im JSON vorkommen kannst du z.B. einfach ein set<string> mit allen Klassennamen befüllen. Und wenn du das erstmal hast, dann kannst du es einfach so schreiben:

        if (classNameSet.count("foo"))
            doTheFoo();
        if (classNameSet.count("bar"))
            doTheBar();
    


  • @hustbaer

    Ok sorry aber genau darum ging es mir doch dass ich nachher kein switch case bzw if construct habe.

    Also wir bleiben dabei. Die Lösung mit der Lookuptabelle scheint die richtige Wahl zu sein.



  • Ich versuche mal, dein Problem zu Beschreiben, wie ich es jetzt verstanden habe. Etwas vereinfacht.

    Du hast eine Datei, in der stehen Instruktionen, die ausgeführt werden.

    doThing1
    doThing2 
    doThing3
    ...
    

    Der genaue Aufbau wird vermutlich flexibel sein. In deinem Fall hattest du jetzt Namen von Typen (Klassen) dort drin stehen, die am Ende aber für eine spezifische gewünschte Funktionalität stehen sollen.

    Du hast jetzt alle / spezifische Einträge ausgelesen und willst diese ausführen. Das stellst du dir quasi so vor:

    for action in json.getAllMyActions(): 
       eval(action) 
    

    Also die Idee: C++ ist in der Lage action direkt zu interpretieren.

    Du schafft es aber nur sowas hier umzusetzen:

    for action in json.getAllMyActions(): 
      if action == "doThing1": 
         doThing1()
      elif action == "doThing2":
         doThing2()
      ...
    

    Daher deine Aktion wird nicht direkt intepretiert, sondern du brauchst eine Fallunterscheidung. Diese Fallunterscheidung kann per if / else, switch / case oder auch per Map erfolgen. Aber du hast immer diese Redundanz sage ich mal 😉

    Ich habe es im Pseudocode schon angedeutet, in anderen Sprachen gibt es u.a. eval, welches in der Lage ist beliebigen Code als String auszuführen. Also unter anderem auch Methoden aufzurufen. Oder Objekte zu erzeugen etc.

    Das gibt es in C++ nicht. C++ hat einige Konstrukte angefangen mit Polymorphie oder auch templates (wie deine Idee war) mit der man so Fallunterscheidungen wie gewünscht hinbekommt ohne sie explizit aufzuschreiben. Die funktionieren aber alle nicht mit Strings. Und letzendes ist alles was aus deiner json datei rauskommt erst einmal Text.

    In C++ hast du nach meinem Kenntnisstand also aktuell nur die Möglichkeit der Fallunterscheidung. Diese kannst du natürlich versuchen an andere Stellen des Codes zu schieben. Z.B. kannst du verschiedene json texte in unterschiedliche Objekte umwandeln und dann Polymorphie.
    Dann hast du halt die Fallunterscheidung beim parsing.

    Aber ganz ohne wird es aktuell nicht. Reflection in C++ Version X in der Zukunft könnte das möglicherweise ändern. Aber so sieht der Stand heute aus.



  • @booster sagte in Über Datentypen interieren:

    @hustbaer

    Ok sorry aber genau darum ging es mir doch dass ich nachher kein switch case bzw if construct habe.

    Naja, mein if Konstrukt ist schon grundlegend anders als das if/switch Konstrukt das du beschrieben hast.
    Es ist quasi equivalent zum Befüllen der Map die du mit deiner Variante brauchst.

    Aber hey. Wenn du deinen usecase und was du erreichen willst nicht besser beschreiben kannst... mir isses ziemlich egal wie du das jetzt löst.



  • @hustbaer

    Ist ja gut dass ihr meinen usecase nicht verstanden habt habe ich nun wiederum verstanden.
    Trotzdem danke dass ihr euch trotzdem so bemüht habt bei der Suche nach einer Lösung.

    Und nochmals das mit dem Lookuptabelle finde ich doch nun akzeptabel.

    Also gut jetzt. Danke nochmals an alle.



  • Es geht nicht darum, dich zu bashen oder sonstwie zu kritisieren, aber du musst lernen, deine Problem konkret beschreiben zu können. Das wird mit Sicherheit nicht das letzte Mal gewesen sein, dass du jemanden um Hilfe fragst.



  • @DocShoe Jep, ich hab gelernt das ich meine Fragen im überwiegenden Fall selbst beantworten kann, wenn ich mein Problem korrekt beschreiben kann.


  • Mod

    @daMicha sagte in Über Datentypen interieren:

    @DocShoe Jep, ich hab gelernt das ich meine Fragen im überwiegenden Fall selbst beantworten kann, wenn ich mein Problem korrekt beschreiben kann.

    +1. Man möchte meinen, ich stelle hier im Forum selten Fragen. Aber die Wahrheit ist, dass ich öfters Fragen anfange, aber mir dann solche Mühe gebe, alle Gegenfragen und Eventualitäten im Voraus zu beantworten, dass sich das Problem ganz von alleine löst.

    Das hat sogar einen Namen: Quitescheentchenmethode. Das ist meiner Erfahrung nach die mit Abstand beste Methode, um Fehler zu lösen. Es braucht natürlich eine gewisse Erfahrung und es ist gerade am Anfang hilfreich, wenn das Quietscheentchen ein echter erfahrener Programmierer ist, der dann auch leitende Gegenfragen stellt. Gerade das versuchen wir ja gerade in diesem Thread, aber leider springt booster nicht so recht darauf an.

    PS: Mein aus Erfahrung gewonnener wichtigster Tipp bei der Methode ist, dass ein Computer immer eine 100% deterministische Maschine ist. "Gremlins" wird zwar gern von verzweifelten Leuten als Erklärung heran gezogen (habe ich auch schon oft gemacht), aber es ist nie die Erklärung. Wenn die Beobachtungen nicht zu den Annahmen passen, dann müssen eben die Annahmen hinterfragt werden. (Beispiel Gremlins: Wenn die Maschine nicht-deterministisch erscheint, gibt es eine versteckte Variable, die man fälschlicherweise vernachlässigt hat)

    Der letzte Absatz hilft booster nicht weiter, aber das musste ich noch los werden. boosters Schwierigkeit ist, das Problem überhaupt sauber zu formulieren.



  • @booster sagte in Über Datentypen interieren:

    Ja sorry. Ich habe es oben beschrieben. Und dann habe ich auf Nachfrage versucht das anders zu beschreiben.

    Man kann hier im Forum die Beiträge editieren, so auch der Anfangsbeitrag mit der Problembeschreibung. Das macht es dann leichter die zu helfen.

    Ja das ist ja das was auch @Schlangenmensch vorgeschlagen hat. Die LoockupTabelle. Das hatte ich ja gesagt dass dieso wohl meine Lösung wird.....

    Man kann noch eine Factory darum bauen, und die Klassen sich selbst im Startup registrieren lassen etc.


Anmelden zum Antworten