Hallo,
ich hab eine art Moorhuhnjagd in Java gemacht. Anstatt Hühner gibts aber drollige Zombies. Es funktioniert alles ganz gut - trotzdem bin ich irgendwie unzufrieden mit dem Quellcode... wir haben im Studium immer wieder eingebläut bekommen, dass man sich bei der Modellierung der JavaKlassen am besten an der Realität orientiert, sprich: modelliere eine Klasse Zombie so, wie du ihn dir auch in wirklichkeit (ok blödes Beispiel
) vorstellen würdest.
Eine weitere "Regel" ist, dass man bei Klassenattributen unbedingt das Geheimnisprinzip wahren soll - mache alles möglichst Private und baue getter bzw. setter mit ein...
Um dann den Zugriff auf eine Klasse so gering wie möglich zu halten mache so wenig getter und setter wie möglich, sondern rufe lieber eine Zentrale Methode, wie z.b. "update()" auf, die dann Klassenintern alles selbstständig regelt...
Mit diesen drei Grundsätzen, die ja eigentlich schon irgendwie Sinn machen, habe ich einen Quellcode geshreiben, der zwar alles schön strukturiert - an dem mich aber einige Dinge vom Zugriff her massiv stören. Um zu erläutern, was genau ich meine hab ich mal den Aufbau des Spiels grob als UML-Diagramm dargestellt.
Uploaded with ImageShack.us
Erläuterung:
Spiel hat 3 Attribute, die jeweils spielrelevante Objekte separat
organisieren sollen.
Es sieht momentan so aus: Spiel.update() ruft drei Methoden auf:
1. interfaceverwaltung.update()
2. waffenverwaltung.update()
3. zombieverwaltung.update()
Diese rufen wiederrum selbst die updateMethoden ihrer Unterobjekte auf
z.B. die der Gun-Objekte und Zombie-Objekte.
Das gleich läuft mit der render()-Methode, den key- und
mouseListenern...
Stellt euch vor man feuert auf einen Zombie. Die keyPressed
Methode der Waffenverwaltung liefert ein Ereignis an die KeyPressedMethode der
aktuell ausgewälten Gun. Dann wird intern eine Kugel vom Magazin
abgezogen und so weiter... alles schön und gut.
Gleichzeitig soll aber auch überprüft werden, ob ein Zombie getroffen wurde. Also muss bei
einem wirklcihen Schuss (nicht bl0ß bei einem Klick) ein Event in der Zombie-mousePressedMethode ausgelöst werden.
Die einfachste Möglichkeit wäre es also das mousePressed-Event an die zombieverwaltungsklasse
direkt aus der GunKlasse zu übergeben. Denn - wenn z.B. das Magazin leer ist, wird auch nicht gefuert und dann muss auch keine Kollision aufgerufen werden.
Was habe ich also getan? Ich habe an die GunObjekte einInstanz von zombieVerwaltung übergeben,
um diese von der GunKlasse aus aufzurufen.
Macht man das so??? Wäre es nicht sinvoller die Zwischenebene der ganze VerwaltungsKlassen wegzulassen und einfach NUR eine Gun- und eine ZombieKlasse anzulegen, deren Objekte dann direkt in Spiel.java erzeugt und verwaltet werden?
liebe Grüße
Keltis
ich hab eine art Moorhuhnjagd in Java gemacht. Anstatt Hühner gibts aber drollige Zombies. Es funktioniert alles ganz gut - trotzdem bin ich irgendwie unzufrieden mit dem Quellcode... wir haben im Studium immer wieder eingebläut bekommen, dass man sich bei der Modellierung der JavaKlassen am besten an der Realität orientiert, sprich: modelliere eine Klasse Zombie so, wie du ihn dir auch in wirklichkeit (ok blödes Beispiel
Eine weitere "Regel" ist, dass man bei Klassenattributen unbedingt das Geheimnisprinzip wahren soll - mache alles möglichst Private und baue getter bzw. setter mit ein...
Um dann den Zugriff auf eine Klasse so gering wie möglich zu halten mache so wenig getter und setter wie möglich, sondern rufe lieber eine Zentrale Methode, wie z.b. "update()" auf, die dann Klassenintern alles selbstständig regelt...
Mit diesen drei Grundsätzen, die ja eigentlich schon irgendwie Sinn machen, habe ich einen Quellcode geshreiben, der zwar alles schön strukturiert - an dem mich aber einige Dinge vom Zugriff her massiv stören. Um zu erläutern, was genau ich meine hab ich mal den Aufbau des Spiels grob als UML-Diagramm dargestellt.

Uploaded with ImageShack.us
Erläuterung:
Spiel hat 3 Attribute, die jeweils spielrelevante Objekte separat
organisieren sollen.
Es sieht momentan so aus: Spiel.update() ruft drei Methoden auf:
1. interfaceverwaltung.update()
2. waffenverwaltung.update()
3. zombieverwaltung.update()
Diese rufen wiederrum selbst die updateMethoden ihrer Unterobjekte auf
z.B. die der Gun-Objekte und Zombie-Objekte.
Das gleich läuft mit der render()-Methode, den key- und
mouseListenern...
Stellt euch vor man feuert auf einen Zombie. Die keyPressed
Methode der Waffenverwaltung liefert ein Ereignis an die KeyPressedMethode der
aktuell ausgewälten Gun. Dann wird intern eine Kugel vom Magazin
abgezogen und so weiter... alles schön und gut.
Gleichzeitig soll aber auch überprüft werden, ob ein Zombie getroffen wurde. Also muss bei
einem wirklcihen Schuss (nicht bl0ß bei einem Klick) ein Event in der Zombie-mousePressedMethode ausgelöst werden.
Die einfachste Möglichkeit wäre es also das mousePressed-Event an die zombieverwaltungsklasse
direkt aus der GunKlasse zu übergeben. Denn - wenn z.B. das Magazin leer ist, wird auch nicht gefuert und dann muss auch keine Kollision aufgerufen werden.
Was habe ich also getan? Ich habe an die GunObjekte einInstanz von zombieVerwaltung übergeben,
um diese von der GunKlasse aus aufzurufen.
Macht man das so??? Wäre es nicht sinvoller die Zwischenebene der ganze VerwaltungsKlassen wegzulassen und einfach NUR eine Gun- und eine ZombieKlasse anzulegen, deren Objekte dann direkt in Spiel.java erzeugt und verwaltet werden?
liebe Grüße
Keltis