Du bist nicht angemeldet.

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

GlowDragon

Frischling

  • »GlowDragon« ist der Autor dieses Themas

Beiträge: 66

Wohnort: Bayern

Beruf: Informatikstudent

  • Private Nachricht senden

1

19.01.2015, 21:05

Verwaltung von Listen mit Managern?

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

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »GlowDragon« (21.01.2015, 17:41)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

20.01.2015, 07:07

Finger weg von Singletons. Übergib den Klassen, was sie zum Leben brauchen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

GlowDragon

Frischling

  • »GlowDragon« ist der Autor dieses Themas

Beiträge: 66

Wohnort: Bayern

Beruf: Informatikstudent

  • Private Nachricht senden

3

20.01.2015, 17:00

Nach etwas Überlegung ist mir auch eingefallen, dass es überhaupt kein Problem ist, auf die Hauptklasse der API global zuzugreifen, da ich den Code dieser Klasse ja gar nicht kennen muss und im Falle eines Tests nicht mocken müsste. Die Abhängigkeit ist zwar nicht sichtbar, aber offensichtlich, da es sich ja bei dem Projekt um ein Plugin handelt. Werde also weiterhin keine Singletons für meinen eigenen Klassen nutzen.

Ich fühle mich aber immer noch unsicher, was meine Umsetzung des Projektes angeht. Ist es denn sinnvoll, für Listen wie Grundstücke, Städte, Welten, usw. einen Manager zu verwenden, wenn für jeweils eine Liste eine Tabelle in der Datenbank existiert?

Manager-Klassen werden ja auch kritisiert, vorallem wenn die Methoden dieser Manager auch in der Klasse stehen können, um die es eigentlich geht. Zum Beispiel verwenden manche Programmierer userManager.setPosition(User user, Position position) statt user.setPosition(Position position). Ich mache diesen Fehler aber nicht. Setze ich den Manager also dann richtig ein, wenn es nur eine Möglichkeit gibt, um die Position des Users zu verändern?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

20.01.2015, 17:48

Mir stellt sich die Frage: Welchen Nutzen hat der Manager? Wer genau braucht denn die User? Und warum können die nicht direkt bei dem liegen, der sie braucht? Was eventuell wirklich Sinn macht, das ist eine Factory, die Dir User erzeugen oder ein Repository, welches aus einer DB lesen kann. Aber eine Liste von Usern zu halten, braucht es das? Vielleicht ist "Manager" aber auch einfach mal nur ein sehr schlechtes Wort für das, was Du willst? Ein UserCache oder UserRepository(/UserService) klingt für mich eher nach dem, was Du suchst.
Ich z.B. mag das Wort "Manager" überhaupt nicht. Es steht in viel zu vielen Projekten drin und sagt nie wirklich etwas darüber aus, was so ein Manager genau tun soll.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

GlowDragon

Frischling

  • »GlowDragon« ist der Autor dieses Themas

Beiträge: 66

Wohnort: Bayern

Beruf: Informatikstudent

  • Private Nachricht senden

5

20.01.2015, 19:00

Mit den Begriffen habe ich mich noch nie beschäftigt. Ich danke dir für die Namensvorschläge! Nun hab ich folgende Klassen:
UserCache: Weil User erst bei Bedarf geladen werden.
PropertyRepository: Weil Grundstücke und Städte von Anfang an im Arbeitsspeicher liegen. Sie werden in einer Klasse gehalten, da sie meist zusammen gebraucht werden.
World..?..: Diese Klasse erstellt nur neue Welten und enthält zusätzliche Informationen zu diesen. Bin mir da bei der Namensgebung nicht sicher.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »GlowDragon« (20.01.2015, 19:09)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

20.01.2015, 19:41

Wozu brauchst Du eine Klasse, die neue Welten erstellt und enthält? Wäre nicht eine einfache World-Klasse, die bei Bedarf erstellt wird, irgendwie sinnvoller? Wenn es etwas gibt, was viele Welten enthalten kann, wie ein Editor oder so, dann braucht das Ding nur eine Liste, aber keinen spezielle Klasse, die alle Welten hält und erstellt.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

GlowDragon

Frischling

  • »GlowDragon« ist der Autor dieses Themas

Beiträge: 66

Wohnort: Bayern

Beruf: Informatikstudent

  • Private Nachricht senden

7

20.01.2015, 20:21

Das Problem ist, dass ich zusätzliche Informationen zur Welt speichern möchte und ich die World-Klasse nicht einfach bearbeiten kann, da sie zur Bukkit API gehört. Außerdem müssen Welten auf einem Minecraft-Server schon zu Beginn erstellt werden, zu einem anderen Zeitpunkt ist es nicht möglich.

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

8

20.01.2015, 20:27

Die World/User/City/Plot Sache erinnert mich ein wenig an object-relational-mapping. Eventuell kannst du dich an ORM Bibliotheken orientieren was das Design angeht?

Ich denke von der Perspektive eines Endnutzers der Klassen waere es am sinnvollsten wenn man gar nicht erst durch einen Manager gehen muss um z.B. den Owner eines Plots zu bekommen. D.h. dass die Plot Klasse direkt eine getOwner Methode bietet die eine User Instanz zurueck gibt. Dazu muesste die Plot Klasse dann natuerlich die Manager kennen und beim erstellen uebergeben bekommen.

Aber ich denke damit wuerdest du in der Spiellogik viele der Abhaengigkeiten auf die Manager Klassen los werden.

GlowDragon

Frischling

  • »GlowDragon« ist der Autor dieses Themas

Beiträge: 66

Wohnort: Bayern

Beruf: Informatikstudent

  • Private Nachricht senden

9

21.01.2015, 17:39

Jetzt weiß ich, wie man das Konzept nennt, das ich anwende. ^^

Zuerst war ich sketpisch, eine Referenz zum Manager in jede Plot-Instant zu packen, aber gerade hab ich mal recherchiert, wie viel Speicher eine Referenz verbraucht: Nur 4 oder 8 Bytes, jenachdem ob es sich um ein 32-Bit- oder 64-Bit-System handelt. Ich mach mich gleich an die Umsetzung.

Vielen Dank für die Antworten! :)

Werbeanzeige