Hallo Community!
Seit ein paar Tagen sitze ich an einem Plugin für einen Minecraft-Server und mache mir große (vielleicht auch zu große
) Gedanken um das Code-Design. Bis jetzt verwalte ich Objekte wie Städte, Grundstücke und User mit Managern wie CityManager, PlotManager und UserManager. Dabei verwende ich keine Singletons, sondern reiche die Manager an Instanzen wie UserListener weiter, welche diese benötigen. Die Manager benötige ich nur, um Listen einfacher verwalten zu können.
Nun bemerke ich aber, dass diese Lösung nicht so geschickt aussieht wie anfangs gedacht, was mir Sorgen bereitet. Momentan benötigen nämlich die Hauptklassen, die für Spielmechaniken wie "Grundstück kaufen" verantwortlich sind, so ziemlich alle Manager-Instanzen.
Ein Beispiel:
Die Klasse Plot (= Grundstück) speichert die User-ID des Grundstückbesitzers. Wenn ich also in irgendeiner Klasse oder Methode eine Referenz zu einer Grundstück-Instanz habe und den Usernamen des Grundstückbesitzers herausfinden möchte, muss ich auch auf die UserManager-Instanz zugreifen, da ich zuerst über den Manager die User-Klasse erhalte:
|
Java-Quelltext
|
1
|
String userName = userManager.getUserById(plot.getOwnerUserId()).getName();
|
Falls die User-Instanz nicht vorhanden ist, wird in der Datenbank nach der ID gesucht und eine neue User-Instanz erstellt mit den Variablen aus der Datenbankabfage.
Möchte ich herausfinden, in welcher Welt sich der User aufhält, benötige ich den WorldManager, welcher anhand der World-ID die World-Klasse ausgibt. Und so könnte das Spielchen weiterlaufen...
Sollte ich ein anderes Konzept anwenden?
Subclass Sandbox:
Alle Spiellogik-Klassen besitzen eine Referenz zur GamePlugin-Instanz, über die ich auf alle Manager zugreifen kann.
Singleton/Statische Klasse:
Ich greife global auf die Manager zu. Die verwendete API von Bukkit bietet selber eine globale Instanz an, um z. B. eine Liste aller Welten zu erhalten (
Bukkit.getWorlds()). Wäre es sinnvoll, auch das Konzept zu verfolgen und GamePlugin zu einem Singleton zu machen?
Oder kennt jemand einen besseren Weg?
Nette Grüße
GlowDragon