Thomasio hat gesagt.:
Ich glaube ich gebs derweil mal auf mit OOP, das ist eindeutig zu hoch für mich, ich kapiere wirklich nicht mal die allerersten Grundgedanken dahinter.
Hi, hi, du erinnerst mich sehr an mich selbst. Ich hatte auch wahnsinnige Probleme, bis ich dann mal über ein Text Adventure-Spielchen (M.U.D.) gestolpert bin, was so genial organisiert war, daß man das Prinzip der OOP von selber mitbekommen hat. Aber ich denke, ich kann dein grundlegendes Problem noch gut nachvollziehen.
Thomasio hat gesagt.:
Ich sehe einfach nicht, wie überhaupt irgendein Programmteil funktionieren soll, ohne Zugriff auf zumindest teilweise Variablen von anderen Programmteilen.
Exakt. Damit beschreibst du ganz klar und präzise dein echtes Problem. Du siehst einfach nicht den Sinn und überhaupt die Einsatzmöglichkeit der OOP. Das hat nichts mit doof oder zu dämlich zu tun. Wenn man jahrelang prozedular programmiert hat, dann ist OOP ein ziemlicher Tritt in's Gekröse. OOP ist nicht nur eine Syntaxform. OOP ist nicht nur eine Kapselung von Daten mit Methoden. OOP erfordert im
Design eine völlig andere Vorgehensweise als prozedurale Programmierung.
Thomasio hat gesagt.:
Wenn ich einen Ball zeichnen will,
Und schon quietschen bei mir die Bremsen das erste Mal.
Einen Ball zeichnen, ok.
Früher hätte ich dazu einfach eine Funktion in die Tasten gehämmert, die mir diesen Ball brutal und ohne Rücksicht auf Verluste auf den Bildschirm / Canvas zeichnet.
OOP erfordert aber erstmal tiiieef einatmen, entspannen, nachdenken.
Einen Ball zeichnen. Das sind schon mal 2 Dinge:
1. Objekt Ball.
2. Methode zeichnen.
Aber stimmt das so? Nein. Denn es stellt sich die Frage:
WO soll der Ball gezeichnet werden? Auf dem Bildschirm? Einem Drucker? Einem Speicherbereich (Stichwort Blitting)?
Also gibt es noch ein weiteres Objekt
X innerhalb dessen der Ball gezeichnet werden soll. Der Einfachheit halber gehe ich einmal vom Bildschirm aus. Das ergibt:
1. Objekt Bildschirm.
2. Objekt Ball.
3. Methode Ball zeichnen.
Und wieder komme ich in's Grübeln. Methode Ball zeichnen. Wohin gehört die denn? Zum Bildschirm? Oder zum Ball?
Und hier gibt es zwei Möglichkeiten:
- Entweder man teilt dem Objekt Ball mit, wo ein Objekt Bildschirm ist, verknüpft den Bildschirm mit dem Ball und führt dann die Methode Zeichnen innerhalb des Objekts Ball aus. Ehrlich gesagt - nicht so mein Fall.
- Oder man teilt dem Objekt Bildschirm mit, daß es ein Objekt Ball gibt und das Objekt Bildschirm bekommt die Methode zeichnen. Das wäre eher so mein Ansatz.
Thomasio hat gesagt.:
Wenn ich einen Ball zeichnen will, dann kann ich das in einem Beispieltutorial wunderbar mit einer Klasse machen, solange ich die genauen Koordinaten einfach vorgebe, ich kann das sogar mehrmals machen, muss aber jedesmal wieder die Koordinaten vorgeben
Wenn ich das in einem Spiel machen will, wo der Ball abhängig von irgendwelchen Spielfiguren gezeichnet wird,
Und wieder heisst es Einbremsen.
Da sind schon wieder neue Objekte, nämlich Spielfiguren. Das würde ich nicht so einfach ignorieren. Ok, in altem Spagetthicode kann ich die Spielfiguren erstmal ignorieren, aber vom Design her solltes du die bei der OOP nicht so nonchalant übergehen.
Thomasio hat gesagt.:
wo ich vor zeichnen erstmal feststellen muss, ob der Ball im Bild bereits existiert und wenn ja, dann muss der alte Ball gelöscht werden bevor der neue Ball gezeichnet wird, dann weiss meine Klasse
Welche Klasse denn?
Bei mir sähe es derzeit so aus, daß ich ein Objekt Bildschirm habe und dieses kann als Membervariablen ein Objekt Ball und ein oder mehrere Objekte Spielfiguren haben. Die ganz grobe Frage also, ob der Ball denn existiert, kann mir dann mein Objekt Bildschirm aber ganz sauber beantworten.
Thomasio hat gesagt.:
weder woher die Koordinaten für den Ball kommen sollen, weil die Klasse Ball keinen Zugriff auf Variablen der Klasse Spielfigur hat, noch ob der Ball überhaupt im Bild existiert, das Objekt wird in der Klasse gezeichnet und sofort wieder gelöscht, es existiert nur noch auf dem Bildschirm und ich müsste für jede noch so kleine Änderung im Bild den gesamten Bildschirm neu berechnen und komplett neu zeichnen, schlimmer, ich müsste auch ohne Änderungen im Bild ständig das Bild neu berechnen und neu zeichnen, einfach auf Verdacht, dass sich ja irgendwas geändert haben könnte, weil meine Klasse Bildschirmausgabe nun mal nicht weiss, wenn sich in irgendeiner anderen Klasse irgendein unsichtbarer Variablenwert ändert
Und exakt das wäre der Grund, weswegen ich mir ein Bildschirmobjekt machen würde, was die anzuzeigenden Spielelemente beinhaltet (ganz grob gesagt). Der Bildschirm kann dann ganz wunderbar steuern:
Bildschirm->Ball->MoveTo(X, Y): Den Ball bewegen
Bildschirm->CheckDistance(Ball, Spielfigur): Abstand zwischen Ball und Spielfigur berechnen
Bildschirm->Refresh: Das tatsächliche Bild auf dem Monitor neu zeichnen
etc. pp.
Um mal beim Bildschirm->Ball->MoveTo(X, Y) zu bleiben:
Innerhalb des Objekts Bildschirm will ich erstmal nur den Ball bewegen. Wie das programmiertechnisch
exakt umgesetzt wird, haue ich zur Not in das Ball-Objekt. Sollte sich der Ball jetzt nicht richtig bewegen, dann weiss ich, daß im Objekt Ball etwas nicht stimmt und kann mir das vornehmen. Stottert dagegen eine Spielfigur herum, schaue ich mir das Objekt Spielfigur nochmal an. Aber ich muß nicht ein paar Tausend Zeilen Source im Objekt Bildschirm abrackern.
Lass mal eines der Objekte in einem alten prozeduralen Programm falsch zappeln. Dann fängst du bei main() an und darfst mit dem Debugger Schritt für Schritt durchlaufen und schauen, daß sich auch ja nirgends irgendeine globale Variable unbeabsichtigt ändert. Und nach
jeder Variablenänderung musst du überlegen, ob du damit das Verhalten
irgendeines anderen "Dings" im Programm beeinflusst. Solche Programme habe ich auch schon geschrieben und das Debuggen war schon eine Qual, eine Wartung oftmals schlechterdings unmöglich.
Kann es sein, dass ich mich einfach nur selten dämlich anstelle? Ist mir ja schon peinlich, nach 1 Woche studieren nicht mal die Grundgedanken zu verstehen
Nein, das kommt dir nur so vor und braucht dir, meiner Meinung nach, keineswegs peinlich zu sein.
OOP ist eine andere Denkweise, um an ein Programmproblem heranzugehen, nicht nur eine Syntaxfrage. So doof es vielleicht klingen mag, aber vielleicht erhälst du einen besseren Einstieg in OOP, wenn du dir das Denkprinzip mehrmals durchgrübelst. Und nur nicht aufgeben, das hat bei mir auch recht lange gedauert.
Wenn du willst, dann können wir uns ja eine Kommunikationsplattform suchen (Mail, ICQ, wasweissich), du überlegst dir ein Miniprojekt zum Üben und ich helfe dir, die "OOP-Sichtweise" für das Projekt zu bekommen.