Probleme mit circular dependency



  • Hallo zusammen!

    Ich stecke gerade in einem Problem, was die Abhängigkeit mehrerer Klassen untereinander betrifft. Das Projekt handelt dabei um ein Billardspiel.

    Aufbau:

    Klassen:

    Game
    GameView

    Board
    Cue

    Ball
    BallWhite : public Ball
    BallBlack : public Ball
    BallColor : public Ball
    BallColorFull : public BallColor
    BallColorStripe : public BallColor

    Das Problem ist nun, dass zuerst einmal Game von ziemlich allen Klassen abhängt, und diese wiederum alle von Game. (Jede nichtGame-Klasse hat ein Attribut von Game und umgekehrt)

    Gibt es eine spezifische Methode, um das ganze möglichst elegant zu lösen oder bleibt da nur ausprobieren?

    Vielen Dank schon jetzt für alle Antworten!



  • Vielleicht hilft es schon, Game als Singleton zu machen. Sonst sehe ich aber nicht allzu viele Möglichkeiten als viele gegenseitige Verweise.

    Bzw: Ich persönlich finde Klassennamen wie BallColor in deinem Zusammenhang ungünstig, ich denke da zuerst, die Klasse repräsentiert eine Farbe für einen Ball, anstatt eines Balls mit einer Farbe.

    Edit: Wow, eine Sekunde Unterschied zwischen Beiträgen hat man auch nicht oft^^



  • nburger schrieb:

    oder bleibt da nur ausprobieren?

    Ja, wie immer halt. Tut mir leid. :p

    Natürlich gibt es da eine Methode. Und zwar solltest du dein Design überdenken. Warum muss Game alle anderen Klassen kennen und diese alle Game ? Wieso reicht es nicht aus, wenn Game die anderen Klassen kennt?



  • ipsec schrieb:

    Vielleicht hilft es schon, Game als Singleton zu machen.

    Davon rate ich stark ab. Singletons sind globale Variablen und bringen viele der entsprechenden Nachteile mit sich. Sie sind zwar ein besonders bequemer Weg, aber langfristig schafft man sich mit Singleton in etlichen Fällen unnötige Abhängigkeiten.

    Nicht ohne Grund gibt es Leute, die Singleton als Anti-Pattern bezeichnen. Es kann berechtigte Anwendungen haben, aber die sind tendenziell selten anzutreffen. Auf keinen Fall hat jede Klasse, von der es nur eine Instanz gibt, Singleton-Status verdient.


  • Mod

    Wenn du in einer der Klassen einen Zeiger auf eine andere hast, kann man das mit einer Vorwärtsdeklaration machen:

    class bar;
    
    class foo{
     bar *a;
    };
    
    class bar{
     foo a;
    };
    

    Sowas hingegen geht nicht:

    class bar;
    
    class foo{
     bar a;
    };
    
    class bar{
     foo a;
    };
    

    Das wäre ein Designfehler. Wie sollte dies funktionieren?


Anmelden zum Antworten