• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

Mehrere oder nur ein Event

D

Dakir

Guest
Hallo zusammen,

ich habe da eine Frage bezüglich Spigot/Bukkit Plugin.
Nehmen wir an ich würde gerne ein komplettes Server System selbst programmieren,
1. ...wäre es sinnvoll dies in mehreren kleinen Plugins zu schreiben oder besser in einem einzigen Plugin?
2. ...wäre es sinnvoll nur ein Event zu benutzen oder macht das keinen Unterschied bezüglich der Performance wenn ich zum Beispiel für verschiedene Dinge immer ein extra ChatEvent nehme?

Würde mich über eure Meinungen freuen.

Mit freundlichen Grüßen
Dakir
 

ES-Henne

Redstoneengineer
Registriert
3 Oktober 2017
Beiträge
41
Diamanten
0
Mir geht aus deinem Beitrag nicht klar hervor, was du mit "Server System" genau meinst. Meinst du nun eine eigene Serversoftware, ein Administrationstool, ein System für einen Spieltyp, ...
Wir gruppieren die Funktionen in Plugins. Alles was zusammen gehört, kommt in ein Plugin rein.

Das dürfte kaum einen Unterschied machen.
Wir fangen das Event in nur einer Methode ab und rufen dort die anderen Methoden auf. Dadurch steuern wir die Events zentral.
 
D

Dakir

Guest
Tut mir leid war etwas ungenau erklärt.
Meine damit ein Plugin was alles macht was ich für mein Server Konzept brauche,
dazu gehören auch die Basicbefehle von essentials zum Beispiel.

Das heißt also in den Event Methoden wird nicht viel gemacht sondern direkt eine andere Methode aufgerufen welche dann alles andere für sich macht.
 

ES-Henne

Redstoneengineer
Registriert
3 Oktober 2017
Beiträge
41
Diamanten
0
Alles was Allgemein ist und getrennt vom anderen genutzt werden kann, ist bei uns extra. Das System für ein Spiel selber würde ich in ein Plugin schreiben. Da das ja zusammen gehört und getrennt nicht funktioniert.

Richtig, darin befinden sich nur Aufrufe für andere Methoden.
 

Baba43

Ehem. Teammitglied
Ehem. Teammitglied
Registriert
5 November 2012
Beiträge
869
Diamanten
60
Minecraft
baba43
Jeder halbwegs erfahrene Softwareentwickler wird dir davon abraten, die eierlegende Wollmilchsau zu programmieren. Wer schon einmal sowas gebaut hat, weiß auch ganz genau warum. Wer nicht, sollte einfach mal 10 Minuten logisch darüber nachdenken, wie sinnvoll sowas ist bzw. wo die Nachteile liegen. Ich helfe da gerne auf die Sprünge:
  1. Das Plugin wird früher oder später Abhängigkeiten haben und jeder, der an dem Plugin arbeiten oder es nutzen will, muss dann ebenfalls alle Abhängigkeiten korrekt installieren (z. B. muss man ein Economy-Plugin installieren, bloß um eine Broadcast-Funktion zu testen)
  2. Um das obige Problem zu umgehen, fängt man damit an, bestimmte Funktionen an- und abschaltbar zu machen. Vielleicht kommt man sogar auf die grandiose Idee, das Plugin modular aufzubauen. Spätestens jetzt fällt auf, dass man diesen Ansatz von Anfang hätte verfolgen sollen, aber jetzt ist es zu spät, also arbeitet man mit dem Misthaufen weiter
  3. In Minecraft äußert sich das obige Problem vor allem dann, wenn es mehrere Welten/Server gibt, auf denen nicht zwangsläufig dieselben Module aktiv sind. Dann ist überall dasselbe Plugin drauf, aber mal ist die Hälfte aktiviert, mal ist sie deaktiviert usw. Irgendwann fängt man dann automatisch an, das zu tun, was man von Anfang an hätte tun sollen
  4. Niemand kann an dem Systems arbeiten, ohne Zugriff auf alles zu bekommen
  5. Eine Fehlfunktion des Plugins kann dazu führen, dass auch alle anderen Module nicht mehr funktionieren
  6. Irgendwann wird das Projekt zwangsläufig unübersichtlich und unkontrollierbar. Keiner traut sich mehr, irgendwas anzupassen, weil man nicht weiß, was da womöglich noch alles dran hängt. Von der Idee, irgendwas davon mal neu zu entwickeln, kann man sich natürlich auch verabschieden, weil alles fest verdrahtet ist. Wäre es das nicht, hätten wir einen modularen Aufbau und sind wieder bei (2)
  7. ...
Ok, bevor ich damit weiter mache, kann man sich jetzt natürlich fragen, was das denn für Vorteile hätte?
  1. Man spart sich das Anlegen neuer Projekte (also 1-2 Minuten)
  2. Modularität erfordert ggf. mehr Code (der sich erst später auszahlt)
  3. Modulare Softwareentwicklung erfordert Erfahrung (die bei den meisten nicht gegeben ist)
Aber um das mal abzukürzen hier meine Empfehlung: Für jedes Feature des Servers, das als eigenständiges System betrachtet werden kann, sollte es ein Plugin geben, das nur mit den Systemen verbunden ist, die es zwingend braucht (z. B. Homes, Warps, Votes, Geld, Chat, Grundstücke, ...). Um ein Wirrwarr an Abhängigkeiten zu vermeiden, kann man APIs entwickeln, die dann von den einzelnen Systemen genutzt werden. Kleinere Befehle kann man in einem Plugin sammeln, allerdings nur solange, wie diese nicht irgendwelche neuen Abhängigkeiten ins Spiel bringen.

Jedes Plugin bzw. jedes System sollte auf jeden Fall die Events eigenständig behandeln, denn sonst zerstört man alle Vorteile, die Events bieten, allen voran die Modularität. Was glaubst du, wofür es Prioritäten gibt und warum Events als abgebrochen markiert werden können? Auf gar keinen Fall sollte ein EventHandler für verschiedene Systeme genutzt werden, weil es im Normalfall nur Nachteile bringt. Wenn man an den vorhandenen Schnittstellen vorbei programmiert, macht man sich das Leben in Zukunft nur schwerer.

Performance ist übrigens nur eine von vielen Anforderungen an ein Softwaresystem. Programmieranfänger hängen sich gerne daran auf (weiß ich selbst sehr gut), auch wenn der potenzielle Gewinn so gering ist, dass er wahrscheinlich niemals zum Tragen kommt (gerade in Bukkit/Spigot entstehen Performance-Probleme ganz woanders). Die Hardware kann man skalieren und die wird ohnehin von selber besser, aber die Steine, die man sich durch unverständliche und schlecht wartbare Software ans Bein gebunden hat, wird man nicht so einfach wieder los.
 
Zuletzt bearbeitet:
D

Dakir

Guest
Ich habe in meinem Plugin zum Beispiel eine Klasse die ein Event abfängt und in diesem Event wird eben alles
gemacht was von meinem Plugin gemacht werden muss.
In einem InventoryClick Event wird zum Beispiel aus allen Kisten Inventaren alles geregelt, was bei ca. 15 Inventaren sehr unübersichtlich wird, weshalb ich manches gerne trennen würde.
 

BlackHole

Workaholic
Registriert
1 Juli 2012
Beiträge
752
Diamanten
0
Minecraft
BlackHole
Ich glaube dann ist es besser in einer Eventbehandlung das Inventar zu bestimmen und den zuständigen Code in einer anderen Klasse aufzurufen. Recht effektiv ist es, die Instanz des Inventars in der jeweiligen Klasse zu speichern statt das Inventar z.B. am Titel zu erkennen.
 
F

Figz

Guest
Ich glaube dann ist es besser in einer Eventbehandlung das Inventar zu bestimmen und den zuständigen Code in einer anderen Klasse aufzurufen. Recht effektiv ist es, die Instanz des Inventars in der jeweiligen Klasse zu speichern statt das Inventar z.B. am Titel zu erkennen.

Diese Aussagen stimmt zwar, macht den Code aber nicht zwingend übersichtlicher.

Ich habe in meinem Plugin zum Beispiel eine Klasse die ein Event abfängt und in diesem Event wird eben alles
gemacht was von meinem Plugin gemacht werden muss.
In einem InventoryClick Event wird zum Beispiel aus allen Kisten Inventaren alles geregelt, was bei ca. 15 Inventaren sehr unübersichtlich wird, weshalb ich manches gerne trennen würde.

Ich würde wie Blackhole schon sagte, wenn möglich die Referenz zu dem Inventar speichern und anhand dieser dann bestimmen, ob es das richige Inventar ist (Wir gehen einfach mal davon aus, dass du es bisher über den Namen gemacht hast :p)

Dann würde ich einfach für jedes Inventar einen Eventhandler bauen.Ob du dies in einer Klasse mit mehreren Handlern machst oder du für jeden Fall eine eigene Klasse erstellst ist dir überlassen. Ich würde jedoch dafür mehrere Klassen erstellen(PlayerClickInventoryAListener, PlayerClickInventoryBListener => Natürlich hier sprechende Namen verwenden).

So musst du nicht lange in deinem Code suchen und weißt sofort, wo welches Inventar behandelt wird.

Wie Baba43 schon geschrieben hat.. Genau dafür sind Events gemacht. Ich könnte mir sowieso vorstellen, dass du auch nach mehreren Prüfungen erst feststellst, ob das Event gecancelt werden sollte oder nicht, somit müsstest du das Event ständig an die Methode übergeben oder einen
Wert an deinen EventHandler zurückgegeben, der dann bestimmt ob das Event gecancelt wird oder nicht.

Also nochmal zusammengefasst:
- Für jeden Fall mit dem du Arbeitest eine Klasse: PlayerClickShopInventory, PlayerClickPremiumInventory
- Wenn möglich mit der Referenz abfragen
- Ist es nicht das richtige Inventar für diesen EventHandler dann mit "return" raus.

So kannst du den Code auch recht übersichtlich gestalten:

Code:
public class PlayerClickShopInventory implements Listener
{
  private Inventory beispielReferenz;

  @EventHandler
  public void onClick(InventoryClickEvent event)
  {
    if(event.getClickedInventory() != beispielReferenz)
    {
      return;
    }
    // Hier der Code, falls es das richtige Inventar ist
  }
}

Hätte da noch eine Frage.
Macht es also Performance-technisch keinen großen Unterschied wenn ich in einem Plugin ein Event mehrfach aufrufe?

Achtung! Unterschied zwischen aufrufen(auslösen) und behandeln eines Events!
 
Oben