Finden des richtigen Objekts



  • Hallo C#-Forum,

    ich schreibe zurzeit ein kleines Quiz.
    Es gibt dort verschiedene Fragetypen, wie z.B. Fragen mit einer oder mehreren Antworten, Rechenaufgaben, Sortierfragen und noch mehrere.

    Lange Rede kurzer Sinn...Mein Anliegen:
    Ich muss natürlich die Antworten zu den Fragen verschieden behandeln (speichern).
    Ich habe in der Datenbank die Fragen mit ihrem Typ (siehe oben) gespeichert!

    Wenn ich nun zu einer Frage navigiere, muss ich dazu den passenden "Renderer" laden, mit dem ich dann die Antworten (je nach Fragetyp) behandle!

    Und das "Finden" des richtigen Renderers ist eigentlich meine Frage!
    Ich habe es bis jetzt so gelöst (ziemlich hässlich), dass ich einfach ein großes

    if (Question.Type.Name == "MultiOption")
    {
     return MultiOptionRenderer;
    }
    else if (...)
    {
     return ...;
    }
    ...
    

    schreibe und er mir so den richtigen Renderer zurückgibt.

    Ich finde diese Lösung echt ziemlich hässlich und frage euch deswegen, ob ihr ne bessere Lösung wisst wie ich zu dem richtigen Rendererobjekt komme...?!
    Vielleicht gibt es ja sowas wie das Virtuelle Dispatching von .NET, das in der Ableitungshiercharchie ja die gewünschte (überschriebene) Methode findet.

    Ich freu mich schon auf eure Antworten!
    Liebe Grüße



  • Ich sehe das Problem nicht. Wo genau hakt es? Bei der Klassenhierarchie? Bei der Objekterzeugung? Beim objektrelationalen Mapping? Was hast Du denn bisher? Wie sieht Dein Datenbankschema aus?



  • Es ist so, dass ich die Fragen am Anfang aus der Datenbank in Objekte lade! Das Frageobjekt hat ein Property "Type", das den Fragentyp darstellt (wird auch aus der Datenbank geholt).
    Nun kann der Benutzer zwischen den Fragen hin und her navigieren...jedes Mal, wenn er eine Frage auswählt wird, wird die neue angezeigt und die Antworten der "alten Frage" gespeichert!

    Dieses Speichern übernehmen Renderer, die alle eine Basisklasse haben und je nach Fragentyp, die Antworten unterschiedlich speichern!

    Wird nun eine Frage ausgewählt, muss ich auch gleichzeitig den korrekten Renderer (z.B. für Rechenaufgaben) laden, um die Antworten dann beim nächsten Wechsel der Frage zu sichern!
    Und das Laden des richtigen Fragenrenderers übernimmt bei mir eben die im 1. Post gezeigte (große und hässliche) if...else if-Verzweigung, in der ich alle möglichen Renderernamen mit dem Fragentyp der zu ladenden Frage vergleiche :-(!
    Ich finde das ziemlich billig und kann mir nicht vorstellen, dass es keine schönere Lösung gibt!

    Angenommen jetzt kommt ein neuer Fragentyp dazu und ich muss einen neuen Renderer schreiben, dann muss ich diesen auch erst wieder in diese if-Verzweigung übernehmen! Das Suchen und Finden des zu der Frage gehörenden Renderers sollte jedoch am besten automatisch gehen! Ich weiß, es ist sehr abstrakt gedacht, aber ich steh' nun mal auf schöne Lösungen :-)!

    Danke für die Mühe!
    Grüße



  • Nimm ein Dictionary<string, deinerendererbaseclass>.



  • Warum sind Deine Fragetypen nicht als Objekthierarchie abgebildet? Dann ist die 'Type'-Property überflüssig und das Problem mit dem Renderer erübrigt sich auch, weil jede Klasse in der Hierarchie ihren eigenen Renderer mitbringt.



  • Konrad Rudolph schrieb:

    ... weil jede Klasse in der Hierarchie ihren eigenen Renderer mitbringt.

    Ah ok, du meinst, das Frageobjekt ein Property 'Renderer' mit dem dazugehörigen Renderer besitzen muss...?!

    Ja ok, du hast gewonnen..ist echt ne gute Idee...hätte ich eigentlich selbst drauf kommen können...
    Danke dir


Anmelden zum Antworten