Planung und Organisation von OOP mit C++
-
Hey ich komme aus der C Welt und habe momentan ein Problem damit "richtig" in OOP zu denken.
Folgendes Problem:
Datei erzeugen
Daten in das File schreiben
Daten aus dem File lesen
Daten verändern
Daten wieder in das File schreiben
fertig!Mach ich hier nun zu jedem Problem eine Klasse?
Sollte man diese verschachteln?Irgendwie fehlt mir hier der richtige Ansatz!
Ich habe nun eine Klasse gemacht die mir ein File erzeugt und die Daten schreibt.Ich habe nun in der Programmschleife ein Objekt, das die Arbeit übernimmt die Datei zu erzeugen und die Daten zu schreiben.
Soll man nun dieses Objekt löschen, und ein anderes Erzeugen das den nächsten Schritt erledigt. Oder sollte man die Klasse so aufbohren das sie die anderen Sachen auch noch machtWeiß einer vielleicht eine guten Link der ein kleines Beispiel dabei hat oder auch etwas Info zu "guter" OOP.
Gruß
Jürgen
-
also ich denke mal für eine noch triviale aufgabe reicht es ein normales programm mit vielen ausgelagerten funktionen zu schreiben.
-
Stumpf schrieb:
Folgendes Problem:
Datei erzeugen
Daten in das File schreiben
Daten aus dem File lesen
Daten verändern
Daten wieder in das File schreiben
fertig!Das ist eine sehr schöne Top-Down-Sicht. Erstmal alles zerlegen, über die Implementierung machen wir uns später Gedanken. Das ist allerdings nicht die Art und Weise, in der OOP funktioniert. OOP ist grundsätzlich Bottom-Up, man fängt mit den Grundbestandteilen an und setzt sie peu-a-peu zu einem funktionierenden Ganzen zusammen. Du musst dich also erstmal fragen, welche Objekte in deinem Problem vorkommen. Womit hantierst du da? Was genau sind die Daten, die da verändert werden?
Falls das "Daten verändern" so trivial ist, dass dir dazu keine Objekte einfallen, dann ist OOP hier wahrscheinlich nicht das richtige.
Mach ich hier nun zu jedem Problem eine Klasse?
Sollte man diese verschachteln?Nein. Ein Objekt wäre z.b. die Datei, aber dazu gibts schon Klassen (std::fstream und Konsorten). Das Lesen der Daten ist (erstmal) kein Objekt.
Wie man in einem gegebenen Problem die Objekte findet, das ist eine Kunst für sich und fällt unter den Begriff OOA (Objektorientierte Analyse).
-
Aber wirklich geholfen habt ihr mir nun nicht.
Wisst ihr einen guten Link für mehr Infos?
Wie man in einem gegebenen Problem die Objekte findet, das ist eine Kunst für sich
Und das kann man auch überall lesen, aber wie man das macht sagt keiner.
Alles immer sehr wage.Ich brauche mehr Infos denn so wird das wahrscheinlich nichts.
-
Stumpf schrieb:
Aber wirklich geholfen habt ihr mir nun nicht.
Wisst ihr einen guten Link für mehr Infos?
Wie man in einem gegebenen Problem die Objekte findet, das ist eine Kunst für sich
Und das kann man auch überall lesen, aber wie man das macht sagt keiner.
Alles immer sehr wage.Ich brauche mehr Infos denn so wird das wahrscheinlich nichts.
naja das ist nunmal Programmieren, jeder hat eine andere Möglichkeit um die Probleme zu lösen. Leider gibt es dafür keine bestimmten Richtlinien.Es gibt Aufgaben da muss man mit Klassen arbeiten und es gibt wieder Sachen da muss man das nicht. Je nachdem wie hoch der Aufwand ist.
-
Stumpf schrieb:
Ich brauche mehr Infos denn so wird das wahrscheinlich nichts.
Du denkst zu Funktionsorientiert.
Ganz davon abgesehen gibt es solche Klassen bereits in der STL.Stumpf schrieb:
Folgendes Problem:
Datei erzeugen
Daten in das File schreiben
Daten aus dem File lesen
Daten verändern
Daten wieder in das File schreibenEin paar Anhaltspunkte:
Such in einer Anforderung nach den Hauptwörtern, die sind in der Regel Kandidaten für eine Klasse, oder zumindest für Eigenschaften einer Klasse.In diesen Fall gibt es (nachdem ich mich auf eine Sprache beschränke und nicht Deutsch und Englisch mische) zwei solche Kandidaten:
Datei und Daten
Eine Datei ist schon mal recht greifbar, also würde ich das schon mal als keine schlechte Wahl empfinden. Daten ist mir zu schwammig, dies werde ich Vorläufig noch nicht betrachten.
Also haben wir erstmal eine Klasse Datei. Was kann man nun mit der Datei alles anstellen? Ahh ja, hier kommen die Funktionellen Beschreibungen ins spiel. Ich übertrage mal anhand deiner Beschreibung grob auf die Klasse:
|-------------------| | Datei | |-------------------| | | |-------------------| | neuanlegen | | speichern | | laden | | setzen | |-------------------|
So. Wir wissen aber auch das eine Datei aus Daten bestehen, und wir wollen auch Daten setzen. Zum anderen benötigst du auch noch andere angaben wie Pfad und Dateiname. Zudem will ich mich von dem anlegen/bearbeiten als Funktion verabschieden, da es meines erachtens ein Modus ist, was man wiederum als Attribut definieren kann.
Machen wir mal blind weiter, ohne sehr genau zu werden:
|-------------------| | Datei | |-------------------| | dateiname | | pfad | /\ 0..n |-------------------| | modus |< >------------>| Daten | |-------------------| \/ |-------------------| | speichern | | setzen | |-------------------|
Das setzen ist mir zu ungenau, zudem wiederspricht es so den Streams aus C++. Auch das ändere ich mal. Zudem ändere ich noch ein wenig an der weiteren Darstellung.
|-------------------| /\ 0..n |-------------------| | Datei |< >------------>| Daten | |-------------------| \/ +daten |-------------------| | dateiname | | pfad | |-------------------| |-------------------| | <<enumberation>> | | speichern | | Modus | | operator<< |-----------------|-------------------| | operator>> | +modus | neu = 0 | |-------------------| | bearbeiten = 1 | |-------------------|
Dies soll nur mal ein Ansatz, keine Endgültige Lösung darstellen.
cu André
P.S: Ich garantiere nicht für eine 100%ige UML-konformität
-
Stumpf schrieb:
Wisst ihr einen guten Link für mehr Infos?
Hallo Jürgen,
na der Klassiker Wikipedia geht immer. Hier findest Du unter Literatur und Weblinks auch noch genug weiteres Material.
Stumpf schrieb:
Wie man in einem gegebenen Problem die Objekte findet, das ist eine Kunst für sich
Und das kann man auch überall lesen, aber wie man das macht sagt keiner.
Alles immer sehr wage.Das bleibt auch so; man muss das einfach üben, sich gute und schlechte Lösungen ansehen und viel darüber nachdenken, warum das eine besser ist als das andere.
Stumpf schrieb:
Ich brauche mehr Infos denn so wird das wahrscheinlich nichts.
Nein - Du brauchst mehr Übung. Das zeigt schon Deine 'Programmbeschreibung':
Stumpf schrieb:
Folgendes Problem:
Datei erzeugen
Daten in das File schreiben
Daten aus dem File lesen
Daten verändern
Daten wieder in das File schreiben
fertig!Es gibt wohl nur ganz wenige Programme, auf die diese Beschreibung nicht (!) zutrifft. Was ist der Zweck Deines Programms? Was ist der Input? und was soll der Output sein? Deine Beschreibung hört genau da auf, wo OOP anfängt.
.. und beschreibe es zunächst so, dass Du nicht gleich an's Programmieren denkst; sondern vielleicht so, als ob Du Chef von einer Gruppe Leuten wärst und die dann diese Aufgabe für Dich erledigen - aber ohne PC!Ein Beispiel für OOP und kein OOP war kürzlich hier im Forum. Eine Programm zur Berechnung von Statistischen Größen.
Schau Dir dies mal genau an; und überlege was bei folgendem Lösungsansatz ...class Statistik { public: Statistik(); void add( double x ); // Wert hinzufügen // --- Ausgabe der statistischen Werte (Sigma, Varianz, Spannweite, u.a.) friend std::ostream& operator<<( std::ostream& out, const Statistik& s ); private: // ein paar member ... }; // und sonst keine (!) weiteren Methoden
... anders ist.
Gruß
Werner
-
Wenn diene Beschreibung etwas besser wäre, könnte man mehr sagen. Allgemeine Idee: Pack deine Daten in eine Klasse mit Methoden zum Ändern/Setzen/Abfragen. Dann kannst du noch Methoden zum lesen und schreiben machen und diese auch in diese Klasse packen oder in eine zweite, falls das Lesen und Schreiben einfach ausgetauschbar sein soll.
-
Stumpf schrieb:
Weiß einer vielleicht eine guten Link der ein kleines Beispiel dabei hat oder auch etwas Info zu "guter" OOP.
Gruß
JürgenBuchempfehlungen finde ich hier angebracht:
Grady Booch, Object-Oriented Analysis and Design with Applications
Heide Balzert, Lehrbuch der Obejktmodellierung