klassen design frage...



  • hallo zusammen,

    ich arbeite schon seit lägerem mit einem bestimmten klassen-konzept, bei dem ich mir aber nicht wirklich sicher bin ob das so sinnvoll ist oder verbessert werden könnte. da ich nicht meinen ganzen quellcode hier veröffentlichen möchte, hier ein kleinen beispiel.

    eine applikation verwaltet eine liste (MyList) und eine andere klasse nimmt kommandos über konsole entgegen (MyConsole). in wirklichkeit sind es natürlich viel mehr klassen.

    /* mylist.h */
    class CMyList
    {
    	Add(...);
    	Del(...);
    	...
    };
    
    /* mylist.h */
    class CMyConsole
    {
    	Read(...);
    	...
    };
    

    diese beiden erzeuge ich in meiner main-klasse, weil sie nur EINMAL benötigt werden, aber während der ganzen laufzeit.

    /* main.h */
    class CMain
    {
    	CMyList MyList;
    	CMyConsole MyConsole;
    };
    

    wenn ich mich jetzt aber in MyConsole.Read() befinde, kann ich kein MyList.Add() ausführen, weil ich die adresse von MyList nicht kenne.
    aus diesem grund steht am ende meiner main.h:

    extern CMain *global;
    

    jetzt kann ich so auf meine MyList zugreifen:

    global->MyList.Add();
    

    man stelle sich das ganze mit mehreren liste und mehreren threads vor.
    ist diese vorgehensweise sinnvoll/üblich oder gibt es einen *besseren* weg?

    vielen dank im voraus!
    gjoe.



  • Globale Variable, kein gutes Konzept, hier stinkts etwas nach Fehldesign 🙂

    Ich denke da eher so an eine Klasse Application, diese wiederrum läuft dann zB in der Schleife Input -> Process -> Output (weiß jetzt nicht ob der WorkFlow günstig ist, sieht aber nach Konsolenprogramm aus).

    Auf keinen Fall aber ist Input schon dafür verantwortlich Process zu übernehmen. Das ist eine Mixtour die sich auf Dauer nur negativ auswirken kann.

    BTW: Die Syntax lautet "class Name" und nicht "class CName"... 😉

    MfG SideWinder



  • SideWinder schrieb:

    Globale Variable, kein gutes Konzept, hier stinkts etwas nach Fehldesign 🙂

    Ich denke da eher so an eine Klasse Application, diese wiederrum läuft dann zB in der Schleife Input -> Process -> Output (weiß jetzt nicht ob der WorkFlow günstig ist, sieht aber nach Konsolenprogramm aus).

    ok, das würde bei einer "einfachen" anwendung funktionieren. die konsole spielt dabei eigentlich keine rolle, das hat sich nur für mein beispiel angeboten 😃

    also um das etwas zu konkretisieren, die eingabe erfolgt über eine gui, mit mehreren threads im hintergrund. zusätzlich werden aktionen über sockets entgegengenommen.

    das mit der *EINEN* globalen variable fand ich jetzt nicht so als designfehler, weil ja nur eine im ganzen projekt :p

    gjoe.



  • Wenn da mehrere Threads im Spiel sind, dann finde ich eine zentrale Variable zu haben (und die spuckt dann auch noch Zugriff aus) für sehr bedenklick. Da enstehen dann Anomalien wie bei Datenbanken. Da musst du dann sehr viele Semaphoren einsetzen was das Programm deutlich abbremst.

    Ich würde irgendeinen Manager schreiben der als Zwischeninstanz zwischen dem gesamten Input und den Daten steht, sonst geht da bestimmt was schief. Diese Manager-Klasse kann dann den Input der einzelnen Threads jeweils abfragen oder lässt sich per Callback aufrufen und verarbeitet das dann wie gewünscht.

    MfG SideWinder



  • ok, ich seh schon. ihr empfehlt mir beide eine übergeordnete klasse, die den rest kontrollieren.

    @SideWinder:
    mit den aomalien hast du natürlich recht, die sind auch schon aufgetreten.
    z.b. wenn ich einen neuen eintrag zur liste hinzugefügt hab und gleichzeitig in einem anderen thread ausgelesen...
    hab dann an diesen stellen mit mutex gearbeitet.

    gjoe.



  • ok, ich seh schon. ihr empfehlt mir beide eine übergeordnete klasse, die den rest kontrollieren.

    Das ist zweimal (jetzt dreimal) der Selbe 😉 Also warte noch auf Postings von anderen Leuten 🙂 Soll durchaus erfahrenere Entwickler hier geben die in Punkto Allgemeines Programmdesign mehr Erfahrung haben 🙂

    MfG SideWinder



  • SideWinder schrieb:

    Das ist zweimal (jetzt dreimal) der Selbe 😉

    oh gott wie peinlich, das hatte ich total übersehen 😃


Anmelden zum Antworten