Design für eine Klasse
-
Hallo,
ich habe ein Problem mit einem Klassen-Design
Ich soll eine Eventklasse für ein Kassensystem designen.
Leider fällt mir dazu nichts richtiges ein.
Das ist die Aufgabenstellung:
Aufgabenstellung
Die Firma entwickelte in den letzten Monaten eine neue Kassensoftware für ihre Filialen.
Eine Besonderheit ist dabei die Aufteilung in zwei getrennte Prozesse,
ein Verwaltungsprozess für die Kassenperipherie (KassenClient in C) und
ein Hardware unabhängiger Prozess für die Geschäftslogik (Kasse in C++).
Unter Linux gibt es mehrere Techniken für die Interprozesskommunikation
( Sockets, Shared Memory, Named Pipes, Message Queues, ... ).
In unserer Software verwenden wir Message Queues.D.h. Befehle (Kasse -> KassenClient) und Nachrichten (KassenClient -> Kasse)
werden durch Messages dargestellt und im jeweiligen Prozess interpretiert bzw. ausgewertet.ein paar Nachrichten sind z.B.
- Taste '1' wurde gedrückt
- Druckerabdeckung ist offen
- Scannerdaten sind vorhanden
- Schublade ist offen/zu
- Schublade ist gerade auf/zu gegangenein paar Befehle sind z.B.
- öffne Schublade
- drucke eine Zeile "ich bin eine Druckerzeile" auf den Bondrucker
- zeige "ich bin eine Displayzeile" auf dem KundendisplayDa die Geschäftslogik in C++ geschrieben wurde wird eine Message aus der Queue
gelesen und in ein Objekt einer Klasse POSEvent umgewandelt.wie könnte die Klasse POSEvent definiert sein?
Es ist auch nur eine Testaufgabe.
Was ich bis jetzt hab sind solche Sachen wie:
//Klassendefinition class POSEvent { public: POSEvent(); double GibGesamtBetrag(); double GibRestgeld(); ZahlungPerEC(); ZahlungPerBar(); ZahlungPerKreditkarte(); ZahlungErhalten(); ECKarteUngueltig(); KreditkarteUngueltig();Ich weiß einfach nicht, ob ich mich auf dem richtigen Weg befinde!
Klar ist mir natürlich auch, dass ihr mir jetzt hier keine Super Klasse hinzaubert.
Das erwarte ich auch nicht, mir wären Tipps, Denkanstöße, Hinweise oder Quellenangaben wo ich so etwas nachlesen könnte hilfreich.Ich hoffe, ich habe im richtigen Bereich gepostet.
Über jeder Hilfe bin ich dankbar.
Gruss Martin
-
Auf jedenfall braucht man Datenelemente, z.B. um eine Nachricht zu speichern. Dann könnte man auch alle Befehle in einer Liste, Struct, etc. speichern, sodass der Code lesbarer wird und das Anwenden der Befehle leichter wird.
Das selbe eigentlich auch für die Nachrichten, damit man diese leichter auswerten kann.Manche Datenelemente können sicher als const deklariert werden.
Und wenn es einen Befehl "öffne Schublade" gibt, sollte es auch einen Befehl für schließen geben und ein Datenelement, welches den Zustand der Schublade speichert.
Für den Bondruck muss man sich auch was einfallen lassen. Da über MQs kommuniziert wird, könnte man jede Bonzeile auch in der MQ als neue Zeile schreiben, in der ersten Zeile sollte man dann dem Client mitteilen, dass jetzt der Bondruck folgt mit dieser Nachricht.
Der Client muss das natürlich verarbeiten können. Ich weiß nicht, ob du auch für den verwantwortlich bist oder ob das ein anderer programmiert.Für jeden Befehl sollte man eben über passende Datenelemente und Methoden nachdenken. Und dann wie die Elemente deklariert werden könnten.
-
Auf jedenfall braucht man Datenelemente, z.B. um eine Nachricht zu speichern. Dann könnte man auch alle Befehle in einer Liste, Struct, etc. speichern, sodass der Code lesbarer wird und das Anwenden der Befehle leichter wird.
Das selbe eigentlich auch für die Nachrichten, damit man diese leichter auswerten kann.Soetwas evtl.:
#define ERROR 0 #define TIMEOUT 1 #define NOWAIT 2 ... /*Grundlegende Struktur einer Message*/ struct message_pos { int mess_type; /* Message Typ*/ long mess_size; /* Länge der Message*/ char *buffer; /* Text der Message*/ }; /*Erweiterte Struktur einer Message*/ struct message_pos { int mess_type; /* Message Typ*/ int sender; /* ID des Senders*/ int receiver; /* ID des Empfengers*/ struct info data; /* Beispiel: Länge und Inhalt der Message */ }; /*Funktionen*/ /*msgflag = Bezieht sich auf die Waitrichtlinien z.B. TIMEOUT oder NOWAIT*/ /*Rückgabewert = Message ID*/ int createMessage(int msgflag); /*Rückgabewert = Könnte eine Statusmeldung sein*/ int sendMessage(int messID, struct message_pos_Reno *mymess, int messsize); int receMessage(int messID, struct message_pos_Reno *mymess, int messsize); /*Schliesst den Message Queue*/ int closeMessage(int messID);Und wenn es einen Befehl "öffne Schublade" gibt, sollte es auch einen Befehl für schließen geben und ein Datenelement, welches den Zustand der Schublade speichert.
Das gibt es! Ausser das Datenelement.
Könntest du mir ein Beispiel zeigen und bin ich grundsätzlich auf der richtigen Spur?