Gesucht: Factory für die Messageverarbeitung aus Socket



  • Achso. Jetzt weiß ich was du meinst. Einfach nur eine map auf eine Funktion, die als Parameter die "const StandardMessage &msg" übernimmt.

    Ja das ginge auch. Ich wollte aber den parse-Vorgang irgendwo zentral halten. Nur dass er jedesmal auf ein anderes Objekt aufgerufen wird.
    Aus einem einfachen Grund:

    Es wird nicht nur bei diesem parse()-Aufruf bleiben ( der ist in der Basisklasse sogar vergraben ). An der Stelle wird noch mehr Quellcode hinzukommen, daher wollte ich das nur einmal programmieren, aus Gründen der Fehlerminimierung. Bei am Ende ~30 Messages müsste ich den Parse-Kram 30 genau so oft programmieren.



  • template <typename Msg>
    Msg parse(const StandardMessage &msg)
    {
        Msg m;
        m.parse(msg);
        return m;
    }
    
    void handleMessage1(const StandardMessage &msg)
    {
       auto m = parse<Message1>(msg);
       ...
    }
    
    


  • Bekommt man dieses Konstrukt

    template <typename Msg>
    Msg parse(const StandardMessage &msg)
    

    Nur bekommt man dieses Konstrukt nicht als std::function in eine Map rein, oder täusche ich mich da?



  • @It0101 Nein, da steht handlemessage1 drin



  • Ja verstehe, worauf du hinaus willst. Das funzt natürlich. Ich wollte aber Quelltextvermehrung sparen. Und so habe ich quasi pro MsgType eine "handle"-Funktion und in jeder steht "parse". Naja ich tüftele mal noch ein bisschen, vielleicht krieg ich es noch besser hin. Danke dir erstmal!



  • @It0101 sagte in Gesucht: Factory für die Messageverarbeitung aus Socket:

    void onMessageReceived( const StandardMessage &msg )
    {
    switch ( type )
    {
    case 1 :

    Irgendwo im Ablauf setzt du die variable 'type'. Dort entscheidest du bereits, welcher MessageTyp verarbeitet werden soll. Weshalb gehst du den Umweg über einen numerischen Wert und wandelst diesen wieder in ein Objekt des gewünschten Typs?



  • @osdt sagte in Gesucht: Factory für die Messageverarbeitung aus Socket:

    @It0101 sagte in Gesucht: Factory für die Messageverarbeitung aus Socket:

    void onMessageReceived( const StandardMessage &msg )
    {
    switch ( type )
    {
    case 1 :

    Irgendwo im Ablauf setzt du die variable 'type'. Dort entscheidest du bereits, welcher MessageTyp verarbeitet werden soll. Weshalb gehst du den Umweg über einen numerischen Wert und wandelst diesen wieder in ein Objekt des gewünschten Typs?

    Der Quelltext ist nur symbolisch. Die Message besteht aus einem Header und der Nutzlast. Der Header wird direkt am Anfang geparst, weil für die Verarbeitung ja erstmal die MessageLaenge notwendig ist. In dem Header ist auch der "type" enthalten.



  • Du kannst dir auch das Visitor Pattern mal anschauen! Das sollte deine Problemstellung auch elegant lösen.



  • @pmqtt
    Ne, passt hier nicht.



  • Wenn man hier eine Factory nutzt, wird es keine Factory Methode sein können. Es müsste eine Factory Klasse sein, da man nur so in der Factory die Parser registriert bekommt. Diese Factory führt man sinnvoller Weise als Meyers Singleton aus, so dass die Parser sich in der statischen Initialisierung in ihr selbst registrieren. Damit das unabhängig von der Linkreihenfolge funktioniert, muss es ein Meyers Singleton sein. Die Parser werden ebenfalls als Singletons ausgeführt, und man legt jeweils eine statische Variable an, dadurch wird jeder Parser initialisiert und registriert sich selbst beim statischen Init des Programms.

    Verzichtet man auf Singletons, muss man das ganze von Hand beim Programmstart initialisieren.


Anmelden zum Antworten