Design-Frage: Lockere Kopplung und Callback



  • Hallo,

    ich habe einen bestehenden Code, in dem eine Mini-Sprache geparst wird. Dabei emittiert ein Scanner Tokens. Diese Tokens werden durch statische Funktionen der abstrakten 'Token'-Klasse erstellt; beispielsweise (unvollständig):

    struct Token {
        static Token* Identifier(string const& name) { return new IdentifierToken(name); }
    };
    
    // Aufruf in der Scanner-Klasse:
    
    // … blabla
    return Token.Identifier(id);
    

    So. Inzwischen macht das Debuggen meiner kleinen Codes aber sehr viel Mühe, daher wollte ich den Parser jetzt ein wenig aufbohren, dass er Code-Positions-Informationen verarbeitet. Im wesentlichen bekommt die 'Token'-Klasse ein zusätzliches Feld 'm_CodeRange' ('CodeRange' besteht aus zwei 'CodeLocation's), und die Scanner-Klasse erhält ebenfalls ein Feld 'm_CurrentRange'.

    Dieses Feld muss ich jetzt bei der Erstellung eines Tokens initialisieren, und zwar mit 'm_CurrentRange' aus der Scanner-Klasse. Ich möchte aber nach Möglichkeit nicht überall in der Scanner-Klasse den Erstellungscode ändern. D.h. der Konstruktor der 'Token'-Basisklasse soll sich die Eigenschaft automatisch „ziehen“.

    Leider ist die 'Scanner'-Klasse auch kein Singleton, sonst wäre das trivial. Sieht trotzdem jemand eine möglichkeit, das sauber zu implementieren? Der offensichtliche Weg wäre ja jetzt, die ganzen statischen Methoden einfach in die 'Scanner'-Klasse zu verlagern und nicht-statisch zu machen. Das würde aber bedeuten, dass ich bei allen Unterklassen von 'Token' den Konstruktor anpassen müsste. Das gefällt mir nicht.



  • Hmm.

    Also du möchtest bei jeder Konstruktion eines Token Objektes dessen CodeRange mit dem Range von Scanner initialisieren, verstehe ich das richtig?

    Mir fällt da so, wie ich das jetzt versteht nur Übergabe und statische Funktionen ein (egal in welcher Art).



  • drakon schrieb:

    Also du möchtest bei jeder Konstruktion eines Token Objektes dessen CodeRange mit dem Range von Scanner initialisieren, verstehe ich das richtig?

    Ja.

    Mir fällt da so, wie ich das jetzt versteht nur Übergabe und statische Funktionen ein (egal in welcher Art).

    Hm ja, ich befürchte, ich muss es einfach umschreiben.


Log in to reply