Klassen verwalten Klassen



  • Hey liebe Community,
    innerhalb der FOS müssen wir ein Projekt in C++ erstellen, das übertrieben objektorientiert ist, um uns diese Denkweise anzueignen. Daher haben wir die strenge Vorgabe, dass es innerhalb des Projekts 4 Klassen gibt. Zwei davon sind soweit sehr einfach zu verstehen: Sie erstellen die benötigten Objekte, die zu verwalten sind (in unserem Fall sind das einmal die Klasse Auto und die Klasse Auftrag). Die dritte Klasse ist zur Verwaltung eines jeden Autos(5 zu erstellen) für eine Auftragslage von 10 Aufträgen. In dieser dritten Klasse Buchung sollen entweder Autos mit dem anstehenden Auftrag verbucht werden oder aber auch storniert werden können.
    Die vierte Klasse Planung ist lediglich nur das Grundgitter, in dem in einem Menü durch Eingabe gewählt werden soll, ob z.B. gebucht werden soll.
    Meine Frage ist Folgende:
    Wie gestaltet man so eine Klasse, die nur zu Methodenzwecken dient? nach meiner Vorstellung von OOP müsste ich für jede Buchung ein Objekt Buchung erstellen, um dann erst auf die Methoden buchen oder stornieren zugreifen zu können. Ich wüsste aber auch nicht, wie ich diesen Konstruktor für eine "Verwaltungaklasse" gestalten sollte. Hat jemand damit Erfahrungen?
    Und: worin liegt hier aber der Vorteil zu der prozeduralen Art einfach Funktionen zu wählen? Ein weiterer des Projektes ist es, zusammenhängend Autos und ihre Buchungen anzuzeigen. Lässt sich das eben durch solche Objekte dann leichter realisieren?

    Ich danke schon jetzt für die große Verständnishilfe!



  • Hi @thewizardofoz,
    Na ja, was ist "übertrieben Objektorientiert"? Um sich die "objektorientierte Denkweise anzueignen" sollte man sich die drei Teilbereiche OOA/OOD und OOP einzeln anschauen.

    Das Ihr ein C++ Projekt mit Klassen (OOP) erstellen sollt, hat doch sicherlich eine Vorlauf (OOA/OOD) gehabt? Oder wie seid Ihr auf die einzelnen Klassen gekommen?

    Wenn Ihr dass schon nicht hattet, solltet Ihr doch zumindest einige Grunderfahrung in C++ haben, zumindest schon, wie man Klassen programmiert.

    Und wie sehen denn die Anforderungen aus, habt ihr die denn schon erarbeitet? Eine Frage wäre, wenn z.B. Autos angelegt werden sollen, sollen die nur für einen Programmlauf existieren oder sollen die nach einem Neustart wieder verfügbar sein (speichern?).

    Du brauchst also dedizierte Anforderungen die u.A. auch Prozessabläufe festlegen, wie z.B. "Es müssen Autos mit seine Attributen über eine Eingabemaske angelegt/gesucht/geändert/gelöscht werden können. Ein Löschen darf nur möglich sein, wenn nicht ...dies und das.
    Fang also mit dem an, ohne das andere nicht funktioniert; m.M. das Auto.

    Zu Deinen Fragen:
    Eine Klasse nur mit Methoden würde ich nicht bauen, sondern einen Namespace benutzen.

    Um ein Objekt der Klasse Buchung, die wohl so einige Attribute wie Datum, Referenz auf das zu buchende Auto etc. haben könnte, zu verwalten brauchst Du wie schon von Dir angedeutet, eine Buchungs-Verwaltungsklasse, einen Namen solltest Du dir noch ausdenken. Diese braucht keine speziellen Konstruktor, aber wohl so was wie eine Liste der Buchungen und Methoden diese Buchungen zu generieren/bearbeiten/stornieren etc. Auch wäre es schön, eine Auto für eine Buchung auswählen zu können, dafür wäre so was wie eine Autoverwaltungsklasse schön, die mir einfach mal die Autos anbietet u.s.w. Die Auto-Verwaltungsklasse wird dann nicht nur zum bearbeiten von Autos genutzt, sondern auch von der Buchungsverwaltungsklasse.

    Wenn im weiteren Verlauf schon bekannt ist, dass Autos mit ihren Buchungen angezeigt werden sollen, ist eine Entscheidung fällig, ob ich bei der Anzeige eines Autos die Buchungen durchsuche, um diese anzuzeigen, oder gleich beim Anlegen einer Buchung im referenzierten Auto, nicht gleich eine Gegenreferenz von Nöten ist.

    Noch ein Tip, mal die die Klassen auf und ziehe Verbindungen zwischen diese, welche Klasse Objekte anderer Klassen kennen muss, um arbeiten zu können.
    Jede Klasse sollte nur sie selbst betreffende Attribute haben.
    Jede Klasse sollte nur die Methoden haben, die sie selbst betreffen.
    Auch eine Bearbeitungsmaske sollte eine Klasse sein, sie sollte Methoden der zu Bearbeitenden Klasse/n nutzen (stell Dir vor, du brauchst später eine andere Bearbeitungsmaske, die willst du doch nicht gänzlich neu Programmieren).
    Sogar das Programm (Application) kann eine Klasse sein, die in der main aufgerufen wird.

    Ich bin mir nicht sicher, ob das Dir hilft, stelle dann einfach spezifischere Fragen.