Software Engineering Frage



  • Hallo,

    ich hab 2 Klassen instanziiert die in verschiedenen Threads laufen. Beide Klassen müssen sich kennen. In der einen Klasse läuft der Server der von einem Client Daten entgegennimmt. Die Server muss die daten dann an die andere Klasse übergeben. Das kann er nur wenn er sie kennt. Die andere Klasse wiederum muss dem Server mitteilen wenn sie Daten von der GUI erhält und diese wiederum der Server Klasse mitteilen. Also auch sie muss den Server kennen. Meine Lösung. Jeweils im Konstruktor die Klasse mitgeben. Wirkt jetzt bisschen verschachtelt für mich, deswegen die Frage hier..



  • kannst du so machen. c++ kann aber meine ich auch events.



  • HansKlaus schrieb:

    c++ kann aber meine ich auch events.

    Nicht "nacktes" Standard C++.



  • Peter_Mueller schrieb:

    Jeweils im Konstruktor die Klasse mitgeben.

    Du meinst Objekte?
    Jeweils? Wie gibst du etwas mit, das noch nicht existiert?
    Du hast dir auch Gedanken um die Threadsynchronisation gemacht?



  • Ja Objekte natürlich

    ClassA objA = new ClassA(objB);
    ClassB objB = new ClassB(objA);
    

    Und Threadsynchronisation mache ich indem ich eine while(!flag); loop einbaue wobei das flag immer vom anderen thread aktualisiert wird. Wenn ThreadA fertig ist dann setzt er das flag und schon wird die while loop verlassen und ThreadB kann seinen Code ausführen...



  • Super!



  • Das wird nicht übersetzt! Pointer? Wann existiert objB?

    ClassA objA = new ClassA(objB); // <=== objB gibt's hier nicht 
    ClassB objB = new ClassB(objA);
    

    Peter_Mueller schrieb:

    Und Threadsynchronisation mache ich indem ich eine while(!flag); loop einbaue

    flag ist std::atmoic<bool>?
    Busy wait?



  • sowas geht doch auch oder. Kann sein dass die C++ Syntax die 100% passt .

    ClassA objA;
    ClassB objB;
    objA = new ClassA(objB); 
    objB = new ClassB(objA);
    


  • Wie wäre es mit einer dritten Klasse, die die Kommunikation übernimmt?

    Die kannst du instantiieren und den beiden anderen per ctor-Injection mitgeben.



  • Ja mal sehen. Das ist dann eben Software Engineering. Es gibt eben mehrere Möglichkeiten..



  • Peter_Mueller schrieb:

    Das ist dann eben Software Engineering.

    Blabla





  • Oder das Observer Pattern (in seinen Formen) ...



  • Artchi schrieb:

    Schau die mal das Pattern an:
    https://sourcemaking.com/design_patterns/mediator

    Das C++ Beispiel ist ja grausig:
    https://sourcemaking.com/design_patterns/mediator/cpp/1

    * iostream.h
    * unnötiger Weise rohe Strings
    * unnötiges Postinkrement
    * rohe new/delete
    * Zuweisungen im Konstruktor an Stelle einer Konstruktorinitialisierungsliste



  • Was hat der "schreckliche" Beispielcode mit dem Pattern zu tun? Die Beispiele habe ich mir gar nicht angeschaut, weil Patterns erstmal von Code unabhängig sind!
    Und selbst wenn die Beispiele schrecklich sind? Heißt ja nicht das man gehindert wird es besser zu machen.

    Es ging um das Pattern, den Code muss Peter_Mueller natürlich für seine Bedürfnisse schreiben.



  • Es tut mir Leid, falls ich dich persönlich angegriffen haben sollte,
    aber ich bin schon der Meinung, dass Code-Beispiele zumindest grundlegenden Qualitätsansprüchen genügen sollten.

    Artchi schrieb:

    Die Beispiele habe ich mir gar nicht angeschaut, weil Patterns erstmal von Code unabhängig sind!

    Dem stimme ich generell zu. Trotzdem helfen Beispiele dem Verständnis ungemein.
    Dann wiederum ist mir gar kein Beispiel lieber als ein schlechtes.

    Artchi schrieb:

    Und selbst wenn die Beispiele schrecklich sind? Heißt ja nicht das man gehindert wird es besser zu machen.

    Es ging um das Pattern, den Code muss Peter_Mueller natürlich für seine Bedürfnisse schreiben.

    Auch dem stimme ich zu, allerdings habe ich aufgrund des Verlaufs dieses Threads meine Zweifel an den Fähigkeiten von Peter_Mueller.
    Aber ich lasse mich gerne eines besseren belehren 🙂



  • DrakoXP schrieb:

    Auch dem stimme ich zu, allerdings habe ich aufgrund des Verlaufs dieses Threads meine Zweifel an den Fähigkeiten von Peter_Mueller.

    Ach, seine anderen Threads hast du gar nicht gelesen? 😃



  • Peter_Mueller schrieb:

    Und Threadsynchronisation mache ich indem ich eine while(!flag); loop einbaue wobei das flag immer vom anderen thread aktualisiert wird. Wenn ThreadA fertig ist dann setzt er das flag und schon wird die while loop verlassen und ThreadB kann seinen Code ausführen...

    Ich hoffe das ist ein Scherz...



  • nee ich mach das so . Kein Scherz . Sorry



  • hustbaer schrieb:

    Peter_Mueller schrieb:

    Und Threadsynchronisation mache ich indem ich eine while(!flag); loop einbaue wobei das flag immer vom anderen thread aktualisiert wird. Wenn ThreadA fertig ist dann setzt er das flag und schon wird die while loop verlassen und ThreadB kann seinen Code ausführen...

    Ich hoffe das ist ein Scherz...

    Peter_Mueller schrieb:

    nee ich mach das so . Kein Scherz . Sorry

    Ich nehme an, er meint, dass diese Art und Weise unglaublich viel Performance schluckt. Auf der einen Seite machst du ein Busy Waiting, was einen Thread auslasten wird und dabei nutzt du (hoffentlich) einen Atomic, der zu lesen und zu schreiben sehr teuer ist. Jedenfalls unter Contention. Besser wäre da eine Condition Variable.


Anmelden zum Antworten