Wozu brauche ich Klassen?
-
Hi Leute,
ich habe bisher nur sehr wenig Erfahrung in C++ bzw. objektorientierter Programmierung. Bisweilen habe ich nur mit proceduralen Programmiersprachen (ich denke so heißt das
), wie Basic programmiert.
Jetzt interessieren mich an C++ aber vor allem die Klassen, da ich mir hier neue Möglichkeiten erhoffe, daher auch meine Frage:
Bei welchem "Problem"/Wann/Wieso erstelle und benutze ich eine Klasse?Gruß
Scarabol
-
Das kann man so direkt nicht beantworten. Der zentrale Punkt ist, dass Du beim Schritt von der Prozeduralen Programmierung hin zur Objektorientierten Programmierung Deine Sichtweise auf das jeweilige Problem änderst. Und zwar, um komplexere Zusammenhänge beherrschbar zu halten und nicht so schnell den Überblick zu verlieren. IMHO ist der Schritt zur Objektorientierten Programmierung eindeutig an die Komplexität der zu schreibenden Software und somit auch an die Größe des Programmcodes gebunden. In kleineren Programmen, die nur ein paar hundert Zeilen lang sind, setze ich zumindest deutlich weniger Klassen und OOP ein. Auch wenn ich in einer Objektorientierten Sichtweise denke, dass ich eigentlich alles mögliche durch Klassen beschreiben sollte. Es kommt also auf das konkrete Problem an, ob man etwas als Klasse beschreiben sollte, oder ob so eine Beschreibung alles unnötig verkomplizieren würde.
Generell kann man sehr viel als Klasse modellieren. Nahezu jeden Begriff, der im Zusammenhang Deiner Software auftaucht. Im einfachsten Fall sind das wirklich ganz konkrete Arten von Objekten. So, wie man es halt in den Standardbeispielen zur OOP sieht: Fahrzeug, Auto, Motorrad, Säugetier, Fisch, Giraffe und so weiter. Wie Du siehst, geht es schon hier um Begriffe auf unterschiedlichen Abstraktionsebenen. "Fahrzeug" ist abstrakter als "Auto". Es beschreibt eine Oberklasse an Objekten. Aber Du kannst auch Beschreibungen als Klassen realisieren, die Dinge betreffen, die noch wesentlich weniger mit konkreten Objekten in Zusammenhang zu bringen sind. Du kannst zum Beispiel auch Prozesse in einer Klasse modellieren: Algorithmen zum Beispiel.
Ein weiterer Punkt ist, dass es auch sehr von der verwendeten Sprache abhängt, was man in Form einer Klasse modelliert und was nicht. OOP wird in unterschiedlichen Sprachen unterschiedlich unterstützt. Und unterschiedliche Sprachen bieten auch unterschiedliche weitere Sprachmittel, die vielleicht noch besser geeignet sind, um etwas bestimmtes zu beschreiben.
...und es gibt bestimmt noch 1000 weitere Aspekte, die man diesbezüglich bedenken könnte. Der Punkt ist, dass das Design eines Programms sehr viel mit Erfahrung zu tun hat. Das hat viel mit "Expertenwissen" zu tun, das schwer formulierbar ist. Man kann natürlich ein paar Regeln aufstellen, wie was zu modellieren ist, aber so wirst Du IMHO keine guten Programme schreiben. Du musst selbst die Erfahrung sammeln, wo Du Klassen gut nutzen kannst und wo nicht. Und Du musst selbst ein Gefühl dafür entwickeln bzw. eine entsprechende gedankliche Sichtweise entwickeln.
-
Gregor schrieb:
Ein weiterer Punkt ist, dass es auch sehr von der verwendeten Sprache abhängt, was man in Form einer Klasse modelliert und was nicht.
-
Scarabol schrieb:
Bei welchem "Problem"/Wann/Wieso erstelle und benutze ich eine Klasse?
Die Frage "wann benutze ich eine Klasse" ist in der OOP etwa so grundlegend wie die Frage "wann benutze ich Zahlen" in der Mathematik - Antwort: Immer! Genauer:
Du gehst zunächst mal von der Problembeschreibung aus.
Pi-mal-Daumenregel: Für jedes wichtige Subjekt in der Problembeschreibung ("Frage: wer macht etwas?") eine Klasse definieren und für jedes wichtige Verb ("Frage: was macht der?") eine Methode definieren.
Damit kommt man am Anfang schon recht weit. Für komplexere Aufgabenstellungen übersteigt der Aufwand zur Planung der Klasseneinteilung und ihrer Beziehungen untereinander nicht selten den Aufwand der Implementierung bei weitem (hängt im Einzelfall auch ein bischen von der Programmiersprache ab :D).
-
ok danke Leute,
das war schonmal ein kleiner Schritt in die richtige Richtung.
Um etwas konkreter zu werden, habe ich ein kleines Spiel programmiert, was noch nicht fertig ist, aber schon einige Aspekte hat die funktionsfähig sind. Nun hab ich bisher aber noch keine einzige Klasse verwendet und denke mir nun, dass ich damit langsam anfangen sollte, vor allem weil ich mehr über Klassen lernen möchte...
Also zum Spiel:
Ich habe ein kleines 3D Weltraumballerspiel mit Gegnern, Sprungtoren, mehreren Systemen, Stationen und Frachtgütern.
Die Gegner können abgeschossen werden.
Zwischen den Systemen kann man springen.
Mit den Stationen lässt sich handeln.Nun habe ich mir überlegt, dass ich Klassen wie Gegner oder sogar System erstellen könnte, aber was muss ich dann in die Klasse noch reinpacken außer die Daten des Gegner bzw. was kann ich in die Klasse mit reinpacken, oder sollte ich?
Bisher habe ich alles in einfach Datenstrukturen alla struct gepackt und es funktioniert dennoch einwandfrei.
Welchen Vorteil würde der Einsatz von Klassen mit sich bringen?
Lassen sich Klassen in diesem Projekt sinnvoll benutzen?
Um einen Gegner zu töten müssen an mehreren Stellen im Code immer wieder die gleichen Befehlsketten aufgerufen werden, lässt sich dies durch den Einsatz von Klassen vermeiden? oder vereinfachen?Gruß
Scarabol
-
Hi Scarabol,
dein Projekt ist sehr gut dazu geeignet, Klassen einzusetzen. Du hast die Daten für die grundlegenden Objekte deines Spiels (Stationen, Frachtgüter etc.) ja bereits in structs zusammengefaßt. Da ist es zur Programmierung mit Klassen nur noch ein kleiner Schritt.
Objektorientierte Progammierung besteht grundsätzlich darin, Daten und die Funktionen, die diese Daten bearbeiten, in einem Objekt zusammenzufassen.
Kleines Beispiel - mit structs und Funktionen programmiert im allgemeinen so:
struct Fighter { unsigned int mHitpoints; }; void HitFighter ( struct Fighter *pFighter, unsigned int pHits ) { // Fighter wurde getroffen, ziehe Hitpoints ab // vereinfachtes Beispiel ohne Parameterprüfung pFighter->mHitpoints -= pHits; }
In der objektorientierten Progammierung werden nun die Daten (struct) und die Funktionen (HitFighter) in einer "Klasse" zusammengeführt. In C++ sieht das dann so aus:
// Die Fighter-Klasse (stark vereinfachtes Beispiel) class Fighter { private: unsigned int mHitpoints; public: void Hit ( unsigned int pHits ); }; void Fighter::Hit ( unsigned int pHits ) { mHitpoints -= pHits; } // Im Programm sieht das dann so aus: Fighter FighterObject; FighterObject.Hit(3);
Gegenüber der Programmierung mit structs und Funktionen hat das unmittelbare Vorteile. So werden z.B. alle Funktionen, die mit Fighter-Objekten arbeiten, in der Klasse zusammengeführt und sind nicht mehr über den ganzen Code verstreut.
Der Wert für "Hitpoints" wird durch das Schlüsselwort "private" für den Zugriff von außen gesperrt, d.h. daß nur noch das Fighter-Objekt selbst auf diesen Wert zugreifen darf. Man nennt das "Kapselung".
Insgesamt wird dein Programm bei der Verwendung von Klassen leichter wartbar und veränderbar.
Objektorientierte Programmierung hat - unabhängig von der Sprache - noch weitere Vorteile. Man kann z.B. von bestehenden Klassen neue "ableiten", d.h. eine neue Klasse übernimmt alle Datenwerte und Methoden fix und fertig aus einer bereits bestehenden Klasse und definiert nur noch, was neu hinzukommt.
Wenn ich dir einen Tip geben darf: Nimm dir ein gutes C++-Buch und schau dir die ganze Sache dort nochmals gründlich an. Dann änderst du mal eine Datenstruktur deines Programms in eine Klasse. Ich denke, daß du die Vorteile dann ganz schnell selbst erkennen wirst.
In diesem Sinne, viel Erfolg
VV
-
ok, alles klar Leute, vielen Dank an alle, ich denke ich werd jetzt versuchen, das ganze anzupacken, mal sehen was draus wird...
Gruß
Scarabol