Designfrage



  • Hallo zusammen,

    ich habe hier ein Kommunikationsprotokoll. Im Verlaufe der Abarbeitung nimmt es den Zustand FLUSH ein. In diesem Zustand sollen alle eingehenden und ausgehenden Nachrichten in einem NextViewBuffer(NVB) zwischengespeichert werden. Dieser ist im wesentlichen ein Wrapper um zwei Warteschlangen. Bisher werden alle Nachrichten einfach an den NVB weitergereicht. Dieser schaut, ob er sie schon kennt und lagert dann die Nachricht ein (entweder in der Sende- oder Empfangswarteschlange, je nach dem).

    Um aber fehlerfrei im Protokollablauf zu sein, muss ich jetzt mehr prüfen. Zum Beispiel können Nachrichten kommen, welche schon vom Protokoll verarbeitet wurden, bzw. aktuell werden. Um das zu prüfen brauche ich "privaten/friend" Zugang zu anderen Klassen/Objekten. Damit ist der NVB aber keine einfacher Wrapper um zwei Warteschlangen mehr, sondern ne Mischung aus Logik und Container. Irgendwie bin ich mit dem Design nicht zufrieden.

    Daher die Frage: Wie würdet ihr es machen? Die Logik in das Objekt auslagern, welches den NVB befüllt? Die Logik im NVB lassen? Was sagen die Profis zu einen Zugriff auf private Member??? Ich hoffe auf Anregungen.

    Danke !
    gruß und so 😃


  • Mod

    sven_ schrieb:

    Zum Beispiel können Nachrichten kommen, welche schon vom Protokoll verarbeitet wurden, bzw. aktuell werden. Um das zu prüfen brauche ich "privaten/friend" Zugang zu anderen Klassen/Objekten.

    Ich verstehe nicht, wieso der zweite Satz aus dem ersten folgt.



  • Hallo SeppJ,

    also wenn man es genau nimmt, habe ich hier eine Sammlung von Protokollen, welche teilweise aufeinander aufbauen. Dies ist im wesentlichen ein schichtenweiser Aufbau. Unten ein Basis-Transportdienst, obendrauf verschiedenen Transport-Dienste, welche unterschiedliche Übertragungsparadigmen implementieren (virtuelle Synchronität, kausale Synchronität, ...). Diese höheren Transportdienste kapseln alle Funktionen im Sinne von Timer, Warteschlangen, Verwaltung gesendeter Nachrichten ... Von außen sehe ich nur Transportdienst A, Transportdienst B, ...

    Der NVB ist dem Basistransportdienst vorgeschalten. Um nun zu entscheiden ob eine Nachrichte a zwischengespeichert wird, oder doch behandelt werden soll, muss er Wissen von Transportdienst A haben. Transportdienst A weiß aber nicht, dass es einen NVB gibt sondern bekommt Nachrichten und verarbeitet diese.

    Ich habe schon überlegt, Zugang per Methode, also ohne friend, zu dem Wissen zu schaffen. Dann könnte aber jeder Dienst ran, der Transportdienst A erreicht. Das will ich ehrlich gesagt nicht.

    Daher kam ich nur auf die friend-Lösung. Wenn es besser geht, wäre ich glücklich. 😃



  • Hallo Sven, wenn du etwas detaillierter wärest, wäre die Frage leichter zu beantworten.

    Kennst du die volle Grammatik des Kommunikationsprotokolls? Dann würde ich die mit boost::spirit erschlagen! Und weiter die Verbindung mit boost::asio aufbauen, dann kannst du alle deine Wünsche erfüllen. Z.B. zwischen asio und spirit einen Buffer klemmen usw.


Anmelden zum Antworten