Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Und nochwas, weil es hier am Rande erwähnt wurde: Globale Objekte vermeiden, indem man Zeiger auf ein Objekt über 17 Ebenen an alle anderen Objekte hinunter reicht ist auch nicht unbedingt toller OOP Stil.
Und Listener endet nicht auf "er"? Davon abgesehen ist diese Aussage ziemlich verallgemeinernt. Demnach dürfte man nie Listener-, Observer- oder Adapterklassen verwenden. Es geht darum, dass Klassen einen möglichst aussagekräftigen Namen haben sollen. Aber manchmal muss man halt in ermangelung eines akkuraten Terms einen "Manager" machen. Es bringt nichts einen schönen Namen für ne Klasse zu haben, der aber im Grunde nichts aussagt. Und wenn man keinen guten Namen hat, müssen halt Kommentare herhalten (das gilt nicht nur für Klassen) bis man einen gefunden hat.Hatte letzten noch einen Artikel gelesen in dem stand "man schreibt keine Klassen die auf -er enden!". Finde aber den Link nicht mehr.
Grundsätzlich ging es um Manager/Helper usw. Klassen.
Bleiben wir mal bei dem Beispiel mit dem einfachen Spaceshooter. Man hat also eine Klasse für das Spaceship und dann eine Liste an Enemies.
Einen Manager für beides zu schreiben fühlt sich für mich sehr schräg an. Das Spaceship sollte alle Methoden beinhalten, die sich auf das Spaceship
beziehen. Kollisionsabfragen etc. gehören natürlich NICHT dort hinein. Das Spaceship braucht ja nicht zu wissen, dass es getrofffen wurde, denn das
ist Teil des Games. Also ist die Kollisionsabfrage außerhalb zu realisieren. Ich habe dafür einen Klasse CollisionDetector. Die verwaltet eine Liste
von Objekten und bei jeder Aktualisierung werden die einzelnen Kollisionen gesammelt und in einen Buffer geschrieben. Bloß nicht bei jeder Kollision
direkt per Event/Listener Pattern Nachrichten verschicken. Erst wenn ALLE Objekte durch sind, dann wird eine Nachricht an registrierte Listener verschickt
und als Nachricht geht mein CollisionBuffer auf Reisen. Hier kann dann jeder seine für sich relevanten Kollosionen abfragen.
In unserem Beispiel sind das aber NICHT das Spaceship und nicht die Enemies. Das geschieht in einer andere Klasse (zum Beispiel GameCore). Die behandelt
dann zum Beispiel was bei einem Treffer Spaceship-Enemy überhaupt passieren soll (Energie abziehen, Explosion starten, Sound abspielen etc.).
Mein CollisionDetector besteht aus einer Klasse UND diversen Methoden, die nicht in einer Klasse sind. Das sind vornehmlich Methoden um im CollisionBuffer nach
einer bestimmten ID oder einem Handle etc zu suchen oder ob zwei bestimmte Objekte in einer Kollision verwickelt sind.
Als Klassen hätte ich dann:
Kein Manager. Kein Helper. Spaceship zum Beispiel wird dadurch auch zu einer kleinen, einfachen Klasse.
- Spaceship
- Enemies
- CollisionDetector
- GameCore
Weiteres Beispiel wären Bullets. Unser Spaceship soll sich ja wehren können. Das Spaceship braucht das aber gar nicht zu wissen. Es besteht gar kein Zusammenhang zwischen Spaceship und Bullets. Beide werden nur durch die GameCore Klasse verwaltet.
C-/C++-Quelltext |
|
1 2 3 4 5 |
class EnemyManager { public: Enemy* createBoss(int energy); } |
Das ist der Grund warum zum Beispiel Java keine reine objekt orientierte Sprache ist. Denn in Java ist man gezwungen Methoden immer in Klassen zu kapseln.
Das widerspricht aber dem OOP.
Ich versuche nur zu sagen, dass es vollkommen legitim ist, wenn man auch eigenständige Methoden außerhalb von Klasse definiert. Das ist OOP.
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].
Seltsamerweise denken viele Leute bei OOP geht es NUR um Klassen und deren Methoden. Kaum einer denkt mal daran, dass Methoden auch außerhalb von Klassen existieren können und vor allem auch sollten.
Dennoch existieren weiterhin Methoden, die NICHT zu einer Klasse gehören. Da viele aber das Konzept nicht verstehen, entstehen plötzlich Manager/Helper etc. Klassen.
Aber nur weil sie denken, dass eine Methode schließlich in irgendeine Klasse rein MUSS. Das ist aber falsch.
Dieses Mißverständnis eisenhart durchgezogen führt dann zu Performance Problemen.
Ein großer Punkt von OOP ist Kapselung. Daten kapseln und nach außen verschleiern. Da passen dann freie Methoden erst mal genauso wenig rein wie irgendwelche globalen Variablen.
Das ist der Grund warum zum Beispiel Java keine reine objekt orientierte Sprache ist. Denn in Java ist man gezwungen Methoden immer in Klassen zu kapseln.
Das widerspricht aber dem OOP.
Der Grund für Manager oder Helper Klassen ist meiner Meinung nach, dass Leute halt auf teufen komm raus Methoden in Klassen kapseln wollen.
Oder sogar denken, dass man das nach OOP machen muß. Sie denken immer nur in Klassen. Das entspricht aber nicht dem OOP.
Ich versuche nur zu sagen, dass es vollkommen legitim ist, wenn man auch eigenständige Methoden außerhalb von Klasse definiert. Das ist OOP.
Vielleicht denke manche, man würde C und C++ vermischen und das wäre falsch. Aber es ist genau anders rum.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (13.10.2011, 12:36)
Werbeanzeige